主题中讨论的其他器件:HALCOGEN
我想以非阻塞的方式使用 I2C 主机外设(不是无限的 while 循环)。
为此、我需要学习如何使用具有中断的 TI HalCoGen I2C API。
遗憾的是、我没有找到任何示例:
- TI e2e 搜索功能未显示任何讨论此主题的结果
-正式文件不包含使用 HalCoGen 生成代码的示例
- HalCoGen 示例文件夹 有0提到 i2cNotification
所以我现在转到这个论坛:^)
——
我主要寻找有关如何处理待机问题的
- 如何在 i2cNotification 中正确处理 STOP ?
- 如何正确处理 i2cNotification 中的错误?
- 如何适当地等待总线做好准备,然后再做其他事情?
下面是我的代码:
static volatile bool g_rx_done = false; static volatile bool g_tx_done = false; int i2c_transmit(i2cBASE_t *base, // uint8_t slave_address, size_t data_size, uint8_t const data[data_size]) { if (i2cIsMasterReady(base) != true) { return -1; //< Busy } g_tx_done = false; i2cSetSlaveAdd(base, slave_address); i2cSetDirection(base, I2C_TRANSMITTER); i2cSetMode(base, I2C_MASTER); i2cSetCount(base, data_size); i2cSetStop(base); i2cSetStart(base); i2cSend(base, data_size, data); return 0; } bool i2c_is_transmit_done(i2cBASE_t *base) { return i2cIsMasterReady(base) && g_tx_done; // } int i2c_start_receiving(i2cBASE_t *base, // uint8_t slave_address, size_t data_size, uint8_t data[data_size]) { if (i2cIsMasterReady(base) != true) { return -1; //< Busy } g_rx_done = false; i2cSetSlaveAdd(base, slave_address); i2cSetDirection(base, I2C_RECEIVER); i2cSetMode(base, I2C_MASTER); i2cSetCount(base, data_size); i2cSetStop(base); i2cSetStart(base); i2cReceive(base, data_size, data); return 0; } bool i2c_is_receive_done(i2cBASE_t *base) { return i2cIsMasterReady(base) && g_rx_done; // } void i2cNotification(i2cBASE_t *base, uint32 flags) { if (flags & I2C_SCD_INT) //< Stop condition detect { i2cClearSCD(base); } if (flags & I2C_TX_INT) //< Transmit data ready { g_tx_done = true; } if (flags & I2C_RX_INT) //< Receive data ready { g_rx_done = true; } if (flags & I2C_AL_INT) //< Arbitration lost (AL) { } if (flags & I2C_NACK_INT) //< No acknowledgement (NACK) { } if (flags & I2C_ARDY_INT) //< Register access ready (ARDY) { } if (flags & I2C_AAS_INT) //< Address as slave (AAS) { } }
欢迎提供任何建议。
此致、
加布里埃尔