ZYNQ学习笔记3-ZYNQ的IIC控制器1

一、总体介绍

ZYNQ的I2C模块是一款总线控制器,可在多主设备设计中作为主设备或从设备使用。它支持极宽的时钟频率范围,从DC(近乎)0 Hz 直至 400 Kb/s。

在主设备模式下,只有处理器将从设备地址写入I2C地址寄存器后,才能启动一次传输。处理器通过数据中断或传输完成中断获知任何可用的接收数据。若HOLD位置1,则I2C接口在数据发送完成后将SCL线拉低,以支持处理器的慢速服务。主设备可编程为使用普通(7位)寻址模式和扩展(10位)寻址模式。

在从设备监视模式下,I2C接口被配置为主设备,并持续尝试向特定从设备发起传输,直到该从设备以ACK响应为止。HOLD位可被置1,以防止主设备继续传输,从而避免从设备发生溢出状况。

主设备模式和从设备模式的一个共同特性是超时(TO)中断标志。如果在任何时候,SCL线被主设备或被访问的从设备拉低的时间超过超时寄存器中指定的周期,则会产生超时(TO)中断,以避免停滞状态的发生。

ZYNQ的I2C模块系统模块图如下图所示,由图可见ZYNQ的IIC控制器IRQ中断ID分别是57,80,通过APB和内部互联模块通信,作为从接口。可通过MIO和芯片外部通信,也可以通过EMIO和PL通信,用EMIO的话会有SCL,SDA,SCL-T三个信号。

二、主模式:

I2C传输只能由APB主机发起,可执行两种类型的传输:

  • 写传输:I2C成为主设备发送器

  • 读传输:I2C成为主设备接收器

2.1、写传输

要完成一次I2C写传输,主机必须执行以下步骤:

  1. 写入控制寄存器,以设置SCL速度和寻址模式。

  2. 在控制寄存器中设置MS、ACKEN和CLR_FIFO位,并清零RW位。

  3. 如果需要,设置HOLD位;否则,将第一个数据字节写入I2C数据寄存器。

  4. 将从设备地址写入I2C地址寄存器。这将启动I2C传输。

  5. 继续通过向I2C数据寄存器写入数据,将剩余待发送数据发送给从设备。每次主机向I2C数据寄存器写入时,数据都会被推入FIFO。

当所有数据成功传输完毕后,中断状态寄存器中的COMP位被置位。当FIFO中只剩下两个字节待发送时,会产生数据中断。

当所有数据成功传输后,如果HOLD位未置位,I2C接口会生成STOP条件并终止传输。如果HOLD位置位,则在数据发送完成后I2C接口将SCL线拉低。主机通过传输完成中断(COMP位置位)获知此事件,同时状态寄存器中的TXDV位被清零。此时,主机可按以下三种方式继续操作:

  1. 清零HOLD位。这将使I2C接口生成STOP条件。

  2. 通过向I2C地址寄存器写入数据来提供更多数据。这将使I2C接口继续传输,向从设备写入更多数据。

如果在任何时候从设备以NACK响应,传输将自动终止,并产生传输NACK中断(NACK位置位)。当接收到NACK时,传输大小寄存器指示仍需发送的字节数减一。除非主机写入FIFO的最后一个字节是NACK字节,否则TXDV保持高电平。此时,主机必须通过设置控制寄存器中的CLR_FIFO位来清除FIFO。

如果在任何时候,SCL线被主设备或被访问的从设备拉低的时间超过超时寄存器中指定的周期,则会产生超时中断,并且可以从传输大小寄存器中读取未完成的数据量减一。

2.2、读传输

要完成一次I2C读传输,主机必须执行以下步骤:

  1. 写入控制寄存器,以设置SCL速度和寻址模式。

  2. 在控制寄存器中设置MS、ACKEN、CLR_FIFO位以及RW位。

  3. 如果主机希望在接收数据后保持总线,还必须设置HOLD位。

  4. 在传输大小寄存器中写入请求的字节数。

  5. 将从设备地址写入I2C地址寄存器。这将启动I2C传输。

主机通过两种方式获知任何可用的接收数据:

  1. 如果未完成的传输字节数大于或等于FIFO大小减2,则当FIFO中有两个空闲位置可用时,会产生数据中断(DATA位置位)。

  2. 如果未完成的传输字节数小于FIFO大小减2,则当接收到未完成的传输字节数后,会产生传输完成中断(COMP位置位)。

在这两种情况下,状态寄存器中的RXDV位均被置位。

I2C接口在接收到最后一个预期字节后自动返回NACK,并通过生成STOP条件终止传输。如果在主设备读传输期间HOLD位置位,则I2C接口将SCL线拉低。

如果在主设备发送从设备地址进行主设备读传输时,从设备以NACK响应,则传输自动终止,并产生传输NACK中断(NACK位置位)。未完成的数据量可以从传输大小寄存器中读取。

如果在任何时候,SCL线被主设备或被访问的从设备拉低的时间超过超时寄存器中指定的周期,则会产生超时中断。

从设备模式

通过清零控制寄存器中的MS位,可将I2C接口设置为从设备。I2C从设备必须通过向I2C地址寄存器写入一个唯一的标识地址。SCL速度也至少需要设置为预期看到的最高SCL频率。在从设备模式下,I2C接口作为从设备发送器或从设备接收器工作。

