主题中讨论的其他器件:LDC1614、 HALCOGEN
您好!
我正在实施固件、以便通过 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时、这将永远不会生成通知。
我将于明天进一步检查、请确认。
谢谢!