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.

[参考译文] TMS570LS1115:I2C 中断不工作

Guru**** 2481465 points
Other Parts Discussed in Thread: LDC1614, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/679153/tms570ls1115-i2c-interrupt-not-working

器件型号:TMS570LS1115
主题中讨论的其他器件:LDC1614HALCOGEN

您好!

我正在实施固件、以便通过 I2C 协议与 LDC1614进行通信。 我想实现基于中断的通信。

但是、我注意到、当我将数据长度设置为"1"时、不会生成中断。 我正在读取这里的寄存器、因为我需要发送寄存器地址(8位)、然后读取两个字节的数据。

如果我按如下方式写入1个字节、它不会生成 TX 中断。

i2cSend (i2cREG1、1U、LDC1614_TX_Data_Buffer);

但是、如果我按如下方式更改代码、它会生成 TX 中断。

i2cSend (i2cREG1、2U、LDC1614_TX_Data_Buffer);

请注意、i2cREG1和缓冲区具有正确的数据。

请告诉我、我是否在这里做一些不正常的事情。

谢谢。

PS:

我深入到 i2c 库中、发现了一些看起来像是错误的东西、  

void i2cSend (i2cbase_t * i2c、uint32 length、uint8 * data)
{

//用户代码开头(17)*//
*/*用户代码结尾*/

if ((g_i2cTransfer_t.mode &(uint32) I2C_TX_INT)!= 0U)
{
/*中断模式*/
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
g_i2c 传输_t.data =数据;
/*通过发送第一个字节开始传输*/
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
I2C->DXR =(uint32)(*g_i2cTransfer_t.data);
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
/*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
g_i2c 传输_t.data++;

/*长度-1、因为一个数据已被写入*/
g_i2cTransfer_t.length =(长度- 1U);

/*启用发送中断*/
I2C->IMR |=(uint32) I2C_TX_INT;
} 

当 i2cSend 按上述方式处理 wtih 1字节消息时、它会将 g_i2cTransfer_t.length 设置为0。

在中断函数中、

案例5U:
/*用户代码开始(42)*/
/*用户代码结束*/
/*发送*/

if (g_i2cTransfer_T.length > 0U)
{
i2cREG1->DXR =*g_i2cTransfer_t.data;
/*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
g_i2c 传输_t.data++;
g_i2c 转移_t.length --;
if (g_i2cTransfer_t.length == 0U)
{//在传输所需的数据计数后禁用 TX 中断*/
i2cREG1->IMR &=(uint32)(~(uint32) I2C_TX_INT);
i2cNotification (i2cREG1、(uint32) I2C_TX_INT);
}
}
中断; 

只有当"length >0"时才会生成通知。 我认为(length = 0)条件应来自(length > 0)条件、因为当 i2c 数据长度为1时、这将永远不会生成通知。

我将于明天进一步检查、请确认。

谢谢!

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

    如果数据长度为1、则发送数据就绪中断也会生成、但数据传输(向 DXR 寄存器写入数据)在 i2cSend (..)中完成 而不是 ISR 中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="QJ Wang ]Hello Pradeepa、

    如果数据长度为1、则发送数据就绪中断也会生成、但数据传输(向 DXR 寄存器写入数据)在 i2cSend (..)中完成 而不是 ISR 中。

    [/报价]

    让我看看我执行的函数调用序列、因为当数据长度设置为1时、我似乎无法获得 TXD 中断。

    i2cClearSCD (i2cREG1);//清除任何可用的停止条件
    
    i2cSetSlaveAdd (i2cREG1、LDC1614_ADDR);//设置 I2C 地址(地址正确)
    
    i2cSetDirection (i2cREG1、I2C_transmitter);//设置方向:这应该是
    
    主机模式(i2cREG1);i2cStop 模式(i2cREG1)作为主机模式(i2cREG1)发送 i2c2cREG1主机模式;i2cREG1主机模式(i2i2cREG1);i2i2c2cREG1主机模式)
    
    //启用停止条件生成
    
    LDC1614_TX_Data_Buffer[0]= LDC1614_STATUS;//包含要读取的寄存器地址
    
    的数据缓冲区 i2cSetCount (i2cREG1、1U);//停止条件计数设置为零,一旦发送此字节并且检测到停止条件
    
    i2cREG1 (i2cREG1),就会生成 SCD 中断; //设置起始条件
    
    i2cSend (i2cREG1、1U、LDC1614_TX_Data_Buffer);//将数据提交到缓冲区 

    我希望在这个数据传输之后有两个中断、

    当器件检测到停止条件时

    2.成功提交发送数据时

    但是、我没有得到第二个中断。

    如果我按如下方式更改函数序列、我可以获得发送数据中断。 我无法理解这种行为的原因。

    i2cClearSCD (i2cREG1);//清除任何可用的停止条件
    
    i2cSetSlaveAdd (i2cREG1、LDC1614_ADDR);//设置 I2C 地址(地址正确)
    
    i2cSetDirection (i2cREG1、I2C_transmitter);//设置方向:这应该是
    
    主机模式(i2cREG1);i2cStop 模式(i2cREG1)作为主机模式(i2cREG1)发送 i2c2cREG1主机模式;i2cREG1主机模式(i2i2cREG1);i2i2c2cREG1主机模式)
    
    //启用停止条件生成
    
    LDC1614_TX_Data_Buffer[0]= LDC1614_STATUS;//包含要读取的寄存器地址的数据缓冲区
    
    ***** //
    //注释以下行*//
    i2cSetCount (i2cREG1,1U);//停止条件计数设置为零,一旦发送此字节并检测到停止条件,这将生成 SCD 中断
    。***** //
    
    i2cSetStart (i2cREG1);//设置起始条件
    
    i2cSend (i2cREG1、1U、LDC1614_TX_Data_Buffer);//将数据提交到缓冲区 

    请检查我是否执行了不正常的操作。

    谢谢!

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

    更多信息:

    请检查以下图片以确认 I2CSTR 寄存器的行为是否正常。 不过、我没有获得 I2C 矢量5的中断。

    请参阅以下图片:

    我将要传输数据、因为您可以看到中断标志全部设置为1。 STR 寄存器确认此时 TXRDY 位也是'1'。

    当我到达下一个断点时、我获得以下寄存器值。 您可以看到 STR 寄存器中的 TXRDY 位已清零、表明数据寄存器中有数据可用。

    下一个屏幕截图显示了 i2cInterrupt()函数中的断点。 如您所见、停止条件中断被生成。 此外、STR 寄存器的 TXRDY 位显然设置为"1"、这意味着我也应该得到 TXD 中断。 然而,这种情况并未发生。 我永远不会为此传输获取 TXD 中断。

    请检查我是否出现了问题。  

    谢谢!

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

    您好!

    在这里、似乎没有人能够提供帮助。

    现在、我决定使用 i2cSendByte 函数将一个字节的数据发送到 LDC1614。 但是、这不是我要做的。

    当数据长度为"1"且数据计数设置为1时启用停止条件生成功能时、我无法获得 i2c TX 中断。

    我接收到的唯一中断是 SCD 中断、理想情况下应紧跟 TXD 中断。

    如果有人可以研究这个问题、这将是一个很好的帮助。

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

    我今天将进行测试、并告诉您我的测试结果。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有发现?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    通过 HALCoGen 生成的 i2CSend()不会为第一个字节或数据长度为1时生成 TX 中断。 TX 中断未启用。 我将与 SW 团队一起检查是否启用第1个数据的中断。