您好!
根据用户指南、对于主器件接收、如果我希望仅接收一个字节、则需要设置起始位、等待将其清除、然后设置停止位。
else
{
ucb1_i2c.rx_mode = MASTER_RECEIVE;
xSemaphoreGiveFromISR(ucb1_i2c.tx_semaphore,pdFALSE);
if(NULL != i2ca_tx_callback)
{
(*i2ca_tx_callback)();
}
i2c_set_receive_mode(USCI_B1_BASE);
uint8_t UCB1STT_timeout = 0;
UCB1CTL1 |= UCTXSTT;
if(1u == ucb1_i2c.master_rx->dat_len)
{
// UCB1STT_timeout usually around 57
while((UCB1CTL1 & UCTXSTT) && (UCB1STT_timeout < 200))
{
UCB1STT_timeout++;
}
UCB1CTL1 |= UCTXSTP; // Generate I2C stop condition
}
}
当前、在我的 ISR 内部、在主发送模式下发送最后一个字节后、我将更改为主接收模式。 然后、我将设置起始位、轮询 UCTXSTT 标志、然后针对预计接收到1个字节的情况设置停止位。
但是、如果总线上出现某些错误并且 UCTXSTT 标志未被清除、我不希望代码停留在 ISR 中。 因此、我添加了一个超时计数器来限制 while 循环的发生次数。
之前我检查过循环通常发生57次、因此我使用了200的超时计数。 但是、最近它超过了200个计数、当我在开始位被清零之前设置停止位时、它导致总线挂起。
首先、我想问的是、除了在 ISR 中轮询 UCTXSTT 标志之外、在主器件接收模式下接收一个字节的情况还有其他替代方法吗?
如果在轮询一定次数后 UCTXSTT 标志没有被清除、如何安全地停止事务而不会导致总线挂起?
谢谢
开尔文