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.

[参考译文] MSP430FR6989:I2C 卡在 UCBBUSY 上

Guru**** 2524460 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/855072/msp430fr6989-i2c-getting-stuck-at-ucbbusy

器件型号:MSP430FR6989

你(们)好

I2C 的读写操作正常、直到我使用 UART_A0并通过 TCP 上的 GPRS 调制解调器连接到服务器。 我正在使用 I2C 从 BME280读取数据、并每10秒将数据发送到服务器。 它第一次工作、在行 while (UCB1STAT 和 UCBBUSY)附近读取 I2C 中获得残桩。 如果我对这一行进行注释、它会卡在 while (UCBICTLW0和 UCTXSTT)的旁边。

unsigned int I2C_read (unsigned int SLV_addr、unsigned int reg_addr、unsigned int len、char * arr)
{
unsigned int i = 0;

while (UCB1STAT 和 UCBBUSY);
UCB1I2CSA = SLV_addr;
UCB1CTLW0 |= UCTR | UCTXSTT;

while (UCB1CTLW0和 UCTXSTT);
UCB1TXBUF = REG_addr;
while (!(UCB1IFG & UCTXIFG0));

UCB1CTLW0 &=~UCTR;
UCB1CTLW0 |= UCTXSTT;

while (UCB1CTLW0和 UCTXSTT);

for (i = 0;i < len;i++)
{
if (i == len - 1)
{
UCB1CTLW0 |= UCTXSTP;
}
while (!(UCB1IFG & UCRXIFG0));
ARR[i]= UCB1RXBUF;
}

while (UCB1CTLW0和 UCTXSTP);

return(i);
} 

如果我不使用 GPRS、同样的程序也可以正常工作。 请帮助。

此致

Vijay

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

    您好、Vijay、

    感谢您发帖。

    我们将对此进行研究、尽快返回给您。

    谢谢、

    是的  

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

    配置 I2C 模块时、是否在开始时进入复位模式、并在结束时退出?

    void Initialize_I2C (void)
    {
    //在配置开始前进入复位状态...
    UCB1CTLW0 |= UCSWRST;
    
    UCB1CTLW0.....
    
    //退出重置模式
    UCB1CTLW0 &=~UCSWRST;
    } 

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

    由于您说除非您使用 UCA0、否则它会起作用、因此我首先要查找的是 UCA0的代码。

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

    我不知道原因是什么、但相同的代码现在正在工作。 可能是一些松动的接线问题。 但我检查过它很多次。 我不确定。 感谢你能抽出时间