因为I2C是同步的,所以相对来说I2C更好用软件来实现,硬件却相对来说没这么好,但是硬件I2C通信也是有其优点的
我们是通过软件写入控制寄存器CR和数据寄存器DR,读取状态寄存器SR来了解外设电路当前处于什么状态,来实现I2C通信的,而我们通过STM32的库函数来实现配置这些寄存器,这些操作就变得更简单了;有了I2C硬件外设的存在,硬件自动实现时序,就可以减轻CPU的负担,节省软件资源,由硬件来做这件事,可以更加专注,时序生成的性能、效率也会更高,这就是I2C外设存在的意义。
I2C外设简介
多主机模型:
1、固定多主机:固定多台机器为主机,只有其中一台主机才可以通过主线控制所有从机,当多个主机控制主线时,会出现主线冲突,这个时候就会进行总线总裁,仲裁失败的一方会让出总线控制权;
2、可变多主机:默认情况下,全部机器都是从机,当某台机器需要控制权时,就会跳出来变成主机,控制主线,多个从机跳出来时,就会进行总线仲裁,仲裁成功的获得总线控制权。STM32的I2C就是可变多主机的模型
I2C框图
引脚定义
I2C基本结构
发送:移位寄存器中的数据由高位到低位先移出去,移8次就可以移一个字节,有高位到低位依次放到SDA线上;
接收:数据从GPIO口从右边依次移进来,最终移8次,一个字节就接收完成了。
配置问题:两个GPIO口都需要配置成复用开漏输出模式,复用——GPIO的状态是交由片上外设来控制的,开漏输出——I2C协议要求的端口配置(在这个模式下依然可以通过GPIO口进行输入)
主机发送
EV-标志位(多个事件发生的标志位)
对应数据手册24.6.7
EV5:(不需要手动清除的)