主题中讨论的其他器件:C2000WARE
尊敬的 TI 专家:
我对 I2C 中断和 TX FIFO 有点困惑。
在 TRM 第23.4.1节中说明、I2C 通用中断具有7个不同的源、全部通过 OR 运算。
I2C 中断请求 | 中断源 |
XRDYINT | 发送就绪条件:数据发送寄存器(I2CDXR)已准备好接受新数据、因为之前的数据已从 I2CDXR 复制到发送移位寄存器(I2CXSR)。 作为 XRDYINT 的替代方法、CPU 可以轮询状态寄存器 I2CSTR 的 XRDY 位。 处于 FIFO 模式时、不应使用 XRDYINT。 请改用 FIFO 中断。 |
RRDYINT | 接收就绪条件:由于数据已经从接收移位寄存器(I2CRSR)复制到 I2CDRR、数据接收寄存器(I2CDRR)已准备好被读取。 作为 RRDYINT 的替代方法、CPU 可以轮询 I2CSTR 的 RRDY 位。 处于 FIFO 模式时、不应使用 RRDYINT。 请改用 FIFO 中断。 |
ARDYINT | 寄存器访问就绪条件:I2C 模块寄存器已准备好访问、因为之前编程的地址、数据和命令值已经被使用。 生成 ARDYINT 的特定事件与设置 I2CSTR 的 ARDY 位的事件相同。 作为 ARDYINT 的替代方案、CPU 可以轮询 ARDY 位。 |
NACKINT | 无确认条件:I2C 模块被配置为一个主发送器并且没有从接收器接收到确认。 作为 NACKINT 的替代方法、CPU 可以轮询 I2CSTR 的 NACK 位 |
ARBLINT | 仲裁丢失条件:I2C 模块丢失了与另一个主发送器的仲裁争用。 作为使用 ARBLINT 的替代方法、CPU 可以轮询 I2CSTR 的 ARBL 位。 |
SCDINT | 检测到停止条件:在 I2C 总线上检测到停止条件。 作为 SCDINT 的替代方案、CPU 可以轮询状态寄存器 I2CSTR 的 SCD 位。 |
AASINT | 被寻址为从器件状态:I2C 已被 I2C 总线上的另一个主器件寻址为从器件。 作为 AASINT 的替代方法、CPU 可以轮询状态寄存器 I2CSTR 的 AAS 位。 |
我想在这里了解有关 ARDYINT 和 AASINT 的更多详细信息。
第一 个是寄存器访问就绪条件(ARDYINT)
假设在主器件发送模式下使用 I2C、是 所有数据都发生了寄存器访问就绪条件、其中包括起始条件、地址+读/写位、数据和停止条件、所有数据都已发送、 那么我可以安全地修改 I2C 寄存器吗? 或者只是简单表示所有 I2C 寄存器(I2CSTR、I2CCNT 等) 可以是访问、但并不意味着所有数据都已传输?
我想知道这一点、因为我正在查看"I2C_ex6_EEPROM_INTERRUPT.c"第275行中的库文件"12cLib_FIFO_MASTER_INTERRUPT.c"
其中一部分如下所示、我要清除此中断的值、以将主器件从发送模式更改为接收模式。
case I2C_INTSRC_REG_ACCESS_RDY: I2C_disableInterrupt(base, I2C_INT_REG_ACCESS_RDY); I2C_disableInterrupt(base, I2C_INT_TXFF); I2C_disableFIFO(base); I2C_enableFIFO(base); I2C_setConfig(base, (I2C_MASTER_RECEIVE_MODE)); I2C_clearInterruptStatus(base, I2C_INT_TXFF); if(I2C_Params->numofSixteenByte) { I2C_setFIFOInterruptLevel(base, I2C_FIFO_TXEMPTY, I2C_FIFO_RXFULL); } else { I2C_setFIFOInterruptLevel(base, I2C_FIFO_TXEMPTY, (I2C_RxFIFOLevel)I2C_Params->remainingBytes); } I2C_setDataCount(base, I2C_Params->NumOfDataBytes); I2C_sendStartCondition(base); I2C_sendStopCondition(base); break;
另一个问题是关于作为从器件条件(AASINT)进行寻址
该中断是仅在 I2C 处于从机模式时生成、还是仅在 I2C 处于主机模式时生成?
该中断是否可以检测到从器件特定地址发出的 ACK?
在上面的同一个文件中、代码将角色从从发送器更改为从接收器(反之亦然?)
case I2C_INTSRC_ADDR_SLAVE: //Set TX / RX FIFO Level I2C_setFIFOInterruptLevel(base, I2C_FIFO_TXEMPTY, (I2C_RxFIFOLevel)(I2C_Params->NumOfAddrBytes)); if((I2C_getStatus(base) & I2C_STS_SLAVE_DIR)) { //Slave Transmitter (SDIR = 1) I2C_setConfig(base, I2C_SLAVE_SEND_MODE); //Enable TX FIFO interrupt and disable RXFF interrupt I2C_enableInterrupt(base, I2C_INT_TXFF); I2C_disableInterrupt(base, I2C_INT_RXFF); I2C_clearInterruptStatus(base, (I2C_INT_TXFF|I2C_INT_RXFF)); } else { //Slave Receiver (SDIR = 0) I2C_setConfig(base, I2C_SLAVE_RECEIVE_MODE); //Fill dummy data in Transmit FIFO to clear pending FIFO interrupt flag //I2C_putData(base, 0xAA); //I2C_putData(base, 0x55); //Enable RX FIFO interrupt and disable TXFF interrupt I2C_disableInterrupt(base, I2C_INT_TXFF); I2C_enableInterrupt(base, I2C_INT_RXFF); I2C_clearInterruptStatus(base, (I2C_INT_TXFF|I2C_INT_RXFF)); } break;
另一个问题是有关 I2C FIFO 传输机制的问题:
假设 I2C 处于主器件传输模式、并使用 C2000Ware 4.02.00\ driverlib \ i2c.c 提供的 i2c 库
我想使用 I2C_putData()将数据放入 I2C TX FIFO 中, 并将 FIFO 电平设置为3,以及数据计数器 I2CCNT=3。
在 I2C_sendStartCondition (base)被运行之前、数据应该保持在 FIFO 内部、或者当我将数据放入 TX 缓冲区时、它将发生移位?
此机制是否与 I2C_sendStopCondition (base)相同?
如果我操作 I2C_sendStartCondition (base)并立即执行 I2C_sendStopCondition (base)、
I2C 模块将发送:起始条件、地址+读/写位、数据、数据、 停止条件、对吗?
虽然我仍然对 I2C 角色变化有疑问、但我认为这是另一个主题。
感谢您的帮助、希望我的问题能够帮助他人。