IIC(Inter-Integrated Circuit)集成电路总线是飞利浦公司开发的一种两线式、串行、半双工同步通信二线,可以挂载多个参与通信的器件,每个器件都有自己的地址,常用于板内通信,比如单片机与外围芯片之间短距离、低速的信号传输。
IIC协议一般使用2条信号线通信 分别为数据线SDA、时钟线SCL,发送一个字节是以高位先发送原则(MSB),看之前我们先始终记得SCL为高电平时的SDA数据才是有效的,且SCL的控制始终由主机(发送器)控制。
我们这里以主机的视角来阐述过程
1、空闲状态:SCL:高电平、SDA:高电平。
2、起始位(起始条件):SDA从高电平到低电平的下降沿为起始位,SCL始终为高电平。
3、地址段(从设备地址位):接收器会在SCL的每次高电平时记录一次SDA的电平,所以得注意此时数据线的信号得稳定,只有在SCL为低电平期间,SDA的电平状态才允许变化,即SDA数据的电平状态需在SCL的上升沿到来之前就需准备好。并在下降沿到来之前必须保持不变,确保SCL在整个高电平周期中SDA的电平始终不变。共7位。
4、读写位(方向位):低电平表示写数据,高电平表示读数据,大多数从设备的设备地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向,即读写位,这样恰好组成8位一个字节。(同理,SCL的每次高电平时记录一次SDA的电平)
5、应答信号(应答位):
应答信号为低电平时,规定为有效应答位(ACK),表示接收器已经成功地接收了该字节;
应答信号为高电平时,规定为非应答位(NACK),表示接收器接收该字节没有成功。
发送器会先将SDA设为高电平,这样SDA总线默认为非应答状态,随后发送器将SCL拉为高电平,此后发送器一直读取SDA的电平,若接收器要进行有效应答则其会将SDA又拉为低电平,否则超过一定时间后发送器视为非应答。
发送器每发送一个字节后(8个bit),由接收器回复应答信号。此外,发送器在读取最后一个字节后,也可以发送一个NACK信号,以通知接收器结束数据发送,并释放数据线SDA。
6、数据段(有效数据位):接收器/发送器会在SCL的每次高电平时记录一次SDA的电平。若发送器发送数据,则要在将SCL拉高前设置SDA电平,接收器将在SCL高电平稳定期间读取SDA的电平;若发送器接收数据,则在将SCL拉高后直接读取SDA的电平;
7、停止位:SCL和SDA的初始电平均为低电平,先将SCL拉高,SCL高电平保持期间SDA从低电平到高电平的上升沿为停止位。
IIC协议完整写操作
IIC协议完整读操作
对于STM32的硬件I2C,如果使用单独的硬件I2C,或者中断里面优先级最高,或者没有多任务,多操作的话,ST的硬件I2C工作的很完美,但是多任务多操作之后,使用DMA的I2C有时候也是很完美,但是这只是个表象和开始,会有很多意想不到的问题出现,大家慎用。