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.

[参考译文] TMS320F28035:28035 I2C 中断

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/811912/tms320f28035-28035-i2c-interrupt

器件型号:TMS320F28035

好的、我有一个问题。 I2C-int1a_ISR 未在上触发(AAS =1 (即使我启用了 i2CIER -> AAS 位=1、i2CSTR 也是如此)。

那么、我在这里缺少什么吗?  当我具有 i2c 写入(作为从器件)时,它会触发,但在读取期间不起作用。

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

    您好 Sagar、

    您能进一步解释以下内容吗? 您说触发器是否取决于从器件地址(第8位)之后的读/写位的状态?

    [引用 user="sagar shah54"]当我有 i2c 写入(作为从器件)时,它会触发,但在读取期间不起作用。

    如果可能、提供工作案例和非工作案例的波形截图将有助于理解问题。

    最棒的

    Kevin

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

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

    那么、我的问题是-

    1)当我在28035中以写入方式将数据从28379 (主器件)发送到从器件28035时、会触发 i2c ISR、并在 ISR 中从 I2caRegs.I2CDRR 读取数据、操作成功完成。

    2) 2)当我执行同样的操作但28379希望从从28035读取时- 23035中的 i2ca ISR 不会在 AAS 上触发。 我在 i2cier reg 中启用了 AAS 位。

    那么、时钟会变低。 但是、如果我轮询 AAS 位、则传输会成功完成。 那么、为什么28035中的 i2c 中断即使已为 AAS 位启用也不会被触发?

    我附加了一个寄存器的屏幕截图、当它被设置为 ned 时。 那么、让我知道我是否做了一些错误的事情。

    谢谢、  

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

    Kevin、您还需要更多数据吗?

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

    您好 Sagar、

    很抱歉我的回答有延迟。 如果您最初执行的是读取操作而不是写入操作、是否仍然会发生这种情况?

    I2CISRC.bit.INTCODE 显示的值为0x6、这是一个停止条件中断。 可能该中断没有及时清除/处理、无法检测到 AAS 中断。 我认为下面 I2CSTR.SCD 位描述中的清除方法应该起作用:

    最棒的

    Kevin

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

    是的、我在等待您的回复时做了几处更改。 如果您能更快地回复、那将是一个大帮助。

    我只有两个中断被启用。

    I2caRegs.I2CIER.ALL = 0x0;

    I2caRegs.I2CIER.bit.RRDY=1;

    I2caRegs.I2CIER.bit.XRDY=1;

    因此、它在需要时仍然不会中断。

    另外、 为什么在2CISRC.bit.INTCODE = 0时触发中断?

    此外、如果我在 i2c ISR 开始时施加150微秒的延迟、则我的所有操作都将顺利进行。

    那么、您能否帮助解决我为什么需要延迟的问题。

    谢谢。

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

    Sadar、

    [引用 user="sagar shah54"]

    我只有两个中断被启用。

    I2caRegs.I2CIER.ALL = 0x0;

    I2caRegs.I2CIER.bit.RRDY=1;

    I2caRegs.I2CIER.bit.XRDY=1;

    [/报价]

    这些中断不用于使用、并且在使用 I2C FIFO 模式时可能不会触发。

    [引用 user="sagar shah54"]当 2CISRC.bit.INTCODE = 0时为什么会触发中断?[/quot]

    您是如何对此进行测试的? 当 CPU 读取 INTCODE 时、应该有相应的中断值。 可能是根据您看到的内容清除了它。

    [引用 user="sagar shah54"]

    此外、如果我在 i2c ISR 开始时施加150微秒的延迟、则我的所有操作都将顺利进行。

    那么、您能否帮助解决我为什么需要延迟的问题。

    [/报价]

    您能否共享包含此延迟的 ISR 代码片段?

    最棒的

    Kevin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    _interrupt void i2c_int1a_isr (void) // I2C-A
    {
    //
    int j;
    intcode = I2caRegs.I2CISRC.bit.INTCODE;
    if (intcode!= 0){
    
    DELAY_US (130);//这是使其工作的延迟
    
    if (I2caRegs.I2CSTR.bit.SDIR = 1 && intcode = 5){//将28379写入双核
    I2caRegs.I2CDXR = dataRx[0];
    while (I2caRegs.I2CSTR.bit.XRDY!= 1){};// 1 =数据移位后、数据传输到内核 TX 寄存器
    
    I2caRegs.I2CDXR = dataRx[1];
    while (I2caRegs.I2CSTR.bit.XRDY!= 1){};// 1 =数据移位后、数据传输到内核 TX 寄存器
    
    I2caRegs.I2CDXR = dataRx[2];
    while (I2caRegs.I2CSTR.bit.XRDY!= 1){};// 1 =数据在数据移位后通过内核 TX 寄存器传输
    
    I2caRegs.I2CDXR = dataRx[3];
    while (I2caRegs.I2CSTR.bit.XRDY!= 1){};// 1 =数据在数据移位
    
    后通过内核 TX 寄存器传输}
    
    if (I2caRegs.I2CSTR.bit.SDIR =0 && intcode =4){//从28379读取并保存寄存器
    while (I2caRegs.I2CFFRX.bit.RXFFST < 4){};
    
    //等待4字节数据到达
    
    for (j =0;j < 4;j++){
    dataRx[j]= I2caRegs.I2CDRR;
    }
    
    }//案件结束 INT = 4
    
    }// INTCODE 结束!= 0
    
    PieCtrlRegs.PIEACX.ALL = PIEACK_group8;
    } 

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

    我不使用 FIFO 模式我使用的 Cnt = 4字节。 此外、当我在 ISR 中放入断点时、有时中断代码为0。

    ISR 代码中显示了所需的延迟。 如果您需要任何东西、请告诉我、如果可能、希望我能快速理解。

    谢谢、

    Sagar

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

    萨加尔

    [引用 user="sagar shah54"]我不使用 FIFO 模式,我使用的 Cnt = 4字节。

    不确定这是什么意思、看起来您使用的是 FIFO 模式。 在您在中提供寄存器值的第二个帖子中、I2CFFEN 和 RXFFRST 设置为1、从而启用 I2C FIFO。 您还在检查代码中的接收 FIFO 状态" while(I2caRegs.I2CFFRX.bit.RXFFST < 4)  {};'.

    [引用 user="sagar shah54"]此外,当我在 ISR 中放入断点时,中断代码有时为0。

    您是否在I2caRegs.I2CISRC.bit.INTCODEintcode断点处检查或检查变量? 如果您正在检查寄存器位、我希望在将值移动到intcode变量后将其清除。 当 CPU 读取时、寄存器字段将被清除、intcode您的变量应包含正确的值。

    对我来说、对这种延迟的需求毫无意义。 INTCODE 已被读取、此时不会受到影响。 没有延迟会发生什么情况? 当您写入 TX 缓冲区时、总线可能会很忙? 您可以尝试添加一些其他状态寄存器检查(可能是 BB 位?) 然后再写入 I2CDXR.

    最棒的

    Kevin