I2C 信号的上升时间和下降时间一般要求都小于<300ns (上拉电阻过大,总线电容过大,均会增大该时间)
I2C的时钟可能被从设备拉低,从示波器看好像主少发了时钟,实际是从设备拉低,这时候主设备最好检查时钟信号变高后,再发时钟信号脉冲!
(问题:主发第九个时钟未检查总线,此时从设备把SCL拉低《此时从设备正在做相应数据处理,所以拉低总线》,导致ACK应答失败,从示波器看好像少发了第九时钟;方法发第九个时钟的时候检查SCL电平,发现它变高后,才发第九个时钟)
I2C主和从通信异常
原因:主模拟写,从由于准备数据原因拉低了SCL,而主没有判断SCL,继续发送数据导致错误。
从准备(即拉低SCL):可能在字节和字节之间,也可能在回ACK的时候
解决方法:主在SCL=1时,后面判断SCL是否为高,如果不为高则超时等待判断
示波器带I2C模块--设置好触发电平,默认1.4V,有事件保存功能,可将I2C数据自动保存在excel中
I2C 速率有三种模式
1.标准模式 100kbit/s
2.快速模式 400Kbit/s
3.高速模式(HS) 3.4Mbit/s
Hs模式的串行数据传输格式符合标准模式i2c总线规范。日s模式只能在下面的情况下(所有都在F/S模式)启动:
1.起始条件(S)
2.8位的主机码(00001XXX) --- I2C地址不能为主机码,不能瞎设置
3.不响应位(A)
I2C广播地址为0x00
当总线空闲,SDA,SCL均为高电平
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA被用来传递数据。
一次典型的 I2C数据传输包括一个起始条件 START,一个地址字节(位 7-1: 7 位从地址;位0 R/W方向位),一个或多个字节的数据, 一个停止条件STOP .
所有的数据传输都由主器件启动
主器件发送数据:
主器件产生一个起始条件,然后主器件发送地址和方向位(共一个字节,位0 W),等待来自从器件的确认(ACK)
如果本次数据传输是一个从主器件到从器件的写操作,则主器件每发送一个数据字节后,等待来自从器件的确认(ACK);最后主器件发送停止条件
Start() -> Write(addressDir) -> GetAcK() -> Write(data1)-> GetAcK().... Write(datan)-> GetAcK() Stop();
主器件接收数据:
主器件产生一个起始条件,然后主器件发送地址和方向位(共一个字节,位1 R),等待来自从器件的确认(ACK)
如果是一个读操作则由从器件发送数据并等待主器件的确认(ACK),但主器件获得最后一个数据时候,主器件发送不回应(NOACK),最后主器件发送停止条件.
Start() -> Write(addressDir) -> GetAcK() -> Read(data1)-> AcK().... Read(datan)-> NAcK() Stop();
应答:也称为ACK,接收器件发送该信号表示确认。例如,在器件X收到一个字节后,它将发送一个ACK确认传输成功。ACK条件是在SCL为高时采样到SDA为低电平。
非应答:也称为NACK,这是在SCL为高电平时采样到SDA为高电平。当接收器件不能产生ACK时,发送器件看到的是NACK。在典型的数据传输中,收到NACK信号表示所寻址的从器件没有准备好或不在总线上。一个处于接收状态的主器件发送NACK表示这是传输的最后一个字节。
I2C特殊地址