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.

[参考译文] MSP430F5340:MSP430F5340在使用电量监测计 IC BQ27545G1从电池 RRC1120读取数据时在 while 环路中挂起

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/824028/msp430f5340-msp430f5340-hangs-in-while-loop-while-reading-data-from-battery-rrc1120-with-fuel-gauge-ic-bq27545g1

器件型号:MSP430F5340

您好!

我正在使用 MSP430F5340控制器、该控制器与具有 BQ27545G1的 RRC1120电池相连。

我正在成功地执行以下步骤、

1、发送起始条件

2.发送地址。

3.发送写位

4.发送命令

5.发送起始条件

6.发送读位。

完成这些步骤后、我可以成功接收1个字节的数据。 但无法读取另一个数据字节 、因为它在 while (((UCB1IFG & UCRXIFG)=0)上挂起;  这个 while 循环。

我的 I2C 配置如下、

       P4SEL |= 0x06;

       // SMCLK、软件复位使能
       UCB1CTL1 |= UCSSEL_2 | UCSWRST;

       //主模式、I2C 模式、同步模式、地址从器件、10位
       UCB1CTL0 = UCMST | UCMODE_3 | UCSYNC;//| UCSLA10;

       //波特率:SMCLK (12MHz)/(400kHz)=30=0x1E
       UCB1BR0 = 0x1E;
       UCB1BR1 = 0x00;

       //从器件地址
       UCB1I2CSA = 0x55;

       //清除 SW 复位以启用操作
       UCB1CTL1 &=~UCSWRST;

请帮助我解决这个问题,因为它在这里挂起。

提前感谢。

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

    您好!

    感谢您的发帖、我们将为您详细介绍这一点。

    祝你一切顺利、

    Colin Adema

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

    您好!

    您是否确认要发送从器件地址以及步骤6中的读取位?

    祝你一切顺利、

    Colin

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

    您好!

    在步骤6中、我不会再次发送从器件地址。

    我正在发送的从器件地址。

    以下代码是我的 I2C 初始化部分、

           //分配 I2C 引脚 P4.2 (SCL)和 P4.1 (SDA)
           P4SEL |= 0x06;
           //   P4DIR |=(BIT1);
           // SMCLK、软件复位使能
           UCB1CTL1 |= UCSSEL_2 | UCSWRST;
           //主模式、I2C 模式、同步模式、地址从器件、10位
           UCB1CTL0 = UCMST | UCMODE_3 | UCSYNC;//| UCSLA10;
           //波特率:SMCLK (25MHz)/(400kHz)=62.5=0x3E
           UCB1BR0 = 0x1E;
           UCB1BR1 = 0x00;
           //清除 SW 复位以启用操作
           UCB1CTL1 &=~UCSWRST;
    初始化后、我将使用以下代码与从器件通信。
       uint8_t ucRxdata[2]={};
         UCB1I2CSA = 0x55;
             UCB1CTL1 |= UCTR | UCTXSTT;
             //轮询发送中断标志。
             while (!(UCB1IFG & UCTXIFG))
             {
                 ;
             }
             /*将命令发送到 bq27441 */
             IF (UCB1IFG 和 UCTXIFG)
             {
                 //发送数据的第一个字节
                 UCB1TXBUF = 0x2C;
             }
             int i、j;
             //超时
             (i=0;i<1000;i++)
             {
                 IF (UCB1IFG 和 UCTXIFG)
                     中断;
             }
             /* I2C 无法发送命令、因此我们无法从 bq27441读取数据
              *所以只需返回
              *
             如果(i = 1000)
             {
                 返回-1;
             }
             //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
             //将主机设置为接收模式,发送启动条件
             UCB1I2CSA = 0x55;
             UCB1CTL1 &=~UCTR;
             UCB1CTL1 |= UCTXSTT;
             int num =2;
             while (num > 0){
                 对于(i=0;i<1000;i++){
                     IF (UCB1IFG 和 UCRXIFG){
                         /*加载 TX 缓冲器*/
                         ucRxdata[0]= UCB1RXBUF;
                         /*减量 TX 字节计数器*/
                         编号--;
                         UCB1IFG &=~UCRXIFG;
                         中断;
                     }
                 }
                 对于(j=0;j<100000;j++){
                     IF (UCB1IFG 和 UCRXIFG){
                         /*加载 TX 缓冲器*/
                         ucRxdata[1]= UCB1RXBUF;
                         /*减量 TX 字节计数器*/
                         编号--;
                         UCB1IFG &=~UCRXIFG;
                         中断;
                     }
                 }
                 如果((i =1000)||(j =100000)){
                     返回-1;
                 }
             }
             //发送停止条件。
             UCB1CTL1 |= UCTXSTP;
             /*清除 USCI_B1 TX int 标志*/
             UCB1IFG &=~UCTXIFG;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    要添加到上述回复、代码始终悬挂在以下部分(同时从从从从器件读取数据的第二个字节)。

    请参阅突出显示的行以了解确切的错误点。

    对于(j=0;j<100000;j++){
                     IF (UCB1IFG 和 UCRXIFG){
                         /*加载 TX 缓冲器*/
                         ucRxdata[1]= UCB1RXBUF;
                         /*减量 TX 字节计数器*/
                         编号--;
                         UCB1IFG &=~UCRXIFG;
                         中断;
                     }

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

    您好!

    我目前正在尝试重新创建您的设置、以查看我可以做些什么来解决该问题、但我注意到的一件事是我看不到该行  

    PM5CTL0 &=~LOCKLPM5;

    禁用 GPIO 上电默认高阻抗模式。 您是否在您尚未共享的代码中的某个位置拥有这行代码? 如果不是、则可能是问题、或至少一个问题。

    此致、

    Colin Adema

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

    您好!

    谢谢提示、我的代码中没有这样的行。

    您能不能建议我在哪里添加这一行。 我在引脚分配后尝试添加时遇到了一个问题。 我在下面添加了问题的屏幕截图。

    如果您有适用于我的设置的任何示例代码、请与我们分享、以供我参考。 这将对我大有帮助。

    此致

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

    您好!

    抱歉、您使用的设备上不需要该代码行、我忽略了这一点。

    下面是 TI Resource Explorer 中设置 I2C 的一些示例代码、但它使用 USCI_B0而不是 B1、如代码中所示:

    P3SEL |= 0x03; //将 I2C 引脚分配给 USCI_B0
    UCB0CTL1 |= UCSWRST; //启用 SW 复位
    UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主设备,同步模式
    UCB0CTL1 = UCSSEL_2 + UCSWRST; //使用 SMCLK
    UCB0BR0 = 12; // fSCL = SMCLK/12 =~100kHz
    UCB0BR1 = 0;
    UCB0I2CSA = 0x48; //从器件地址为048h
    UCB0CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作
    UCB0IE |= UCRXIE; //启用 RX 中断
    RXCompare = 0x0; 

    您可以通过以下链接找到其余代码和其他示例:  

    http://dev.ti.com/tirex/explore/node?node=APvjUT.Wo5XXtuhtROdtEw__IOGqZri__LATEST

    是否有理由选择轮询而不使用中断?

    最棒的

    Colin Adema

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

    Dipin、您好!

    您是否能够解决您的问题?

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

    Dipin、您好!

    几天以来,我们都没有听到您的声音,因此我假设您能够解决您的问题。
    如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。
    如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。