其他
如何从软硬件层面,理解I2C总线的工作原理
概述
这篇应用笔记的目标是帮助用户理解I2C总线是如何工作的。
图1展示了一个典型的用于嵌入式系统中的I2C总线,其上挂载了多种从设备。作为I2C主机的从微控制器控制着IO拓展、不同传感器、EEPROM、多个ADC/多个DAC、等等。所有这些设备只需要通过来自主机的两根引脚来控制。
1、电特性
1.1 用于双向通讯的开漏极
1.1.1 开漏极拉低
1.1.2 开漏极释放总线
2 I2C接口
2.1 I2C的常用操作
I2C总线的物理接口由串行时钟线(SCL)和串行数据线(SDA)组成。SCL和SDA均需要通过上拉电阻连接到Vcc。上拉电阻的大小由I2C线路上的等效电容大小决定(想要了解更多,可以参考I2C Pull-up Resistor Calculation这份文档,文档号:SLVA689)。数据传送只能在总线空闲时初始化。如果SDA和SCL在一个STOP标志后均处于高电平状态,这时可以认为总线处在空闲状态。
主机访问从机的大体流程如下所示:
假设一个主机想要向从机发送数据: 发送方主机发送一个START标志并且寻址接收方从机 发送方主机发送数据到接收方从机 发送方主机通过发送STOP标志结束传输 如果主机想要从从机接收/读取数据: 接收方主机发送START标志并寻址发送方从机 接收方主机发送需要读取的寄存器地址到发送方从机 接收方主机从发送方从机接收数据 接收方主机通过发送STOP标志结束通讯
2.1.1 START与STOP标志
2.1.2 重复的START标志
2.2 数据有效性与字节格式
2.3 应答(ACK)和非应答(NACK)
在接收方发送ACK位前,发送方必须释放总线。接收方通过在ACK/NACK时钟周期(第9时钟周期)的低电平相位拉低SDA线来发送一个ACK位,如此一来,SDA线将会在ACK/NACK时钟周期的高电平相位保持为低电平。设置与保持时间必须着重注意。
如果SDA线在ACK/NACK时钟周期保持为高电平,这将会被作为NACK。有好几种状态将会导致NACK的产生:
接收方无法进行接收或发送,因为其正在执行一些实时性功能(real-time function),无法与主机进行通讯。 在发送期间,接收方收到了无法识别的数据或指令。 在发送期间,接收方无法接收更多数据字节(也就是缓冲区满了)。 作为接收方的主机完成了数据读取,因此通过发送一个NACK通知从机。
3、I2C总线数据
包含信息的寄存器处于从机的内存中,无论这些信息是配置信息还是一些需要回发给主机的采样数据。为了指示从机去执行某一任务,主机必须向这些寄存器内写入信息。
虽然通常来说I2C从机是具有多个寄存器的,但也需要注意并不是所有从机都是这样。对于一个只具有单个寄存器的简易从机来说,可以通过在从机地址后直接发送数据的方式来直接写这个单一的寄存器,而不需要再对寄存器进行寻址。一个通过I2C总线控制的8位I2C开关可以很好的作为单寄存器设备的例子。由于它通过1位来使能/失能一个通道,因此只需要1个寄存器,主机可以在从机地址后直接写入寄存器数据,跳过寄存器编码部分。
3.1 写位于I2C总线上的从机
图8展示了一个写入单个字节到从机寄存器的例子。
3.2 读位于I2C总线上的从机
主机将会继续发送时钟脉冲,但是会释放SDA线以便于从机传输数据。在每个字节数据的结尾,主机将会发送一个ACK到从机,让从机知道主机准备好接收更多的数据。一旦主机接收完成期待的字节数量,它将会发送一个NACK,通知从机终止通讯并要求从机释放总线。紧接着主机将会发送一个STOP标志结束通讯。
图9展示了从从机寄存器读取单个字节的例子。
原文地址:https://www.ti.com/lit/an/slva704/slva704.pdf
声明: