I2C 总线——赋值、设备、数据传输、寻址
在创建电子电路时,许多开发人员需要使用大量中间芯片来匹配、采样和寻址其各个模块。为了尽量减少辅助芯片的数量,飞利浦早在 80 年代就提出了一种双线双向 I2C 串行网络接口,专门设计用于管理单个设备中的多个芯片。
今天,仅 Philips 一家就为电子设备生产了一百多种 I2C 兼容设备,用途广泛:内存、视频处理器系统、模数和数模转换器、显示驱动器等。
I2C 总线是串行数据交换协议的一种改进,能够以 100 至 400 kbps 的速率以通常的“快速”模式传输串行 8 位数据。数据交换的过程在这里只在两条线上实现(不包括公共线):用于数据的 SDA 线和用于同步的 SCL 线。
由于连接到总线的设备输出级联具有开路集电极或通道,因此总线变为双向,从而复制了 AND 接线。因此,总线将芯片之间的连接数量降至最低,从而在板上留下更少的所需引脚和走线。结果,电路板本身变得更简单、更紧凑并且生产技术更先进。
该协议允许您禁用地址解码器和其他外部协商逻辑。可同时在 I2C 总线上运行的芯片数量受限于其容量——最大 400 pF。
I2C 兼容 IC 具有硬件噪声抑制算法,即使在存在强干扰的情况下也能确保数据完整性。这些设备有一个接口,允许微电路相互通信,即使它们的电源电压不同。在下图中,您可以熟悉通过公共总线连接多个微电路的原理。
连接到总线上的每个设备都有自己唯一的地址,地址由它决定,并且根据设备的用途,它可以作为接收器或发送器工作。在传输数据时,这些设备可以是主机(master)或从机(slave)。主机是启动数据传输并在 SCL 线上生成时钟信号的设备。与主设备相关的从设备是目标设备。
在 I2C 总线上的任何给定操作时刻,只有一个设备可以充当主机;它在 SCL 线上产生一个信号。主站可以是主接收器或主发射器。
原则上,总线允许多个不同的主机,但对形成控制信号和监控总线状态的特性施加了限制;这意味着多个主机可以同时开始传输,但是由于仲裁消除了这种冲突,即主机在检测到总线被另一个主机占用时的行为方式。
所有设备都连接到总线,形成“与”接线,从而确保一对设备的同步。最初,SDA 和 SCL 信号为高电平。
启动和停止
交换从主设备生成 «START» 状态开始:在 SDA 线上,信号从高状态变为低状态,而 SCL 线具有稳定的高电平。连接到总线的所有设备都将这种情况视为开始交换的命令。
当在总线上传输数据时,每个主机在 SCL 线上生成一个单独的时钟信号。
交换以主机形成 STOP 状态结束:在 SDA 线上,信号从低变为高,而 SCL 线具有稳定的高电平。
驱动器始终作为 START 和 STOP 信号的来源。一旦 «START» 信号固定,就意味着线路忙。当检测到 STOP 信号时,线路空闲。
在声明 START 状态后,主机立即将 SCL 线切换为低电平并将第一个消息字节的最高有效位发送到 SDA 线。消息中的字节数不受限制。只有当 SCL 线上的信号电平为低电平时,SDA 线上的变化才会启用。只有当同步脉冲为高时,数据才有效且不应更改。
在接收到第八个数据位后,通过在 SDA 线上设置一个特殊的确认位来确认从机接收器已接收到来自主发送器的字节。
确认书
因此,当接收设备在 SDA 线上变低时,从发送器向接收器发送 8 位数据会在 SCL 线上产生一个额外的脉冲,表明它已接收到整个字节。
确认是数据传输过程的一个组成部分。主机产生一个同步脉冲。当应答时钟有效时,发送器向 SDA 发送一个低电平状态。当同步脉冲为高电平时,接收器必须保持 SDA 为低电平。
如果目标从机不确认其地址,例如因为它当前正忙,则数据线必须保持高电平。然后船长可以发出停止信号以中止调度。
如果接收是由主接收器执行的,那么它有义务在传输完成后通知从发送器——而不是通过确认最后一个字节。从机发送器释放数据线,以便主机可以发出 STOP 信号或重复 START 信号。
与 SCL 线的连接是根据“与”原则进行的,从而确保了设备的同步。
主机没有唯一的权利来控制 SCL 线从低电平到高电平的转换。如果从机需要更多时间来处理接收到的位,它可以独立地保持 SCL 为低电平,直到它准备好接收下一位数据。在这种情况下,SCL 线将在最长的低电平同步脉冲持续时间内保持低电平。
具有最低持续低电平的设备将保持空闲状态,直到长期结束。当所有设备都完成低同步周期后,SCL 将变为高电平。
所有设备都将开始时钟变高,第一个完成其周期的设备将最先将 SCL 线设置为低电平。因此,SCL 的低电平状态的持续时间将由其中一个器件的同步脉冲的最长低电平状态确定,而高电平状态的持续时间将由其中一个器件的最短同步周期确定设备。
接收器可以使用同步信号作为在位和字节级别控制数据传输的手段。
如果设备能够以高速率接收字节,但需要一定的时间来存储接收到的字节或准备接收下一个字节,它可能会在接收并确认一个字节后继续保持 SCL 为低电平,迫使发射器进入待机状态。
没有内置硬件电路的微控制器,例如在位级,可以通过增加其低状态的持续时间来减慢时钟速度。因此,主设备的波特率将由主设备的速度决定较慢的设备。
寻址
连接到 I2C 总线的每个设备都有一个唯一的程序地址,主机通过发送特定命令对其进行寻址。相同类型的微电路的特点是地址选择器,以选择器的数字输入形式或模拟形式实现。地址被划分为连接到总线的设备的地址空间。
正常模式采用七位寻址。寻址工作如下:在 «START» 命令后,主设备发送第一个字节,确定需要哪个从设备与主设备通信。还有一个通用的调用地址,它定义了总线上的所有设备,所有设备(理论上)都以确认响应它,但实际上这种情况很少见。
所以第一个字节的前七位是从机地址。最低有效位,第八位,指示发送数据的方向。如果有 «0»,则信息将从主机写入该从机。如果为 «1»,则主站将从该从站读取信息。
主机发送完地址字节后,每个从机将自己的地址与其进行比较。具有相同地址的任何人都是从机,并被定义为从机发送器或从机接收器,具体取决于地址字节的最低有效位的值。
从属地址可以包括固定部分和可编程部分。很多同类型的设备经常在一个系统中工作,那么地址的可编程部分允许总线上最多使用同类型的设备。地址字节中有多少位是可编程的取决于芯片上空闲引脚的数量。
有时,具有可编程地址范围的模拟设置的引脚就足够了,例如 SAA1064 - 具有完全此类实现的 LED 指示器驱动器。特定引脚的电位决定了芯片地址空间的偏移量,从而使同类型芯片在同一总线上运行时不会发生冲突。所有支持 I2C 总线的芯片都包含一组制造商在文档中指定的地址。
«11110XX» 组合保留用于 10 位寻址。如果我们想象从 «START» 命令到 «STOP» 命令的数据交换,它将如下所示:
这里允许简单和组合的数据交换格式。组合格式意味着在 «START» 和 «STOP» 之间,主机和从机可以充当接收器和发送器,这在串行内存管理中很有用。
让数据的第一个字节传输一个内存地址。然后,重复 «START» 命令并读取从地址,内存数据将起作用。自动增加或减少先前访问的地址的决定是由设备开发人员在先前研究了芯片文档之后做出的。无论哪种方式,在收到 START 命令后,所有设备都必须恢复其逻辑并为地址现在将被命名这一事实做好准备。