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.

[参考译文] MSP430FR6043:MSP430FR6043C 串行端口接收中断始终会触发错误 UCRXERR

Guru**** 666710 points
Other Parts Discussed in Thread: MSPWARE, EVM430-FR6043, MSP-EXP430F5529LP
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1258785/msp430fr6043-msp430fr6043c-serial-port-receive-interrupt-always-triggers-error-ucrxerr

器件型号:MSP430FR6043
主题中讨论的其他器件:MSPWAREEVM430-FR6043MSP-EXP430F5529LP

大家好、

客户有问题需要您的帮助:

MSP430FR6043C 串行端口接收有时会中断、我连续发送十次、可能只有一个正确接收。  使用的外部晶体振荡器是8M、发送的数据根本没有问题。  我可以问一下哪里没有配置吗?

//UART1
// UART 模式的 GPIO 配置
P1SEL0 |=(BIT2 | BIT3);
P1SEL1 &=~(BIT2 | BIT3);

//将 USCI_A1配置为 UART 模式,8位数据,1个停止位
UCA1CTLW0 = UCSWRST;//将 eUSCI 置于复位状态
UCA1CTLW0 |= UCSSEL_SMCLK + UCRXEIE;// CLK = SMCLK

// 8MHz、并且波特率=115200 (请参见 UG)
UCA1BRW = 4;
// UCBRSx (位7-4)= 0x55、UCBRFx (位3-1)= 5、UCOS16 (位0)= 1
UCA1MCTLW = 0x5551;

UCA1CTLW0 &=~μ H UCSWRST;//从复位中释放

UCA1IE |= UCRXIE;//启用接收中断

接收中断

