6526|15

37

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

使用msp430波特率到115200时无法正常发送接收 [复制链接]

 
使用msp430fr5969,利用串口助手发送反馈,当调整波特率在115200以下时都可以正常的发送接收,当波特率达到115200后以8000khz就会乱码,调整了DOC到16Mhz尝试,不发生数据也会一直接收,请问为什么会出现这样的情况,将发送波特率调整到115200需要注意什么吗?
int main(void)
{
  WDTCTL = WDTPW | WDTHOLD;                 // Stop Watchdog

  // Configure GPIO
  P2SEL1 |= BIT0 | BIT1;                    // USCI_A0 UART operation
  P2SEL0 &= ~(BIT0 | BIT1);

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

  // Startup clock system with max DCO setting ~8MHz
  CSCTL0_H = CSKEY >> 8;                    // Unlock clock registers
  CSCTL1 = DCOFSEL_4 | DCORSEL;             // Set DCO to 16MHz
  CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;
  CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;     // Set all dividers
  CSCTL0_H = 0;                             // Lock CS registers

  // Configure USCI_A0 for UART mode
  UCA0CTLW0 = UCSWRST;                      // Put eUSCI in reset
  UCA0CTLW0 |= UCSSEL__SMCLK;               // CLK = SMCLK
  // Baud Rate calculation
  // 8000000/(16*9600) = 52.083
  // Fractional portion = 0.083
  // User's Guide Table 21-4: UCBRSx = 0x04
  // UCBRFx = int ( (52.083-52)*16) = 1
  UCA0BR0 = 9;                             // 16000000/16/115200
  UCA0BR1 = 0x00;
  UCA0MCTLW |=  UCOS16 | UCBRF_1;
  UCA0CTLW0 &= ~UCSWRST;                    // Initialize eUSCI
  UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt

  __bis_SR_register(LPM3_bits | GIE);       // Enter LPM3, interrupts enabled
  __no_operation();                         // For debugger
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{
  switch(__even_in_range(UCA0IV, USCI_UART_UCTXCPTIFG))
  {
    case USCI_NONE: break;
    case USCI_UART_UCRXIFG:
      while(!(UCA0IFG&UCTXIFG));
      UCA0TXBUF = UCA0RXBUF;
      __no_operation();
      break;
    case USCI_UART_UCTXIFG: break;
    case USCI_UART_UCSTTIFG: break;
    case USCI_UART_UCTXCPTIFG: break;
  }
}

最新回复

你是不是把发送中断也开了?可能是发送导致的中断  详情 回复 发表于 2017-6-30 12:11
 
点赞 关注

回复
举报

6040

帖子

202

TA的资源

版主

沙发
 
遇到问题,先参考一下官方例程

点评

就是在官方例子的基础上修改的  详情 回复 发表于 2017-6-26 19:55
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
lcofjp 发表于 2017-6-26 19:44
遇到问题,先参考一下官方例程

就是在官方例子的基础上修改的

点评

[attachimg]308996[/attachimg] UCA0MCTLW |= UCOS16 | UCBRF_1; 不知道这个值你是怎么算出来的,另外这个语句应该用=号赋值,而不应该用 |=  详情 回复 发表于 2017-6-26 20:13
 
 
 

回复

6040

帖子

202

TA的资源

版主

4
 
wangcen 发表于 2017-6-26 19:55
就是在官方例子的基础上修改的



UCA0MCTLW |=  UCOS16 | UCBRF_1;



不知道这个值你是怎么算出来的,另外这个语句应该用=号赋值,而不应该用 |=

点评

你好,谢谢你指出错误,我看到了16777216上,我按照例程修改,以8Mhz为基准,修改波特率从9600到57600都可以用串口助手正常收发,当修改到115200的时候还是接收不正常,出现乱码 UCA0BR0 = 4;  详情 回复 发表于 2017-6-26 21:21
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

5
 
lcofjp 发表于 2017-6-26 20:13
UCA0MCTLW |=  UCOS16 | UCBRF_1;



不知道这个值你是怎么算出来的,另外这个语句应该用=号赋值 ...

你好,谢谢你指出错误,我看到了16777216上,我按照例程修改,以8Mhz为基准,修改波特率从9600到57600都可以用串口助手正常收发,当修改到115200的时候还是接收不正常,出现乱码
UCA0BR0 = 4;                             //
  UCA0BR1 = 0x00;
  UCA0MCTLW = UCOS16 | UCBRF_5;
  UCA0CTLW0 &= ~UCSWRST;                    // Initialize eUSCI
  UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt

想请教您一下是哪里出现了问题

点评

官方给了1M时钟115200波特率的例程,你可以跑一下,在此基础上再改,别用过采样的配置方式。  详情 回复 发表于 2017-6-26 22:52
 
 
 

回复

6040

帖子

202

TA的资源

版主

6
 
wangcen 发表于 2017-6-26 21:21
你好,谢谢你指出错误,我看到了16777216上,我按照例程修改,以8Mhz为基准,修改波特率从9600到57600都 ...

官方给了1M时钟115200波特率的例程,你可以跑一下,在此基础上再改,别用过采样的配置方式。

点评

如图  详情 回复 发表于 2017-6-27 08:37
我看到了用115200配置的,但它的例子是将TXBUF和RXBUF直接连接通信,我在它的基础上尝试使用串口通信 switch(__even_in_range(UCA0IV, USCI_UART_UCTXCPTIFG)) { case USCI_NONE: break; case USCI_U  详情 回复 发表于 2017-6-27 08:35
 
 
 

回复

1059

帖子

1

TA的资源

版主

7
 
配置好时钟与 UCA0MCTLW的关系,对着官方的程序选择合适的参数

点评

修改的参数应该没有问题,使用开发板上的TXBUF和RXbuf直接连接来传输可以,但是利用串口助手电脑收发在波特率达到115200时就会出现乱码的情况  详情 回复 发表于 2017-6-27 08:39
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

8
 
lcofjp 发表于 2017-6-26 22:52
官方给了1M时钟115200波特率的例程,你可以跑一下,在此基础上再改,别用过采样的配置方式。

我看到了用115200配置的,但它的例子是将TXBUF和RXBUF直接连接通信,我在它的基础上尝试使用串口通信
switch(__even_in_range(UCA0IV, USCI_UART_UCTXCPTIFG))
  {
    case USCI_NONE: break;
    case USCI_UART_UCRXIFG:
      while(!(UCA0IFG&UCTXIFG));
      UCA0TXBUF = UCA0RXBUF;
      __no_operation();
      break;
    case USCI_UART_UCTXIFG: break;
    case USCI_UART_UCSTTIFG: break;
    case USCI_UART_UCTXCPTIFG: break;
  }

还是出现了乱码的情况
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

9
 
lcofjp 发表于 2017-6-26 22:52
官方给了1M时钟115200波特率的例程,你可以跑一下,在此基础上再改,别用过采样的配置方式。

如图

1498523789(1).png (21.13 KB, 下载次数: 1)

1498523789(1).png
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

10
 
qwerghf 发表于 2017-6-27 08:13
配置好时钟与 UCA0MCTLW的关系,对着官方的程序选择合适的参数

修改的参数应该没有问题,使用开发板上的TXBUF和RXbuf直接连接来传输可以,但是利用串口助手电脑收发在波特率达到115200时就会出现乱码的情况

1498523789(1).png (21.13 KB, 下载次数: 0)

1498523789(1).png

1498523968(1).png (20.05 KB, 下载次数: 0)

1498523968(1).png

点评

可能是dco精度不够  详情 回复 发表于 2017-6-27 09:06
 
 
 

回复

6040

帖子

202

TA的资源

版主

11
 
wangcen 发表于 2017-6-27 08:39
修改的参数应该没有问题,使用开发板上的TXBUF和RXbuf直接连接来传输可以,但是利用串口助手电脑收发在波 ...

可能是dco精度不够

点评

那使用什么频率时钟比较合适?  详情 回复 发表于 2017-6-27 09:43
那使用什么频率时钟比较合适?  详情 回复 发表于 2017-6-27 09:42
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

12
 
lcofjp 发表于 2017-6-27 09:06
可能是dco精度不够

那使用什么频率时钟比较合适?
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

13
 
lcofjp 发表于 2017-6-27 09:06
可能是dco精度不够

那使用什么频率时钟比较合适?

点评

必然是外接晶振是精度最好的,不过不知道能不能外接高速晶振。  详情 回复 发表于 2017-6-27 09:57
 
 
 

回复

6040

帖子

202

TA的资源

版主

14
 
wangcen 发表于 2017-6-27 09:43
那使用什么频率时钟比较合适?

必然是外接晶振是精度最好的,不过不知道能不能外接高速晶振。

点评

用115200的波特率通信问题是解决了,但是还有一个问题想请教一下,我以中断的方式接收多个数据,第一个收到的数据会乱码,如果有标志位做轮询的话就不会,请问一下问什么进入中断接收数据就会乱码呢  详情 回复 发表于 2017-6-30 10:41
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

15
 
lcofjp 发表于 2017-6-27 09:57
必然是外接晶振是精度最好的,不过不知道能不能外接高速晶振。

用115200的波特率通信问题是解决了,但是还有一个问题想请教一下,我以中断的方式接收多个数据,第一个收到的数据会乱码,如果有标志位做轮询的话就不会,请问一下问什么进入中断接收数据就会乱码呢
 
 
 

回复

6040

帖子

202

TA的资源

版主

16
 
你是不是把发送中断也开了?可能是发送导致的中断
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表