I2C协议

1. 简介

      I2C (Inter-Integrated Circuit),是一种串行通信总线,用于连接微控制器及其外围设备,实现主控制器和从器件间的主从双向通信,是一种同步半双工通信(两端时钟频率一致,双向通信,但不能同时进行数据收发)。

2. 原理

      I2C通信属于串行通信,具有两根串行信号线:数据线(SDA),时钟线(SCL)。如下图所示,主控制器与从器件(一个或多个)都通过两根信号线连接,信号线上主机和从机都可以扮演发送器和接收器的角色。为确保传输过程的指向准确性,每个接到I2C总线上的器件都有唯一的地址(7位从器件专用地址码),可实现制定从机的定向传输与群发传输。
I2C协议

2.1 信号类型

      同时,为确保传输稳定,所有连接在同一I2C总线上的设备共用一个时钟。I2C 总线在传送数据过程*有以下几种类型信号:
(1) 开始信号/结束信号

  • SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
  • SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
    I2C协议
    I2C协议

(2) 应答信号/非应答信号

  • IIC 总线协议规定,每传送一个字节数据后(8bit),都要有一个应答信号以确定数据传送是否被对方收到。即一个字节传输的8个时钟过后的第9个时钟期间,接收器必须回一个ACK应答信号给发送器,这样才能进行数据传输。
  • 应答信号由接受设备产生,在SCL为高电平期间,接受设备将SDA拉低为低电平,表示数据传输正确,产生应答(ACK),SDA拉高则表示数据传输失败,产生非应答位(NACK)。
    I2C协议

(3) 闲置状态/被占用状态

  • 在主机发送起始信号后,且未发送终止信号期间,总线处于被占用状态。
  • 发送终止信号后,总线处于闲置状态,SCL与SDA同时为高电平。
    I2C协议

2.2 总线读写流程

      I2C总线进行数据传送时,SCL时钟信号为高电平期间,SDA数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。 当一个字节按数据位从高位到低位的顺序传输完后,紧接着从机将拉低SDA线,回传给主设备一个应答位ACK, 此时才认为一个字节真正的被传输完成 ,如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。
I2c总线写通信过程:

  • 主机在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
  • 发送一个地址字节(8 bit),其中bit0-6位为从机地址,存放从机唯一地址;bit7位为读写位(R/W),0表示write主机 ->从机,1表示read 从机->主机;
  • 主机发送地址时,总线上每个从机都会将7位地址与自己的地址进行比较,若相同,则将匹配成功,发送应答信号(ACK),确定发送器和接收器;
  • 主机收到ACK后开始发送第一个字节(Command),对应从机中要写入的寄存器;
  • 从机接收到Command后,从机发送ACK;
  • 主机收到ACK后开始发送第一个数据字节:bit0-7(8bit数据,高到低),从机收到数据后,发送应答ACK;
  • 继续发送数据,n帧;
  • 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;
    *ps 丛机寻址方式除了常规的7位寻址外,还有10位寻址方式,通过两个字节发送,并在第一个字节高位添加固定标志数据以坐区分寻址方式。
    I2C协议
    I2c总线读通信过程:
  1. 主机产生START信号,随后发送从机地址(7bit)+0(Write);
    *方向仍然是写,待接收到从机发送的ACK应答后,配对成功。
  2. 主机接收到ACK后,发送8bit内存地址(Command对应从机相应寄存器地址),从机接收到后,内部寻址并提取数据,返回ACK;
  3. 主机接收到ACK后,重新产生START信号,再一次发送从机内存地址,(7bit)+1(Read),从机接收到后返回ACK;
    *方向设置为读,主机设置为接收模式
  4. 主机接收到ACK后,做好接收从机信息的准备,现在即可接收1bit的数据。
    *主机不向从机发送应答信号,接收完毕后直接发起终止信号。
  5. 主机接收全部数据后,产生STOP信号,终止通信,总线变为闲置状态。
    I2C协议

3. 应用实例:I2C控制温感IC

以温度传感器MAX1617A为例,对照手册可查找到以下数据:

  • Command 寄存器对照表如下,可根据Command表查找从机对应寄存器地址。
    I2C协议

  • 温度数据返回格式如下所示:I2C协议

通过以上数据,我们即可有思路,对照写入读写过程:

  • 写入时,输入Command 使用: 0x0B,0x0C 写入温度上限与下限值;
  • 读取时,输入Command使用:0x00,0x05,0x06 读当前温度,与前面设置的温度上限与下限值;

逻辑分析仪数据采样如下所示:

  • 写入过程:
    I2C协议
    0x30为 从机地址0x18<<1 + 读写位(0);
    0x0B为 Command,对应从机寄存器存放地址;
    0x00位 将写入的数据;
    波形如下所示:
    I2C协议
    I2C协议
    I2C协议
  • 读取过程:
  1. 读当前温度
    I2C协议
    读过程中,方向先为写入,后为读取
    0x31,为 从机地址0x18<<1 + 读写位(1);
    0x1A,为返回温度值,换算得到正好是小编当前温度26度。
    I2C协议
    I2C协议

  2. 读温度上限:

       I2C协议
       I2C协议

       I2C协议

3.读温度下限:
       I2C协议
       I2C协议

       I2C协议

I2C协议

上一篇:使用useReducer 实现 todoList


下一篇:JS 格式化日期