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.

[参考译文] MSP430FR2111:请告诉我如何使用 UART 进行串行通信。

Guru**** 2693905 points

Other Parts Discussed in Thread: MSP430FR2111

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1596034/msp430fr2111-please-tell-me-how-to-communicate-serially-using-uart

器件型号: MSP430FR2111

感谢 E2E 论坛的所有人的帮助。

我目前正在开发一个使用 Texas Instruments MSP430FR2111 MCU 的系统。

系统​​大约每天向外部 PC 发送一次测量值、以 UART 作为通信方法。

我创建了端口初始化和数据传输的源代码,并试图通过 FT232RL 使用 PC 终端应用程序接收数据,但出于某种原因,当 P1.6 (RxD) 连接到 FT232RL 的 TxD,数据无法从 P1.7 (TxD) 发送。

我被这个神秘的现象困扰:如果我断开连接 P1.6 (RxD) 到 FT232RL 的 TxD,数据可以从 P1.7 (TxD) 发送。

我有多个 FT232RL、所以我尝试了几个、但每个 FT232RL 的结果相同。
我随附了当前的源代码、虽然我很抱歉在您繁忙的日程安排期间打扰您、但如果您能告诉我如何解决问题、我将不胜感激。
提前感谢您。

#include <msp430.h>
#include <stdint.h> 

#pragma DATA_SECTION(accumulated_distance, ".myFRAM")
volatile uint32_t accumulated_distance;

#pragma DATA_SECTION(magic_flag, ".myFRAM")
volatile uint32_t magic_flag;

#define MAGIC_INITIALIZED   0xFFFFFFF0      // 2025.12.03
#define SMCLK_FREQ_HZ       1000000UL       // 2025.12.09
#define UART_BRW_VALUE      104
#define UART_MCTLW_VALUE    (UCOS16 | (2 << 4) | (0 << 8))

volatile uint8_t inc_flag = 0;

__interrupt void Port_1(void);

void uart_putc(char c);
void uart_puts(const char *s);

#define MCLK_FREQ_MHZ 1                     // MCLK = 1MHz

int main(void) {
    WDTCTL = WDTPW | WDTHOLD;               // Stop watchdog timer
    SYSCFG0 = FRWPPW;                       // 

    __bis_SR_register(SCG0);                // Disable FLL
    CSCTL3 = SELREF__REFOCLK;               // Set REFO as FLL reference source
    CSCTL1 = DCOFTRIMEN_0 | DCORSEL_0;      // DCO Range = 1MHz
    CSCTL2 = FLLD_0 + 30;                   // DCODIV = 1MHz
    __delay_cycles(3);
    __bic_SR_register(SCG0);                // Enable FLL
    CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK; // set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz
                                               // default DCODIV as MCLK and SMCLK source

    //
    // P1.0 / A0
    P1SEL0 |= BIT0; P1SEL1 |= BIT0;

    // P1.1 / A1
    P1DIR |= BIT1;

    // P1.3 / A3
    P1SEL0 &= ~BIT3; P1SEL1 &= ~BIT3;   //
    P1DIR &= ~BIT3;                     //
    P1IES |= BIT3;                      //
    P1IFG &= ~BIT3;                     //
    P1IE |= BIT3;                       //

    // P1.4 / A4
    P1SEL0 &= ~BIT4; P1SEL1 &= ~BIT4;   //
    P1DIR |= BIT4;                      //
    P1OUT &= ~BIT4;                     //

    // P1.5 / A5
    P1SEL0 &= ~BIT5; P1SEL1 &= ~BIT5;   //
    P1DIR |= BIT5;                      //
    P1OUT &= ~BIT5;                     //

    // P2.0
    P2SEL0 &= ~BIT0; P2SEL1 &= ~BIT0;   //
    P2DIR  |= BIT0;                     //
    P2OUT  |= BIT0;                     //

    // P2.1
    P2SEL0 &= ~BIT1; P2SEL1 &= ~BIT1;   //
    P2DIR &= ~BIT1;                     //

    // UART
    // P1.6 = UCA0RXD, P1.7 = UCA0TXD
    // 1) stop eUSCI_A
    
    //----------------------------------------------------------
    // (1) RXD (P1.6)
    //----------------------------------------------------------
    P1DIR &= ~BIT6;      // RXD input
    P1OUT |= BIT6;       // pull-up
    P1REN |= BIT6;       // enable pull-up

    //
    __delay_cycles(200000);   // 200ms @1MHz

    //----------------------------------------------------------
    // (2) Function change
    //----------------------------------------------------------
    P1REN &= ~BIT6;            //
    P1SEL0 |=  BIT6 | BIT7;    //
    P1SEL1 &= ~(BIT6 | BIT7);

    //----------------------------------------------------------
    // (3) DIR
    //----------------------------------------------------------
    P1DIR &= ~BIT6;     //
    P1DIR |=  BIT7;     //

    //----------------------------------------------------------
    // (4)
    //----------------------------------------------------------
    UCA0CTLW0  =  UCSWRST;        //
    UCA0CTLW0 |=  UCSSEL__SMCLK;  // SMCLK = 1MHz

    // 9600bps @ 1MHz
    UCA0BR0 = 104;
    UCA0BR1 = 0;
    UCA0MCTLW = 0;                //

    UCA0CTLW0 &= ~UCSWRST;        // UART start

    // UCA0IE |= UCRXIE;                //

    // ADC
    ADCCTL0 &= ~ADCENC;                 //
    ADCCTL1 |= ADCSHP | ADCSSEL_2;      //
    ADCCTL2 |= ADCRES_2;                //

    ADCMCTL0 |= ADCINCH_0;              //

    ADCCTL0 |= ADCON;                   //
    ADCIE |= ADCIE0;                    //
    
    PM5CTL0 &= ~LOCKLPM5;                   // Disable the GPIO power-on default high-impedance mode
                                            // to activate previously configured port settings

    // Check if this is first-ever run
    if (magic_flag != MAGIC_INITIALIZED){
        accumulated_distance = 0;           // Initialize on first run only
        magic_flag = MAGIC_INITIALIZED;
    }

    __delay_cycles(500000);

// Example
    uart_puts("U");

    while(1)							//
    {
        __low_power_mode_3();           //
        //
        if (inc_flag){
            accumulated_distance++;
            inc_flag = 0;
        }
    }
}

