主题中讨论的其他器件:BQ76940、
您好!
我使用247与 I2C 器件 bq76940进行通信。 247无法与 I2C 器件通信。 我已经把这个问题提到了 bq 支持小组很久了。 此过程导致 认为问题在系统的主侧。 我们的设计是使用 msp430f247 MCU 作为 mastor 与 bq76940作为从器件进行通信。 处理 I2C 部分代码的固件来自 ti 命令的演示代码。 下面是我的问题、
调试快照
实际代码如下所示、
静态 INT8_t I2CSendBytes (uint8_t I2CSlaveAddress、uint8_t *数据缓冲区、uint16_t ByteCount、uint16_t * pSentByte)
{
uint16_t DelayCounter = 0;
uint16_t NumberOfBytesSent = 0;
uint8_t *DataPointer;
UCB0I2CSA = I2CSlaveAddress;
DataPointer = pDataBuffer;
//设置到传输方向,生成起始位
UCB0CTL1 |= UCTR;
UCB0CTL1 |= UCTXSTT;
//等待生成起始条件和发送从机地址
while (!(IFG2 & UCB0TXIFG))
{
DelayCounter ++;
IF (DelayCounter >= Delay_Limit)
中断;
}
//如果产生起始条件超时,则发送停止位
IF (DelayCounter >= Delay_Limit)
{
*pSentByte = NumberOfBytesSent;
UCB0CTL1 |= UCTXSTP;
返回-1;
}
//起始位和从器件地址已成功发送,
//接下来发送数据缓冲区中的所有数据
for (NumberOfBytesSent = 0;NumberOfBytesSent < ByteCount;NumberOfBytesSent++)
{
UCB0TXBUF=*DataPointer;
DelayCounter = 0;
//检查字节是否已发送
while (DelayCounter < DELAY_LIMIT &&(!(IFG2和 UCB0TXIFG)||(UCB0CTL1和 UCTXSTT)))
{
DelayCounter++;
}
//检查是否发生 NACK 条件
if (DelayCounter >= delay_limit)
{
*pSentByte = NumberOfBytesSent;
//发送停止条件
UCB0CTL1 |= UCTXSTP;
返回-1;
}
//此处已成功发送一个字节
DataPointer++;
}
//发送所有数据,清除 TX 标志,发送停止位
IFG2 &=~UCB0TXIFG;
UCB0CTL1 |= UCTXSTP;
DelayCounter = 0;
while (DelayCounter < DELAY_LIMIT &&((UCB0CTL1 & UCTXSTP)))
{
DelayCounter++;
}
*pSentByte = NumberOfBytesSent;
//检查是否发生 NACK 条件
IF (DelayCounter >= Delay_Limit)
{
UCB0CTL1 |= UCSWRST;
返回-1;
}
其他
返回0;
}
我的问题是当在中断点停止执行时、为什么 UCTXSTP 位和 UCTXSTT 位 已经置位?
谢谢