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.

[参考译文] MSP430F5528:MSP430F5528 UART 无法识别超过一半的 ASCII 表字符

Guru**** 2522770 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/806626/msp430f5528-msp430f5528-uart-cannot-recognize-more-than-half-of-ascii-table-characters

器件型号:MSP430F5528

您好!

我请求帮助解决以下问题: 我将字符从终端程序(PuTTY)提交到 UART 接收器的输入、在 RX 中断中、我将接收到的符号放入发送缓冲区、但我无法正确接收超过 ASCII 表符号一半的数据、而不是接收到0xFF 的符号。 UART 启动后、我会看到正确的测试消息、因此我怀疑 TX 部件工作正常。 第二个问题是 UART 开始发送符号、而不等待接收结束 随附了逻辑分析仪的代码和屏幕截图。

如果这个问题得到解决,我将不胜感激。

代码

// Init UART
static void MSP430_UART_init ()
{

//将 USCI 状态机复位 UCA1CTL1 |= UCSWRST; // P4.4、5 = USCI_A1 TXD/RXD P4SEL |= BIT4 | BI5; UCA1CTL1 |= UCSSEL1; UCA1BR0 = 34;// 115200 UCA1BR1 = 0;= UCB1CTL |= 0 ;/ UCA1BR1 > 6 //使 USCI 状态机退出复位 UCA1CTL1 &=~UCSWRST; //启用 RX 中断。 UCA1IE |= UCRXIE; PUS_U1 ("hello!\r\n");//看到这是正确 的} //中断处理程序 #pragma vector = USCI_A1_vector __interrupt void USCI_A1_ISR (void) { volatile uint8_t symbol; switch (__evo_in_range (UCA1IV、4)) { 情况0:中断; //向量0 -无中断 案例2: //向量2 - RXIFG 符号= UCA1RXBUF; putchar_U1 (符号); 中断; 案例4: //向量4 - TXIFG 中断; 默认值:break; } } //发送调试信息 //将字符发送到 UART1 void putchar_U1 (uint8_t ch) { while (!(UCA1IFG & UCTXIFG)){;} UCA1TXBUF = ch; } //将字符串发送到 UART1 void puts_U1 (uint8_t * str) { while (* str) { putchar_U1 (* str++); } }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不做寄存器,我自己是 DriverLib()人,但你是否将它设置为7位模式而不是8位模式?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Keith、谢谢您的回复。
    在这里、它是其他东西。 我没有很正确地描述问题-数字和符号"A"至"d"和"n"至"W"被错误地取走、无论是小写还是大写、这可以在屏幕截图中看到、屏幕截图上显示了两个相邻符号的接收位置。 我不使用国家符号、因此7位或8位格式无关紧要。我怀疑使用 DriverLib API 不会解决这个问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     "

        case2:                             // Vector 2 - RXIFG
            symbol = UCA1RXBUF;
            putchar_u1(symbol);           //  This is probably a bad idea in an ISR        For echo use registers
            break
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、Peter、我完全同意这一点、并尽可能使用延迟中断。 所有这些都是从搜索这种简单代码不起作用的原因开始的。

    #pragma vector = USCI_A0_vector

    _interrupt void USCI_A0_ISR (void)

    void __attribute__((中断(USCI_A0_Vector)) USCI_A0_ISR (void)
    {
    volatile uint8_t symbol;
    
    if (UCA0IFG & UCRXIFG!= 0)
    {
    符号= UCA0RXBUF;
    serial_buf[head++]=符号;
    if (head = max_idx)
    {
    头部= 0;
    }
    if (symbol =='\n')
    {
    //请楼上说明 
    //... LED_RED_TOGGLE; } }

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

    遗憾的是、我目前无法详细查看软件、但我想向您介绍该器件的 UART 软件示例、网址为 :dev.ti.com/.../node

    有一些 UART 回波示例、您应该能够按原样运行以进行测试。

    请测试这些内容、并告知我们它们是否适合您。

    谢谢、
    JD
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这些是有问题时钟的症状。 第一个猜测是 SMCLK 不是很高的4MHz (3%以内)。 尝试:

    1) 1)在 P2.2上输出 SMCLK 并使用示波器进行测量

    和/或

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

    Bruce、非常感谢您给出的提示、我检查了 SMCLK 的频率、它是石英频率的两倍(在 XT2上使用它)。 因此、我更改了 UART 的初始化常量并消除了该问题。 我不是 MSP430的新手、所以可能我忘了正确初始化时钟。
    非常感谢!