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.

[参考译文] MSP430FR2355:UART 未发送所有数据?

Guru**** 2534260 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1001474/msp430fr2355-uart-not-transmitting-all-the-data

器件型号:MSP430FR2355

您好...

我有四个8字节的消息要发送到对讲机。  我注意到我在逻辑分析仪上发送7、7、8……前三个数据块中每个数据块的最后一个字节都已截止而不发送……我的代码如下:

                else if (Button == DEFINE_SYS)
                {
                    for (sysLoop = 0; sysLoop < 4; sysLoop++)
                    {
                        mssg[4] = sysID[2*sysLoop];
                        mssg[5] = sysID[2*sysLoop + 1];
                        mssg[6] = crc[2*sysLoop];
                        mssg[7] = crc[2*sysLoop + 1];
                        TB0CCR2 = TB0R + 1;
                        TB0CCTL2 |= CCIE;
                        LPM3;
                        while (!UCTXCPTIFG);
                    }

我注意到、如果我删除

                        while (!UCTXCPTIFG);

并替换为__delay_cycles (10000);每条消息的所有八个字节都被发出....

该代码应按如下方式工作:

创建8字节消息...等待80ms ...通过 UART 传输8字节,然后唤醒以创建第二条消息...进入睡眠状态并再次等待80ms

我看到了两个我目前不理解的问题。

1、 前7个字节会输出、但前3条消息上的第8个字节不会输出?

2 、字节都是背靠背的、每个字节之间没有80ms 的窗口?

有人能告诉我需要查找的内容吗?  我尝试使用 UCTXCPTIFG 是因为我认为 LPM3由于另一个 ISR (可能是 TBxIFG 标志之一)而被唤醒。

其他代码段如下所示:

80ms 唤醒  

      case TB0IV_TBCCR2:
          TB0CCR2 = TB0R + TX_MESSAGE_SPACING_TIME;
          if (remote)
          {
              pTx = mssg;
              TB0CCTL2 &= ~CCIE;
              UCA1IFG |= UCTXIFG;
              UCA1IE |= UCTXIE;
          }
          break;

TX ISR:(else 部分仅在此处有效)

      case USCI_UART_UCTXIFG:
          if (radioConfiguration)
              LPM3_EXIT;
          else {
              UCA1TXBUF = *pTx;
              pTx++;
              if (pTx > (mssg + 7)) {
                  UCA1IE &= ~UCTXIE;
                  UCA1IFG &= ~UCTXIFG;
                  LPM3_EXIT;
              }
          }
          break;

最后一个想法……波特率为19.2k、其中1个开始位和1/2个停止位… 8个字节完全在80ms 周期内。

谢谢

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

    > while (!UCTXCPTIFG);

    UCTXCPTIFG 是一个常数(并且!= 0)、所以这一点不会延迟。 您可能需要"while (UCA1IFG & UCTXCPTIFG)"、但您实际上不是由于 Erratum USCI42 [参考勘误表(SLAZ695h)第8页]。

    由于您到达这里时、最终字节已被放入 TXBUF 中、我建议使用类似的方法

    > while (UCA1STATW & UCBUSY)/*empty*/; //等待最后一个字节

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

    是否有任何想法说明为什么来自 UART 的数据持续发送全部4个字节、而不是在每组8个字节后等待?

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

    您是指4个数据包吗? 对于每一个、您都设置了 TB0CCR2=TB0R+1、即"很快"、因此您在定时器 ISR 中所做的更改不会太大。 也许您 打算在 for ()循环之外执行该操作?

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

    CCR + 1是好的...(32kHz 时钟源)...事实证明我是从 TX UART 出来的,我的80ms 计时器仍然在运行,所以我会反复回到传输中...我通过对 CCR 标志进行快速等待找到它..... 我还认为我有一个工作要解决,不使用 UCBUSY 标志,这是我很高兴的一个关键....我讨厌使用标志与中断....我将在 ISR 关闭后创建用于主系统运行的软标志,但 UART 应该(并且看起来可以) 设置为仅使用中断

    感谢您的帮助!

    Steve