常识
- 两条总线线路:串行数据总线SDA,串行时钟总线SCL
- 每个连接到总线的器件都有唯一的地址供其他设备寻址
- 每个连接到总线的器件都可以作为发送器和接收器
- 是多主机总线,如果两个或更多主机同时初始化,数据传输可以通过重提检测和仲裁防止数据被破坏
- 串行的8bit双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s
- 连接到相同总线的I2C数量只受到总线的最大电容400pF的限制
- I2C通信的数据以8bit为单位,每次发送完一个数据都要等待接收方的ACK信号
术语
- 发送器:发送数据到总线的器件
- 接收器:从总线接收数据的器件
- 主机:发送起始/终止信号和时钟信号的器件
- 从机:被主机寻址的器件
- 仲裁 :是一个在有多个主机同时尝试控制总线但只允许其中一个控制总线并使传输不被破坏的过程
- 同步:两个或多个器件同步时钟信号的过程
- SDA:数据线通信期间,SDA的电平改变只能发生在SCL在低电平期间
- SCL:时钟线
起始与终止
通信的起始条件和终止条件都必须在SCL是高电平的时候被触发,SCL为高SDA由高->低为起始条件(S,start),SCL为高SDA由低->高为终止条件(P,stop)
正是因为正常通信的过程中如果SCL是高电平,SDA不允许改变,所以这两种情况可以用来标识S和P
总线在start后被认为处于忙碌状态,在stop的某段时间后总线被认为再次处于空闲状态
除了S作为起始信号,I2C还有重启信号Sr,如果在处于忙碌状态的总线中发送Sr(restart)而不产生P(stop),总线会一直处于忙碌的状态。Sr的作用是保证一个主机不间断的占用总线,它既是前一次数据传输的结束,又是后一次数据传输的开始,可以用来保证一台主机不间断的掌控总线。eg:主机发送了读请求之后,从机进行了应答,接下来还有随之而来的写请求,为了主机的读写操作能连贯的执行完毕再释放总线,此时就需要Sr来保证该主机不间断掌控总线,因为一旦在读之后发出停止信号,总线就有可能被其他主机掌管,该主机的写操作就会被延迟。
寻址
主机首先检测总线是否处于空闲状态,如果空闲就首先发送一个从机地址(MSB)+控制位(LSB)。7位寻址的话就是1111 XXX
,高4位属于固定地址不可改变,如果器件没有CPU,则由厂家固化,有CPU的话就由器件的初始化代码指定(注意不能和总线上其他器件的地址重叠),低3位为引脚设定地址,可以由外部引脚来设定(并非所有器件都可以设定)。控制位即0
表示主机会写W
信息到从机,1
表示从从机中读R
数据。和其他数据一样,主机发完这个byte继续产生一个时钟周期,并释放SDA为高阻态(I2C的SDA和SCL都需要上拉电阻保持高阻态),等待从机的ACK信号。
应答
一个主机设备发送了希望读写的设备地址到总线之后,总线上的所有器件都会收到一个主机发送的地址并与自身比对,如果与自身的地址相同,表示自己就是主机打算通信的对象。接下来从机可以有三种行为:ACK,NACK,拉低SCL。
ACK就是从机在第9个时钟周期将SDA电平拉低,表示从机成功的接收了刚才的8bit数据,主机收到了从机的ACK信号就可以继续发数据,或者准备好接收从机的数据。
NACK就是从机在第9个时钟周期不响应,表示从机没有成功的接收到刚才的8bit,主机接收到这个信号就可以发送Sr或采取其他行为。如果最后一次通信中主机是接收方,主机就会回应一个NACK信号(不响应)通知从机表示通信结束,并发送P或Sr。
如果从机没有准备好应答,就可以将SCL钳位在低电平,这样就可以使主机进入等待状态,直到从机准备就绪接收接下来的数据再释放SCL,通信就可以继续了。