从设备发送器

从设备在识别到主设备发送的完整从设备地址,并且最后发送的地址字节中的R/W位为高时,成为发送器。这意味着从设备已被请求在I2C总线上发送数据,主机通过向GIC发送中断来获知此事件。同时,SCL线被拉低,以便在I2C主设备开始采样SDA线之前,主机能够向I2C从设备提供数据。主机通过DATA中断标志置位来获知此事件。

主机必须通过I2C数据寄存器提供待发送的数据,以便释放SCL线并继续传输。如果主机在超时期限到期前未写入I2C数据寄存器,则会产生中断,并置位TO中断标志。

在主机写入I2C数据寄存器后,传输继续,在传输进行过程中数据被加载到FIFO中。加载到FIFO中的数据量可能是已知的系统参数,或通过使用I2C总线的更高级协议预先通信得知。

当FIFO中只剩下两个有效字节待发送时,会产生中断,并置位DATA中断标志。如果I2C主设备在FIFO发送的最后一个字节上返回NACK,则会产生中断,并且一旦I2C主设备生成STOP条件,COMP中断标志即被置位。

如果主设备对FIFO发出的最后一个字节进行应答,则传输必须继续。此时,DATA中断标志被置位。状态寄存器中的TXDV标志被清零,因为FIFO为空。如果I2C主设备在从设备发送完FIFO中的所有数据之前终止传输,则主机将收到通知,NACK中断标志被置位,同时TXDV保持置位,传输大小寄存器指示FIFO中剩余的字节数。主机必须设置控制寄存器中的CLR_FIFO位,以清除FIFO和TXDV位。

从设备接收器

从设备在识别到主设备发送的完整从设备地址,并且第一个地址字节中的R/W位为低时,成为接收器。这意味着主设备即将通过I2C总线向从设备发送一个或多个数据字节。

在I2C从设备应答一个字节后,状态寄存器中的RXDV位被置位,指示已接收到新数据。主机通过I2C数据寄存器读取接收到的数据。当FIFO中只剩下两个空闲位置时,会产生中断,并置位DATA中断标志。

每当I2C主设备生成STOP条件时,会产生中断,并置位COMP中断标志。此时,传输大小寄存器中包含FIFO中可用的已接收字节数。主机每次读取I2C数据寄存器时,该数字会递减。

如果I2C接口接收到一个或多个字节时FIFO已满,则会产生中断,并置位RX_OVF中断标志。最后一个接收到的字节不会被应答,FIFO中的数据保持不变。

当无法在合理时间内响应中断时,可通过设置控制寄存器中的HOLD位来避免溢出状况。如果HOLD位置1,则I2C接口将SCL线保持为低,直到主机清空数据接收资源。这可以防止主设备继续传输,从而避免从设备发生溢出状况。主机通过读取数据寄存器来清空数据接收资源。

如果HOLD位置1且I2C接口将SCL线保持为低的时间超过超时周期,则会产生中断,并置位TO中断标志。

I2C速度

在从设备模式下,时钟使能用于提取同步信息,以便正确采样SDA线。

在主设备模式下,时钟使能用于建立时间基准,以产生所需的SCL频率

标准模式和高速模式下SCL时钟值的计算方式:

SCL时钟 = CPU_1X时钟 / (22 × (divisor_a + 1) × (divisor_b + 1))

标准或高速SCL时钟计算值如下表:

多主机模式

在I2C多主设备模式下,总线与其他主设备共享。在此模式下,I2C时钟(I2C_SCL)由充当主设备的器件驱动。

I2C0与I2C1的互相连接

当`slcr.MIO_LOOPBACKI2C0_LOOP_I2C1`位被置1时,PS中两个I2C控制器的I/O信号会连接在一起。在此模式下,串行时钟信号相互连接,串行数据信号也相互连接。

相关推荐
cardinal_5081 小时前
STM32MP157F-DK2开发板构建交叉编译链
stm32·单片机·嵌入式硬件
小羊先生car2 小时前
F429-HAL-RS485(回环/双机实验)(2026/8/16)
c语言·单片机·嵌入式硬件·软件构建
不会代码的小猴2 小时前
C++新增关键字
开发语言·c++·笔记
xiaoxiangsiyan3 小时前
RHCE2026完整版全知识点清单
运维·网络·学习·自动化·rhce
Titan20244 小时前
Linux网络基础知识
linux·服务器·网络·c++·学习
m4Rk_4 小时前
【论文阅读】Agent 记忆机制(41):Agentic Plan Caching——将历史执行轨迹转化为可复用的计划记忆
论文阅读·人工智能·学习·开源·github
woshihuanglaoshi5 小时前
错题四科入库:鸿蒙错题本种子数据与复习队列效果
学习·华为·harmonyos·鸿蒙
hsjiasb5 小时前
FreeRTOS学习(二十九)——低功耗Tickless Idle
学习·学习笔记·freertos
小赵AI手记5 小时前
技术拆解(十七)具身智能:机器人动作生成为何走向Diffusion Policy?
人工智能·笔记·python·机器人