__interrupt void hal_uart_ISR (void)
{
 switch (_ even_in_range (UCA1IV、18))
 {
  用例 USCI_NONE:
   中断;
  案例 USCI_UART_UCRXIFG:

   if (((UCA1STATW&UCRXERR)=UCRXERR)
   {//出现错误,错误不是由溢出引起的

      。     
   }
   否则
   {//串行端口没有错误

   }
   中断;
  案例 USCI_UART_UCTXIFG:
   中断;
  案例 USCI_UART_UCSTTIFG:
   中断;
  案例 USCI_UART_UCTXCPTIFG:
  中断;
 }

我参考 MSPware 例程。 我使用 EVM430-FR6043的演示板。 软件将在 UltrasonicGasFR6043_02_30_00_01中添加介绍此问题的段落。 另一个是 GPIO 适配。  会出现  UCRXERR、有时它可以正常接收。  该测试工具使用串行端口工具发送的消息。  单独测试发送没有问题、但接收有问题。

谢谢。此致、

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

    大家好、

    有任何更新吗?

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

    您好!

    代码看起来没有问题。 只是想检查客户是否使用较低的波特率、如9600。 他们是否仍然发现此问题?  

    如果使用较低的波特率可以解决该问题、那么他们可能需要在硬件侧进行检查、以降低 UAT 引脚上的噪声水平。

    此致、

    现金豪

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

    奇怪、我 MSP-EXP430F5529LP 在4MHz 这适用于我:

    #include <msp430.h>
    #include <stdint.h>
    #include <stdio.h>
    #include "sin.h"
    
    // print buffer - and the initial message
    char print[256]="We are go!\r\n\0";
    char *pindex=print;
    
    int main(void)
    {
      // Stop WDT
      HWREGW( WDT_A_BASE | WDTCTL ) = WDTPW|WDTHOLD;
    
      // stop interupts whilst we configure
      __disable_interrupt();
    
      // now set up USCI_A1 - as a UART
      // disable USCI A1
      HWREGB( USCI_A1_BASE | UCAxCTL1 ) |= UCSWRST;
      // Clock source SMCLK
      HWREGB( USCI_A1_BASE | UCAxCTL1 ) = 
        (HWREGB( USCI_A1_BASE | UCAxCTL1 )&0x3f)|0x80;
      // Configure UART
      // No Parity 0xc0 = 00
      // LSB first 0x20 = 0
      // UC7BIT = 8bit 0x10 = 0
      // One Stop bit 0x08 = 0
      // USCI mode = UART mode 0x06 = 00
      // Sync = async 0x01 = 0
      HWREGB( USCI_A1_BASE | UCAxCTL0 ) = 0x00;
      // 115200 baud params for 4MHz Clock - 19200
      // Prescalar = 2 - 13
      HWREGW( USCI_A1_BASE | UCAxBRW ) = 2;
      //  HWREGW( USCI_A1_BASE | UCAxBRW ) = 13;
      // First Modulation (0xf0) = 2 - 0
      // Second Modulation (0x0e) = 3 - 0
      // Oversampling (0x01) = 1 -1 
      HWREGB( USCI_A1_BASE | UCAxMCTL ) = 0x20|0x06|0x01;
      //  HWREGB( USCI_A1_BASE | UCAxMCTL ) = 0x01;
      // note use PxSELE value as 4 is even so the port moves!
      // test going into SEL mode on P4.4 and P4.5
      HWREGB( P4_BASE | PxSELE ) |= BIT4|BIT5; 
      // Set P4.4 TX as output
      //  HWREGB( P4_BASE | PxDIR ) |= BIT4;
      // Set P4.5 RX as input
      //  HWREGB( P4_BASE | PxDIR ) &= ~BIT5;
      // enable USCI A1
      HWREGB( USCI_A1_BASE | UCAxCTL1 ) &= ~UCSWRST;
      // interupts on both TX(2) and RX(1) UCTXIE and UCRXIE
      // note: have to enable interrupts after UASCI_A1 is enabled!
      HWREGB( USCI_A1_BASE | UCAxIE ) |= BIT0|BIT1;
      __enable_interrupt();
    
    
      // now all set for now just loop, with LED flashing
      while(1);
    
    }
    
    // USCI A1
    __attribute__ ((interrupt(USCI_A1_VECTOR)))
    void USCI_A1_ISR (void)
    {
      // and if anything recieved on the UART
      // use it to set which harmonic is seen
      // after writing to print, should we reset the interrup
      // to process? As we are in the uart interupt already
      // just order RX and TX - so they work
      // but need to think what happens where print used elsewhere
      if (HWREGB( USCI_A1_BASE | UCAxIFG )&UCRXIFG) {
        char in=HWREGB( USCI_A1_BASE | UCAxRXBUF );
        if ((in>='1')&&(in<='8'))
          {
    	//	DisHarm=in-'1';
    	print[0]=in;
    	print[1]=0;
    	pindex=print;
    	// and set the flag have things to print
    	HWREGB( USCI_A1_BASE | UCAxIFG )|=UCTXIFG;
          }
      }
      // first if anything in output buffer
      // and can send a character - then send a character
      if (HWREGB( USCI_A1_BASE | UCAxIFG )&UCTXIFG) {
        if (*pindex) {
          HWREGB( USCI_A1_BASE | UCAxTXBUF )=*pindex++;
        } else {
          // now we have finished writing so reset
          pindex=print;
          *pindex=0;
          // clear the transmitting bit - as don't need to do anything
          // note this method isn't totally safe if two processes
          // write to the buffer before it empties
          // this approach though does write full stings if done
          // rarely, and uses minimum interupts
          HWREGB( USCI_A1_BASE | UCAxIFG )&=~UCTXIFG;
        }	
      }
    }

    是的- HWREGB 将字节写入存储器、而 HWREGW 写入 uint16_t -我只是倾向于这样做。 我的代码以115200的速率运行正常-即使其他位在50%的时间运行

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

    您好!

    如果 PCB 布局和 UART 连接不良、较高的波特率可能会面临意想不到的问题。 在 LP 上运行代码并不能证明   EVM430-FR6043上的连接正常。 如果您可以降低波特率并检查问题是否仍然存在、将会有所帮助。  

    此致、

    现金豪  

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

    好像  UCA1MCTL 是错误的。

    slau208q 的表36-5说明  

    UCA1MCTL=0x30|0x0a|0x01;

    因此

    UCBRx=4
    UCBRSx=5
    UCBRFx=3
    UCOS16= 1

    UCAxMCTL 只是一个8位字节、而不是一个16位字。  

    HMM 和只是发现者 slau367p 似乎是王牌 slau208q。 它提供了

    USOS16=1
    UCBRx=4
    UCBRFx=5
    USBRSx=0x55

    这部分内容解释了

    UCA1MCTW=0x5500|0x0050|0x0001;

    所以你的代码在这方面是正确的... 我的错...

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

    您好!

    USOS16=1
    UCBRx=4
    UCBRFx=5
    USBRSx=0x55

    该设置适用于115200波特率和8MHz 时钟源。  

    有关于低波特率测试的消息吗?

    此致、

    现金豪

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

    现金、您好!

    降低波特率确实可以解决  UCRXERR 的出现 。 传输中没有错误的原因非常奇怪。 PC 可以准确地获得115200发送的数据。 验证数据正常、但接收有问题。

    此致、

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

    尊敬的 Ben:

    您可以使用 示波器来检查 TX 和 RX 引脚上的信号。 我们需要检查模拟部分上的信号。 可能信号线路中存在噪声、PC 可以滤除噪声并将其转换为正确的数字数据。 但是、MCU 侧无法滤除噪声。 并将其视为接收误差。

    此致、

    现金豪

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

    现金、您好!

    使用 EVM430FR6043进行的 I TEST 仍有同样的问题、 这应该不是关于硬件的。

    此致、

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

    尊敬的 Ben:

    好的。 我将在电路板上进行测试、并检查是否可以重现此问题。

    此致、

    现金豪

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

    现金、您好!

    有任何更新吗?

    此致、

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

    尊敬的 Ben:

    我还没有测试过。 我将在本周找到一些时间来测试它。 感谢您的耐心。

    此致、

    现金豪