I2C总线知识

来源:互联网 发布:知乎 公学 编辑:程序博客网 时间:2024/06/06 06:04

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特殊地址

0 0
原创粉丝点击