理论
1.I2C外设简介
STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担
支持多主机模型
支持7位/10位地址模式
支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)
支持DMA
兼容SMBus协议
STM32F103C8T6
硬件I2C资源:I2C1、I2C2
2.I2C框图
与串口通信的工作原理一样
TXE(Transmit Data Register Empty)
- 功能:TXE标志位指示发送数据寄存器是否为空,意味着发送缓冲区可以接受新的数据进行发送。
- 状态解释:
- TXE = 1:发送数据寄存器为空,可以将新的数据写入数据寄存器进行发送。
- TXE = 0:发送数据寄存器仍在发送数据,不能接受新的数据。
使用场景:
- 在发送数据时,程序通常会检查TXE标志位,以确保在尝试写入数据寄存器之前,寄存器处于空状态。这样可以避免数据丢失或覆盖。
RXNE(Receive Data Register Not Empty)
- 功能:RXNE标志位指示接收数据寄存器中是否有接收到的数据,意味着有数据可供读取。
- 状态解释:
- RXNE = 1:接收数据寄存器中有数据,数据可以被读取。
- RXNE = 0:接收数据寄存器为空,没有接收到新的数据。
使用场景:
- 在接收数据时,程序通常会检查RXNE标志位,以确保在尝试读取数据寄存器之前,寄存器中有有效的数据。这样可以避免读取无效或过时的数据。
实际操作示例
发送数据的过程:
- 检查TXE标志位:
- 在向数据寄存器写入数据之前,检查TXE标志位是否为1,确认数据寄存器为空。
- 写入数据:
- 如果TXE标志位为1,写入数据到数据寄存器(通常是USART_DR寄存器)。
- 等待发送完成:
- 数据写入后,TXE标志位会被清除(变为0),发送完成后标志位会重新置为1。
接收数据的过程:
- 检查RXNE标志位:
- 在从数据寄存器读取数据之前,检查RXNE标志位是否为1,确认接收数据寄存器中有数据。
- 读取数据:
- 如果RXNE标志位为1,从数据寄存器(通常是USART_DR寄存器)读取接收到的数据。
- 处理数据:
- 数据被读取后,RXNE标志位会被清除(变为0),接收数据寄存器会准备好接收新的数据。
总结
- TXE:用于指示发送数据寄存器是否准备好接收新的数据进行发送。
- RXNE:用于指示接收数据寄存器是否有新接收的数据可供读取。