I2C外设
STM32内部集成了硬件I2C收发电路(USART是串口通信的硬件收发电路),可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担。
支持多主机模型(可变多主机)
支持7位/10位地址模式
支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)
支持DMA
兼容SMBus协议(主要用于电源管理系统中)
STM32F103C8T6 硬件I2C资源:I2C1、I2C2
软件I2C比较灵活,硬件I2C效率高。
I2C框图
当数据从数据寄存器移动到数据移位寄存器时,置状态寄存器TXE位为空。接收时候,数据移位级寄存器移动到数据寄存器,置状态标志位RXNE 1,表示接收寄存器非空。
I2C基本结构
使用硬件I2C的时候,两个对应的GPIO口都要配置成复用开漏输出的模式。复用:GPIO口的窗台是交由片上外设来控制的(时钟控制器,数据控制器)。开漏输出:I2C协议要求的端口配置。
主机发送
初始化之后,总线默认空闲,STM32默认是从模式。为了产生一个起始条件,STM32需要写入控制寄存器,CR1中START位写1,就可以产生起始条件,起始条件发出后,可以由硬件清除。控制完硬件之后,就要检查标志位,看有没有达到我们想要的状态。控制寄存器STOP位写1,可以产生停止条件。
主机接收
软件I2C和硬件I2C波形对比
上面是软件I2C ,下面是硬件I2C。
备注:不知道你们对ADDR位清除有没有疑虑。
在发送时候都没有对SR2寄存器进行访问,怎么清除的标志位呢?
带着这个疑问,看一下代码!
可以看到,只要使用这个函数,都会对SR2进行访问,也就满足了清除条件,完美!