void uart_putc(char c) {
    while (! (UCA0IFG & UCTXIFG));      //
    UCA0TXBUF = c;                      // send
}

void uart_puts(const char *s){
    while (*s){
        uart_putc(*s++);
    }
}

// Port 1.x interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{    
   if (P1IFG & BIT3){                   //
        inc_flag = 1;                   //
        P1IFG &= ~BIT3;                 //
        __bic_SR_register_on_exit(LPM3_bits);
    }
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Takashi、

    因为您观察到在 FT232RL 未连接时 UART 可以正常工作、这似乎是硬件问题。

    我首先检查  MSP430FR2111 和 FT232RL 之间是否存在共享接地。 确保电压电平不匹配。 您是否确定不会混淆 FT232RL 的 TX 和 RX 引脚? 您是否尝试过探测连接?

    此致、

    Owen

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

    亲爱的欧文

    感谢您的答复。
    我似乎表达得不好。 让我再解释一次。
    MSP430FR2111 和 FT232RL 通过三根导线连接。
    MSP430FR2111 的角度来看、它们是 GND、TXD 和 RXD。
    这并不意味着它们没有连接。

    连接这三根导线后、当我发送数据时、发送的数据不会显示在 PC 的终端应用程序中。
    但是、如果我断开 RXD 线并仅连接 GND 和 TXD 线、发送的数据会显示在终端应用程序中。

    似乎被连接的 RXD 线阻碍了数据传输。
    你怎么看? 我是否解释过这种情况?

    当我发送字符“U"时“时、1 位的宽度大约为 104 μs。 我认为数字是正确的。

    为确保正常通信、必须连接三条线路 GND、TXD 和 RXD、因此电流连接不完整。

    在发送数据之前、我立即使用进行确定
    while(!(UCA0IFG & UCTXIFG));
    这个代码做出的决定,但我怀疑这一决定是否正确的第一个地方。

    我为这个问题道歉。 感谢您的建议。

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

    嗨、Takashi、

    我现在理解、感谢您的澄清。

    我仔细查看了您的代码、我相信问题可能出在配置引脚的方式上。

    这是您当前的代码:

    // UART
        // P1.6 = UCA0RXD, P1.7 = UCA0TXD
        // 1) stop eUSCI_A
        
        //----------------------------------------------------------
        // (1) RXD (P1.6)
        //----------------------------------------------------------
        P1DIR &= ~BIT6;      // RXD input
        P1OUT |= BIT6;       // pull-up
        P1REN |= BIT6;       // enable pull-up
    
        //
        __delay_cycles(200000);   // 200ms @1MHz
    
        //----------------------------------------------------------
        // (2) Function change
        //----------------------------------------------------------
        P1REN &= ~BIT6;            //
        P1SEL0 |=  BIT6 | BIT7;    //
        P1SEL1 &= ~(BIT6 | BIT7);
    
        //----------------------------------------------------------
        // (3) DIR
        //----------------------------------------------------------
        P1DIR &= ~BIT6;     //
        P1DIR |=  BIT7;     //
    
        //----------------------------------------------------------
        // (4)
        //----------------------------------------------------------
        UCA0CTLW0  =  UCSWRST;        //
        UCA0CTLW0 |=  UCSSEL__SMCLK;  // SMCLK = 1MHz
    
        // 9600bps @ 1MHz
        UCA0BR0 = 104;
        UCA0BR1 = 0;
        UCA0MCTLW = 0;                //
    
        UCA0CTLW0 &= ~UCSWRST;        // UART start
    
        // UCA0IE |= UCRXIE;                //

    从 SDK 示例 (msp430fr211x_euscia0_uart_01) 中:

    // Configure UART pins
      P1SEL0 |= BIT6 | BIT7;                    // set 2-UART pin as second function
    
      // Configure UART
      UCA0CTLW0 |= UCSWRST;
      UCA0CTLW0 |= UCSSEL__SMCLK;
    
      // Baud Rate calculation
      // 8000000/(16*9600) = 52.083
      // Fractional portion = 0.083
      // User's Guide Table 17-4: UCBRSx = 0x49
      // UCBRFx = int ( (52.083-52)*16) = 1
      UCA0BR0 = 52;                             // 8000000/16/9600
      UCA0BR1 = 0x00;
      UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;
    
      UCA0CTLW0 &= ~UCSWRST;                    // Initialize eUSCI
      UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
    

    不需要配置引脚方向。 在此 SDK 示例中、在配置 UART 之前、端口 1 上的所有 GPIO 都配置为输出并启用下拉电阻。

    这可能是您连接到  FT232RL 时 UART 无法正常工作的原因。 MSP430 RXD 引脚配置可能会干扰通信。

    我建议使用  msp430fr211x_euscia0_uart_01 和任何其他 MSP430 SDK 示例。

    此致、

    Owen

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

    亲爱的欧文·李

    感谢您的编程建议。
    我目前患有甲型流感,所以我只能测试你今天教我的计划。

    我尝试过、但问题仍然是一样的。
    我可以在连接两根导线时发送字符、即 TXD 和 GND、
    但在连接三根导线 (TXD、RxD 和 GND) 时无法发送字符。

    我不知道问题是什么。
    我该怎么办?

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

    嗨、Takashi、

    我仍然认为这是硬件问题、而不是 MSP430 问题。

    事实上、只有在连接 RXD 引脚时才会出现此问题、因此我想相信 USB 接地端和 MSP430 接地端之间可能存在接地环路、过大的电流消耗或接地基准之间存在电压差。

    我不熟悉  FT232RL、但可以验证 TXD 引脚的输出电压和电流是多少? 输出可能过强、正在向 MSP430 RXD 引脚注入电流。

    此致、

    Owen

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

    尊敬的 Owen:

    我谨致函告知大家、UART 通信问题已成功解决! 非常感谢您提供富有洞察力的建议。

    根本原因是初始化序列和硬件电源时序问题(反向供电)的组合。

    主要发现:

    GPIO 初始化:按照您的建议、正确设置 P1SEL0/1 并确保干净的转换至关重要。

    上电复位 (POR) 故障:我们发现、在 MSP430 本身上电之前、FT232RL(由 USB/平板电脑供电)正在向 MSP430 的 RXD 引脚输出 3.3V 电压。 由于通过 ESD 保护二极管进行反向供电、这导致 MSP430 无法通过上电复位 (POR)。

    稳定延迟:在配置 GPIO 引脚之后、释放 eUSCI 软件复位 (UCSWRST) 之前、增加~150ms 延迟、可显著提高可靠性。

    最终解决方案:

    硬件:将 FT232RL 的 VCCIO 引脚连接到 MSP430 的 VCC、以确保逻辑电平和电源状态同步。

    软件:应用了正确的 1MHz 波特率设置和稳定延迟、我们讨论了这些设置。

    系统现在正在完美地传输数据。 您的指导帮助我缩小了焦点、最终确定了电气原因。

    我非常感谢您的专业支持!

    此致、

    ----------------------------

    Takashi Yumita

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

    嗨、Takashi、

    我很高兴听到你找到了这个问题的解决办法。 如果您需要任何进一步的支持、请随时创建新主题。

    此致、

    Owen