This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F280025C:I2C 中断 ARDYINT、AASINT 说明和 TX FIFO 问题

Guru**** 2396215 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1179056/tms320f280025c-i2c-interrupt-ardyint-aasint-clarification-and-tx-fifo-question

器件型号:TMS320F280025C
主题中讨论的其他器件: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 角色变化有疑问、但我认为这是另一个主题。

感谢您的帮助、希望我的问题能够帮助他人。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="544364" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1179056/tms320f280025c-i2c-interrupt-ardyint-aasint-clarification-and-tx-fifo-question ]假设在主发送模式下使用 I2C、是 在所有数据(包括起始条件、地址+读/写位、数据和停止条件)均已发送时发生寄存器访问就绪条件、 那么我可以安全地修改 I2C 寄存器吗? 或者只是简单表示所有 I2C 寄存器(I2CSTR、I2CCNT 等) 可以是访问、但并不意味着所有数据都已传输?

    ARDY 表示 I2C 模块寄存器已准备好访问、因为之前编程的地址、数据和命令值已被使用。

    不需要生成停止条件。  在 I2CDXR 传输的每个字节的末尾设置 ARDY。

    [引用 userid="544364" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1179056/tms320f280025c-i2c-interrupt-ardyint-aasint-clarification-and-tx-fifo-question "]

    一个问题是关于作为从器件条件(AASINT)进行寻址

    该中断是仅在 I2C 处于从机模式时生成、还是仅在 I2C 处于主机模式时生成?

    [/报价]

    只有当 I2COAR 中提到的地址从另一主机发送时、I2C 才会生成作为从机(AAS)中断寻址的 I2C。 I2C 本身是否配置为主设备无关紧要。

    [引用 userid="544364" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1179056/tms320f280025c-i2c-interrupt-ardyint-aasint-clarification-and-tx-fifo-question "]

    我想使用  I2C_putData()将数据放入 I2C TX FIFO 中, 并将 FIFO 电平设置为3,以及数据计数器 I2CCNT=3。

      在 I2C_sendStartCondition (base)被运行前、数据应该保持在 FIFO 内

    [/报价]

    是的,在使用 I2C_sendStartCondition()之前,需要使用 I2C_putData()来填充 TX FIFO。

    [引用 userid="544364" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1179056/tms320f280025c-i2c-interrupt-ardyint-aasint-clarification-and-tx-fifo-question ]I2C 模块将发送:起始条件、地址+读/写位、数据、数据、数据 停止条件、这是对的吗?[/quot]

    在非重复模式下运行时、 传输完所有数据后、无需执行 I2C_sendStopCondition (base)。 即使在开始条件生成时也可以执行该操作。

    在重复模式下运行时、只需 在传输完所有数据后执行 I2C_sendStopCondition (base)。

    此致、

    曼诺伊

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的详细回复。

    我可以理解主器件由于 AARDY 中断而改变角色、也可以理解主器件在调用时识别它是由于 AAS 中断。