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.

[参考译文] MSP430F5419A:MSP430F5419A UART 接收到错误的数据

Guru**** 2537290 points
Other Parts Discussed in Thread: MSP430F5419A, MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/731438/msp430f5419a-msp430f5419a-uart-receive-wrong-data

器件型号:MSP430F5419A
主题中讨论的其他器件: MSP430F5529

您好!

我遇到了一个看起来很简单的 UART 问题、尤其是 MSP430F5419A 芯片组上的 UCA3端口。 由于我能够正确传输(使用 Widows 应用程序验证接收的数据)、设置看起来正常、但当我尝试将此 Windows 应用程序中的数据发送到芯片组时、接收到的数据看起来是随机的。 我用 Saleae 探测引脚并通过导线确认数据字节是正确的、但 UCA3RXBUF 读数错误。 我还检查了接线、以确保它们与相应的引脚进行了所有连接。

BTW、我对 UCA1 UART 使用了相同的设置例程、对此没有任何问题。

任何线索都值得赞赏、

ED

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您如何显示数据?
    是否可以对数据进行反转? 即、您得到的不是00000001、是10000000?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不是、尽管 Saleae 每次都以正确的顺序显示一致的正确数据、但接收到的数据看起来相当随机、没有特定的模式。 这是非常令人困惑的、因为 TX 通道没有任何问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有什么想法吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您需要共享您的软件。

    您不是程序中设置的波特率的精确倍数、您是吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    该软件的简单之处如下:

    数据= UCA3RXBUF;

    当我在这里放置一个断点时、UCA3RXBUF 寄存器看起来是随机的。 如前所述、TX 在同一端口上运行完美、因此我认为波特率的确切倍数不是这里的问题。 如果我想对该 RX 引脚产生任何板载干扰、但还不确定。

    感谢您的意见!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    数据是否易失?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Keith、

    否、但没关系? 我直接查看了 UCA3RXBUF、结果是错误的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Snuk、您好!

    这是一个奇怪的错误。 您说它适用于 UCA1、但不适用于 UCA3。 您能否发布 UART 设置和 ISR 代码? 除非您忘记将其中一个配置寄存器从 UCA1更改为 UCA3、否则我看不到开关 UART 端口会对任何内容产生什么影响。

    请通读我们 《MSP430 MCU 上常见 eUSCI 和 USCI 串行通信问题解决方案 》应用手册中的第3节"常见 UART 通信问题"。

    此致、

    James

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

    很奇怪! 最奇怪的是 TX 始终是完美的、但 RX 是垃圾。 总之、另一个奇怪的现象是、当我移动到9600波特(从14400波特)时、TX 和 RX 现在都能正常工作、而无需更改代码中的任何其他设置。 我目前没有时间进一步调查、但如果有人有任何线索、请进行评论。 谢谢!

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

    对于这些器件、我们看到许多用户没有遵循我们关于系统频率与电源电压以及 PMMCOREVx 设置的建议、如数据表中的图5-1所示。 如果您的系统时钟配置不正确、即使波特率设置正确、它也会波动足够大、从而影响 UART 通信。

    由于您使用的是 MSP430F5419A、因此您可以在 《MSP430x5xx 和 MSP430x6xx 系列用户指南》中的第2.2.4节"增加 VCORE 以支持更高的 MCLK 频率"中阅读有关此内容的更多信息。 正如本节中特别提到的、VCORE 电平必须一次只增加一个电平。 以下步骤1至4显示了将 VCORE 提高一个电平的过程。 作为参考、下面是一个增加 VCORE 的 C 代码示例。 示例库提供了用于增加和减少 VCORE 的例程、应尽可能使用这些库。

    本节结尾还有一个重要说明。

    注意:MSP430驱动程序库(取代 MSP430 F5xx/F6xx 内核库)包含有用且易于使用的功能、可轻松配置和使用 PMM 模块。 MSP430驱动程序库可与 MSP430Ware 一起下载

    作为参考、这里是具有重要 SetVcoreUp()函数的类似 MSP430F5529的代码示例。 对于此示例、DCO 以25MHz 运行、因此必须使用此函数逐级提升内核电压、才能在25MHz 下正常运行。 请记住、您可能需要对 MSP430F5419A 代码的其他部分进行一些更改。

    MSP430F55xx_UCS_10.c

    /*-版权所有-、BSD_EX
    *版权所有(c) 2012、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    *
    ***
    *
    * MSP430代码示例免责声明
    *
    * MSP430代码示例是自包含的低级程序
    ,通常*以
    高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
    值*寄存器值和时钟配置等设置、
    并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
    *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
    *了解外设配置的 API 函数库方法。
    *
    *--/版权--*
    //*********
    // MSP430F552x 演示-具有25MHz DCO 的软件切换 P1.1
    //
    //说明:通过在软件循环内对 P1.1执行异或运算来切换 P1.1。
    // ACLK 在引脚 P1.0上被压掉,SMCLK 在 P2.2上被引出,MCLK
    //在引脚 P7.7上被引出。
    // ACLK = REFO = 32kHz、MCLK = SMCLK = 25MHz
    //
    MSP430F5529
    // --------
    // /|\| |
    // || P1.0|->ACLK
    // -|RST P7.7|->MCLK
    // | P2.2|->SMCLK
    // | |
    // | P1.1|-->端口引脚切换
    //
    Bhargavi Nisarga
    // Texas Instruments Inc.
    // 2009年4月
    //使用 CCSv4和 IAR Embedded Workbench 构建版本:4.21
    //*********
    #include 
    
    void SetVcoreUp (unsigned int level);
    
    int main (void)
    {
    volatile unsigned int I;
    
    WDTCTL = WDTPW+WDTHOLD; //停止 WDT
    P1DIR |= BIT1; // P1.1输出
    
    P1DIR |= BIT0; // ACLK 设置为引脚
    P1SEL |= BIT0;
    P2DIR |= BIT2; // SMCLK 设置为引脚
    P2SEL |= BIT2;
    P7DIR |= BIT7; // MCLK 设置为引脚
    P7SEL |= BIT7;
    
    //将 Vcore 设置增加到3级以支持 fsystem=25MHz
    //注意:一次改变一级内核电压。
    SetVcoreUp (0x01);
    SetVcoreUp (0x02);
    SetVcoreUp (0x03);
    
    UCSCTL3 = SELREF_2; //设置 DCO FLL 基准= REFO
    UCSCTL4 |= SELA _2; //设置 ACLK = REFO
    
    __bis_SR_register (SCG0); //禁用 FLL 控制环路
    UCSCTL0 = 0x0000; //设置可能的最低 DCOx、MODx
    UCSCTL1 = DCORSEL_7; //选择 DCO 范围50MHz 操作
    UCSCTL2 = FLLD_0 + 762; //将 DCO 乘法器设置为25MHz
    //(N + 1)* FLLRef = Fdco
    //(762 + 1)* 32768 = 25MHz
    //设置 FLL Div = fDCOCLK/2
    __BIC_SR_register (SCG0); //启用 FLL 控制环路
    
    // DCO 范围位已
    更改时最坏情况下的稳定时间//为 n x 32 x 32 x f_MCLK /f_FLL_reference。
    有关优化、请参阅5xx // UG 中的 UCS 一章。
    // 32 x 32 x 25MHz / 32、768Hz ~ 780k MCLK 周期、以便 DCO 稳定
    __delay_cycles (782000);
    
    //循环、直到 XT1、XT2和 DCO 稳定-在本例中、只有 DCO 必须稳定
    执行
    {
    UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);
    //清除 XT2、XT1、DCO 故障标志
    SFRIFG1 &=~OFIFG; //清除故障标志
    } while (SFRIFG1&OFIFG); //测试振荡器故障标志
    
    
    while (1)
    {
    P1OUT ^= BIT1; //切换 P1.1
    _DELAY_CYCLES (600000); //延迟
    }
    
    
    void SetVcoreUp (unsigned int level)
    {
    //打开 PMM 寄存器以写入
    PMMCTL0_H = PMMPW_H;
    //设置 SVS/SVM 高电平新电平
    SVSMHCTL = SVSHE + SVSHRVL0 *电平+ SVMHE + SVSMHRRL0 *电平;
    //将 SVM 低电平设置为新电平
    SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 *电平;
    //等待 SVM 稳定
    ,而 SVSMLCTL = SVSMLCTL (SVSMLLY0)= SVSMLPMIFG = SVSMLPM0);//等待 SVSMLPMIFG (= SVSM
    //清除已设置的标志
    PMMIFG &=~(SVMLVLRIFG + SVMLIFG);
    //将 VCORE 设置为新的电平
    PMMCTL0_L = PMMCOREV0 *电平;
    //如果
    ((PMMIFG & SVMLIFG)))、则等待达到新的电平
    while (((PMMIFG & SVMLVLRIFG)=0);
    //将 SVS/SVM 低电平设置为新的电平
    SVSMLCTL = SVSLE + SVSLRVL0 *电平+ SVMLE + SVSMLRRL0 *电平;
    //锁定 PMM 寄存器以进行写访问
    PMMCTL0_H = 0x00;
    } 

    但愿这对您有所帮助。

    此致、

    James