ZYNQ学习笔记3-ZYNQ的IIC控制器1
发布时间:2026/8/30 15:20:58 作者:尧图编辑部 阅读量:1,286

一、总体介绍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分别是5780,通过APB和内部互联模块通信作为从接口。可通过MIO和芯片外部通信也可以通过EMIO和PL通信用EMIO的话会有SCLSDASCL-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_LOOPBACK[I2C0_LOOP_I2C1]位被置1时PS中两个I2C控制器的I/O信号会连接在一起。在此模式下串行时钟信号相互连接串行数据信号也相互连接。