STM32F1学习——I2C通信
一、I2C通信一带多
在学习通信的时候,我们常会听到串口通信。但串口通信只限定两个设备之间,如果有多个设备,通信的两个设备就要连接上,接线复杂。所以有了总线式通信,在一条总线上可以连接多个设备,这些根据地址的不同,接收总线上不同的消息。
二、硬件电路设计
在I2C总线上,SCL和SDA必须都配置成开漏模式,此模式下相当于GPIO可以通过MOS管下拉到地,另一个模式是浮空模式(下图右侧),但I2C外部通常会接上两个4.7kΩ的上拉电阻,可以弱上拉到高电平。此设计的好处不仅实现了防止当时序错乱时的电源短路现象,同时实现了线与功能。
在一主多从模式中,主机拥有对SCL绝对的控制权,同时主机主机控制SDA,从机只有在得到主机允许的情况下才能使用SDA数据总线。
三、时序基本单元
1、起始和终止条件
起始条件:在SCL处于高电平时,主机将SDA拉低的时候,从机检测到数据线SDA下拉做好了接收信号的准备,等待SCL的上升沿。
终止条件:在SCL处于高电平时,主机将SDA拉高的时候,从机检测到数据线SDA的上升沿,并识别出这就是终止信号。
2、主机发送一个字节Byte = 8 * bit
传输数据过程中,在SCL高电平期间不允许SDA有数据变换,不然就会误检测为起始或终止条件。
在传输数据时,SCL先处于低电平,此时可以修改SDA的值,主机将数据位依次放到SDA线上(高位先行),然后释放SCL则SCL被拉高,产生上升沿,此时从机获取上升沿并读取SDA上的数据,
3、接收一个字节Byte = 8 * bit
与发送一样,只不过这里变成了从机来发送数据。值得注意的两点是:
① 主机在接收数据的时候要放手SDA,即让SDA弱上拉至高,正常来说SDA只在自己发数据的时候才主动拉低。
② 此时仍然是主机有SCL的控制权,从机不能使用SCL。也就是说从机需要再SCL的下降沿将来时将SDA的数据准备好,以便主机可以在SCL高电平的时候读取到。
4、应答机制
在主机发送完一个字节(8bit)后,主机要确定从机收到没有,就会采用接收应答下图右侧,发送完一个字节后,主机会主动释放SDA,从机如果有人收到了就拉住SDA导致他不会变为高电平,表示从机收到了。
在主机处于接收完一个字节(8bit)消息的时,会将SDA拉低,表示从机可以继续发送,如果主机没有拉低,则从机会将SDA控制权还给主机,当传输多个数据时,我们要将最后一个字节的应答位设置为高,不然从机不会将SDA的控制权交还给主机。
四、I2C写入读取的全部时序
参考
[10-1] I2C通信协议_哔哩哔哩_bilibili
4分钟看懂!I2C通讯协议 最简单的总线通讯!_哔哩哔哩_bilibili