关于I2C协议的理解
1、介绍
I2C是一种双向、二线制、同步、半双工串行总线。
I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。
2、时序理解
空闲:SCL和SDA都为高电平。
起始条件:SCL为高电平时,SDA由高电平到低电平。
停止条件:SCL为高电平时,SDA由低电平到高电平。
数据位:只有在SCL为低电平时才能改变SDA,在SCL为高电平时需要保证SDA的稳定。
地址位:一般前4位是器件本身固定的,5-7位可以选择,最后一位是读写位,0写1读。
字节格式:发送到SDA线上的每个字节必须为8位,每次传输可以发送的字节数量不受限制,首先传输的是最高位。
应答信号:一个字节数据传输完毕时,Master在第9个脉冲前把SDA拉高然后释放总线,Slave在接收到数据后,把SDA拉低以发出ACK信号,Master读取到SDA线上被拉低,则说明数据传输成功。
注意:并非每一次字节传输完成后都会有ACK信号,以下三种除外。
- 当Slave无法响应Master发送的地址时,在第9个SCL周期内没有拉低SDA,即没有ACK信号,此时主机会发送一个Stop信号来结束此次传输或者发送Start信号重新开始传输。
- 如果Slave在传输过程中不能接收更多的数据时,它也不会发出ACK标志,这样Master在接收不到ACK标志的时候,会发出一个Stop信号来结束此次传输或者发送Start信号重新开始传输。
- 主机接收器在接收到最后一个字节后,不会发出ACK信号,从机释放SDA线,以允许主机发送Stop信号来结束传输。
5、关于从机接收的问题
如果一接收器件在完成其他功能(如一内部中断)前不能接收另一数据的完整字节时,它可以保持时钟线SCL为低,以促使发送器进入等待状态,当接收器准备好接受数据的其它字节并释放时钟SCL后,数据传输继续进行。
6、注意
① 起始信号和终止信号都是由主机发出的,在此时从机仅处于空闲状态。当起始信号产生后,总线就处被占用的状态,在终止信号产生后,总线又回到了空闲状态。
② 主机完成一次通信后还想继续占用总线在进行一次通信,而又不释放总线,就要重新发送起始信号,它既作为前一次数据传输的结束,又作为后一次传输的开始。
③ 在特殊情况下,若需禁止所有发生在I2C总线上的通信,可采用封锁或关闭总线,具体操作为在总线上的任一器件将SCL锁定在低电平即可。
④当写数据的时候,Master每发送完8个数据位,Slave设备如果还有空间接受下一个字节应该回答“ACK”,Slave设备如果没有空间接受更多的字节应该回答“NACK”,Master当收到“NACK”或者一定时间之后没收到任何数据将视为超时,此时Master放弃数据传送,发送“Stop”。