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.

[参考译文] CCS/MSP430FR2355:UART 通信存在问题

Guru**** 2543540 points
Other Parts Discussed in Thread: MSP430FR2355

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/830825/ccs-msp430fr2355-problem-with-uart-communication

器件型号:MSP430FR2355

工具/软件:Code Composer Studio

您好!

我尝试通过 UART 通信将 MSP430FR2355与 PC 相连、以通过键盘回显我输入的字符。 我将示例代码 msp430fr235x_euscia0_UART_01.c 从 TI Resource Explorer 复制到 PC 上的 CCS V8。 如说明中所述、我应该得到我在 CCS 终端上输入的字符的回显、但这对我不起作用。 光标正在闪烁,但我无法在终端上输入任何字符。

此致

Sourav Prasad

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

    根据 Launchpad 数据表(SLAU680)第2.2.4节、反向通道 UART 连接到 UCA1、此示例与 UCA0通信。 (这看起来像是监督。)

    最简单的补救方法可能是将 J1上的 P1.6/P1.7引脚跳线至 J101 USB 侧的 RXD/TXD (专用)引脚("桥接接头")。 (当然、您必须移除 J101跳线。)

    或者、将所有 UCA0引用更改为 UCA1、并将 P1SEL0.6/7的行更改为 P4SEL0.2/3 [参考数据表(SLASEC4B)表6-66。]

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

    您好、Bruce、

    第一种方法(J1上的跳线 P1.6/P1.7引脚到 RXD/TXD) 对我来说工作正常、例如代码 msp430fr235x_euscia0_UART_01.c。 我通过键盘输入的字符出现在配置为波特率9600的 CCS v_8串行终端上。 我正在共享第一种方法的图像。

    但第二种方法不起作用。 为了配置反向通道 UART (UCA1)、我分别将 示例代码中的所有 UCA0和 P1SEL0.6/7引用更改为 UCA1和 P4SEL0.2/3。

    #include 
    
    void Init_GPIO();
    void Software_Trim (); //获取最佳 DCOFTRIM 值
    #define MCLK_FREQ_MHz 的软件调整8. // MCLK = 8MHz
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗定时器
    
    //配置 GPIO
    Init_GPIO ();
    
    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的1个端口设置
    
    __bis_SR_register (SCG0); //禁用 FLL
    CSCTL3 |= SELREF_REFOCLK; //将 REFO 设置为 FLL 基准源
    CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;// DCOFTRIM = 3、DCO 范围= 8MHz
    CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
    __delay_cycles (3);
    __BIC_SR_register (SCG0); //启用 FLL
    Software_Trim (); //软件调整以获得最佳 DCOFTRIM 值
    
    CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源,ACLK = 32768Hz
    //默认 DCODIV 作为 MCLK 和 SMCLK 源
    
    //配置 UART 引脚
    P4SEL0 |= BIT2 | BIT3; //将2-UART 引脚设置为第二功能
    
    //配置 UART
    UCA1CTLW0 |= UCSWRST;
    UCA1CTLW0 |= UCSSEL_SMCLK;
    
    //波特率计算
    // 8000000 /(16*9600)= 52.083
    //分数部分= 0.083
    //用户指南表17-4:// UCBx
    = 0x52
    (UCBx = 0X*)= 52.083 // 8000000/16/9600
    UCA1BR1 = 0x00;
    UCA1MCTLW = 0x4900 | UCOS16 | UCBRF_1;
    
    UCA1CTLW0 &=~UCSWRST; //初始化 eUSCI
    UCA1IE |= UCRXIE; //启用 USCI_A0 RX 中断
    
    __bis_SR_register (LPM3_bits|GIE); //输入 LPM3,中断启用
    __NO_OPERATION (); //对于调试
    器}
    
    void Software_Trim ()
    {
    unsigned int oldDcotTap = 0xFFFF;
    unsigned int newDcoTap = 0xFFFF;
    unsigned int newDcoDelta = 0xFFFF;
    unsigned int bestDcoDelta = 0xFFFF;
    unsigned int csCtl0Copy = 0;
    unsigned int csCtl1Copy = 0;
    无符号 int csCtl0Read = 0;
    无符号 int csCtl1Read = 0;
    unsigned int dcoFreqTrim = 3;
    unsigned char endLoop = 0;
    
    操作
    {
    CSCTL0 = 0x100; // DCO 抽头= 256
    操作
    {
    CSCTL7 &=~DCOFFG; //清除 DCO 故障标志
    } while (CSCTL7 & DCOFFG); //测试 DCO 故障标志
    
    __DELAY_CYCLLES ((unsigned int) 3000 * MCLK_FREQ_MHz);//等待 FLL 锁定状态(FLLUNLOCK)保持稳定
    //建议等待24个经过分频的 FLL 参考时钟周期
    while (((CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1))和&((CSCTL7 & DCOFFG)= 0));
    
    CSCCtl0Read = CSCTL0; //读取 CSCTL0
    CSCCtl1Read = CSCTL1; //读取 CSCTL1
    
    oldDcoTap = newDcoTap; //记录上次的 DCOTAP 值
    NewDcoTap = csCtl0Read & 0x01ff; //获取此次的 DCOTAP 值
    dcoFreqTrim =(csCtl1Read & 0x0070)>>4;//获取 DCOFTRIM 值
    
    if (newDcoTap < 256) // DCOTAP < 256
    {
    newDcoDelta = 256 - newDcoTap; // DCPTAP 和256之间的增量值
    if ((oldDcotap!= 0xFFFF)&&(oldDcotap >= 256)// DCOTAP 交叉256
    endLoop = 1; //停止 while 循环
    其他
    {
    dcoFreqTrim --;
    CSCTL1 =(csCtl1Read &(~DCOFTRIM))|(dcoFreqTrim<4);
    }
    }
    其他 // DCOTAP >= 256
    {
    newDcoDelta = newDcoTap - 256; // DCPTAP 和256之间的增量值
    if (oldDcoTap < 256) // DCOTAP 交叉256
    endLoop = 1; //停止 while 循环
    其他
    {
    dcoFreqTrim++;
    CSCTL1 =(csCtl1Read &(~DCOFTRIM))|(dcoFreqTrim<4);
    }
    }
    
    if (newDcoDelta < bestDcoDelta) //记录最接近256的 DCOTAP
    {
    csCtl0Copy = csCtl0Read;
    csCtl1Copy = csCtl1Read;
    bestDcoDelta = newDcoDelta;
    }
    
    }while (endLoop =0); //轮询直至 endLoop = 1
    
    CSCTL0 = csCtl0Copy; //重新加载锁定的 DCOTAP
    CSCTL1 = csCtl1Copy; //重新加载锁定的 DCOFTRIM
    while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));//轮询直至 FLL 锁定
    }
    
    
    #if defined (_TI_Compiler_version_)|| Defined (_IAR_systems_ICC_)
    #pragma vector=USCI_A0_vector (
    _ void USC_ISR_ISR (_ void
    
    )(_ nvoid _translation_rupt_
    
    )(_ void _if_if_ifor_ifor_ifor_transl_)(_ u_ifor_ifor_ifor_ifor_ifor_ifor_ifor_ifor_ifor_transl_)(_)
    #endif
    {
    switch (__even_in_range (UCA1IV、USCI_UART_UCTXCPTIFG))
    }{
    USCI_NONE 案例:中断;
    USCI_UART_UCRXIFG 案例:
    while (!(UCA1IFG&UCTXIFG));
    UCA1TXBUF = UCA1RXBUF;
    __no_operation();
    中断;
    案例 USCI_UART_UCTXIFG:中断;
    案例 USCI_UART_UCSTTIFG:中断;
    案例 USCI_UART_UCTXCPTIFG:中断;
    默认值:break;
    }
    void
    
    Init_gpio()
    {
    P1DIR = 0xFF;P2DIR = 0xFF;
    P1REN = 0xFF;P2REN = 0xFF;
    P1OUT = 0x00;P2OUT = 0x00;
    } 




    该代码不适用于反向通道 UART (UCA1)。 请帮助我配置反向通道 UART。





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

    >#pragma vector=USCI_A0_vector

    这实际上也是对 UCA0的引用。 尝试:

    >#pragma vector=USCI_A1_vector

     

     

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

    谢谢 Bruce。 最后、它工作得非常好。