iic(i2c)协议简介

发布时间 2023-05-07 22:33:54作者: ZhangCheng2020

近来了解了下iic总线协议,记录下知识点

+++++

Q: 什么是iic协议?
A: iic协议是NXP研发的半双工串行总线协议,只有两条总线就可连接多个设备,两条总线分别是sda(串行数据)和scl(串行时钟),具有上拉电阻,使得总线空闲状态下sda和scl上都是高电平。

+++++

Q: iic协议有什么特点?适合什么场景?
A: iic协议结构简单可靠,属于半双工,支持多master和多slave设备,连接到总线上的模块都必须有开漏极或开集电路。基本速率100kbit/s,具有快速模式和快速plus模式,还具有高速模式(HS)可达3.4Mbit/s,适合作为片内低速总线进行通信,或链接mcu和外围设备。

+++++

Q: iic总线支持多少位的地址位宽,多少位数据位宽?
A: iic最低支持7bit的地址位宽,最多支持10bit的地址位宽,并且是面向字节流的串口协议,因此数据要求以8bit(帧)的形式进行发送。实际上7bit位宽的iic总线最多并不是支持128个设备,有16个地址是reserved或其他用处,实际是放开了112个普通地址。

 +++++

Q: iic协议的时序结构及信号是怎么样的?
A: iic支持多个master多个slave,当有多个master时,仲裁功能和时钟同步必须实现,这依赖链接到总线上的各个设备,并且总线上的各设备地址是唯一的,读写由控制字节的第8bit控制,正读负写(R/~W),典型的读写步骤是:

————————————————
读操作步骤:

1、master监听总线处于空闲状态,发起一个Start信号(scl为高的情况下,sda从高拉低),紧接着发出1byte的控制信号,包含slave地址,第八位置0表示写;

2、slave收到控制信号后判断是否与自身地址匹配,匹配即紧接着一个时钟发ack信号在sda上,sda置0;

3、master在sda线上写入要读的地址给slave,slave每字节回ack;

4、master写完要读的地址,再发送一个Start信号,同时再次发送1字节的控制信号,此时读写位置1,

5、slave回ack,比对控制信号地址后,明白此时是要读刚写入的相对地址的数据,开始再sda上逐字节发送数据,

6、master后续作为接收者每次会ack,同时控制传输的结束,要结束了回nack(sda置1),并再下一个始终发送End信号。

————————————————

写操作步骤

1、master监听总线处于空闲状态,发起一个Start信号(scl为高的情况下,sda从高拉低),紧接着发出1byte的控制信号,包含slave地址,第八位置0表示写;

2、slave收到控制信号后判断是否与自身地址匹配,匹配即紧接着一个时钟发ack信号在sda上,sda置0;

3、master在sda线上开始写入数据,slave每字节回ack;

4、master写完所有数据后,发送End信号到sda总线上。

_____________________________

 +++++

Q: iic协议10地址是怎么支持的?

A: 通常master在Start信号后跟了一个控制字节,包括7地址+1读写位,在使用10地址时,Start信号后两个byte都是控制信号,第一个byte为1111 0xx+0,xx为10地址的高两位,后续在跟上剩余的8bit地址位数,如果是master要读,同样也是先发写,再发Sr信号,后续跟一个字节的控制信号,为1111 0xx+1,xx为10地址的高两位,这样可以保证只有指定的slave可以完成应答。

+++++

Q: iic协议master是如何工作的?
A: master负责发起传输,结束传输,产生时钟信号。数据的传输字节数是没有限制的,每个字节的串行传输顺序必须的从MSB(最高有效位)先开始,大端序下就是先传输高位bit。

+++++

Q: iic协议的slave是如何工作的?
A: slave负责监听总线上的start和end信号,识别master发来的数据,每收到一个byte就在下个周期回一个ack(拉低sda)表示收到,或者一个nack表示拒绝

+++++

Q: master发送完一个byte后没有收到slave的ack怎么办?
A: master将会在下一个时钟发起一次end结束这次传输,或者重新发起一个start进行重新传输

+++++

Q: iic协议的仲裁是如何实现的?
A: 仲裁是多个master存在时必须实现的,仲裁是在sda上逐位进行,各个冲突的master在sda上边发送数据边监听数据,当某个master首次发送1但监听到0时,他便认为自己失去了总线控制,变放弃总线,监听下一次的end信号,如果master发送的数据一致甚至可以没有差错的在总线上发送完数据。

+++++

Q: 为什么SDA在SCL低电平期间才允许改变状态?
A: 因为当SCL处于高电平状态时,SDA拉低表示的是起始位,拉高表示的是停止位,所以当数据位中0和1出现时,如果在SCL高电平状态下SDA状态变化的话,就无法区分数据和起始、停止位。

+++++

Q: 什么是iic总线的时钟同步?

A:,,,(待补充)

 

参考文献:https://www.cnblogs.com/liujinggang/p/9656358.html