几根线:2根,一根SCL为时钟,一根SDA为数据线
通信速率:标准模式100Kbps,快速模式400 Kbps,高速模式3.4 Mbps(有些从机不支持高速模式)
从机地址:7位或10位。大多是7位,那么一个字节是8位,留一位干什么?最低位bit0 用来表示读写操作。
如何读写:发送地址的时候,最低位为0表示要进行写,最低位为1表示读取。
起始和结束信号:起始信号:SCL为高时SDA由高变低。
结束信号:SCL为高时SDA由低变高。
两个信号都由主机产生。
ACK和NACK: 是应答信号,由从机产生。
何时取数据:在SCL为高的时候取数值,此时SDA为低是数据“0”,为高是数据“1”。
数据传输:主从设备以字节(8位)进行传输
读写时序:如下图
收发数据:如下图为读写一个字节和多个字节的时序图
示波器抓取读操作:我的从机地址为0x3A,我要读取从机设备的芯片ID,其中芯片ID存储在从机设备内部寄存器地址0x00中。这个芯片的ID是0xC7。如图,每一个bit数据都严格符合上图读写时序图
示波器抓取写操作:我的从机的地址是0x3A,要向从机的0x04寄存器写入一个字节数据0x03,下图为抓取到的时序信号,并分析获取二进制的每一位:
补充:为何会出现极短脉冲和半高电平?
一般链路上IIC信号:
在ACK位有时候会出现一个小脉冲,不过这个脉冲出现在时钟的低电平,不会对IIC时序判决有影响。
为什么会出现这个脉冲呢?
ACK位一般标志着主机和从机对总线控制权的转换:
1、主机为发送端发送地址位,从机为接收端接收地址位;
2、主机发送写信号,需要往从机写数据;
3、从机接收到信号,响应,在这一个bit位,主机释放总线变为接收端,从机变为发送端获取总线控制权。之后再将控制权交还给主机,用于后面的写操作,这个交换的过程存在时间差,主机拉SDA晚了,就有可能出现上面这种情况(理论上讲,前一次交换也可能出现这种现象;如果是读操作,一般就观察不到这种现象了)。
ACK响应位出现半高电平
那下面这种情况又是为啥呢?
这种情况说白了就是IIC链路上的器件接口不是纯粹的OD/OC,一般多出在可编程器件上,比如说MCU,CPLD。如果IIC总线上挂了多个器件,在ACK位的时候,有器件管脚没有配置为OD或者OC,导致芯片内部将该管脚拉高,此时链路上其他的器件又需响应想拉低总线,如果两边链路上都存在串阻,则通过电阻分压会出现中间电平;如果没有串阻,或者串阻过小,则可能烧坏器件(灌电流)。总之非常危险,这个半高电平可能出现在任何位置,只不过ACK位容易被忽视,更容易出问题。
IIC的接口是OD/OC结构,因此其本身无法输出高电平。不接外部上拉就只能输出低电平,所以设计的时候千万记得把上拉电阻给留上;
补充部分转自https://blog.csdn.net/Nightya/article/details/105454785?spm=1001.2014.3001.5506