搜索
bottom↓
回复: 17

【求助】msp430f5438a的串口发数有乱码,加电阻就好了!!...

[复制链接]

出0入0汤圆

发表于 2013-4-8 10:50:00 | 显示全部楼层 |阅读模式
本帖最后由 guxingganyue 于 2013-4-8 11:02 编辑

如题:msp430f5438a,外接20M晶振,单片机跑115200。

我在while1中连续发一个字符串,但是每隔3次左右就会出现一堆乱码。即使单片机不发数,串口也收到连续的乱码。

现在我在收发两条线间接了一个4.7k的电阻,没有出现乱码了。即使单片机不发数,电脑串口也不会收到数据了。


这个现象我以前也遇到过一次,在avr单片机上,后来也没细究。今天又遇到了,特来请教各位有没有遇到过,为什么加电阻就好了呢?


下面是我的msp430f5438a初始化代码(按照官方的代码稍做了扩展):

  1. void UART0_Init(uint32_t BandRate)
  2. {
  3.   P3SEL = 0x30;                 // P3.4,5 = USCI_A0 TXD/RXD
  4.   //UCA0CTL0  = 0x00;//这句话不要,因为复位后的状态就是这样:8位数据,1位停止位,无奇偶校验,异步串口模式
  5.   UCA0CTL1 |= UCSWRST;          // Put state machine in reset
  6.   UCA0CTL1 |= UCSSEL_2;         // 时钟选择:ACLK
  7.   if (BandRate==9600)//9600=>UCA0BRx=2083=0x0823
  8.   {
  9.     UCA0BR1 = 0x08;//高8位
  10.     UCA0BR0 = 0x23;//低8位,20MHz 9600 (see User's Guide)
  11.     UCA0MCTL |= UCBRS_2 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
  12.   }
  13.   else if (BandRate==19200)//19200=>UCA0BRx=1041=0x0411
  14.   {
  15.     UCA0BR1 = 0x04;//高8位
  16.     UCA0BR0 = 0x11;//低8位,20MHz 19200 (see User's Guide)
  17.     UCA0MCTL |= UCBRS_6 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
  18.   }
  19.   else if (BandRate==38400)//38400=>UCA0BRx=520=0x0208
  20.   {
  21.     UCA0BR1 = 0x02;//高8位
  22.     UCA0BR0 = 0x08;//低8位,20MHz 38400 (see User's Guide)
  23.     UCA0MCTL |= UCBRS_7 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
  24.   }
  25.   else if (BandRate==57600)//57600=>UCA0BRx=347=0x015B
  26.   {
  27.     UCA0BR1 = 0x01;//高8位
  28.     UCA0BR0 = 0x5B;//低8位,20MHz 57600 (see User's Guide)
  29.     UCA0MCTL |= UCBRS_2 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
  30.   }
  31.   else if (BandRate==115200)//115200=>UCA0BRx=173=0xAD
  32.   {
  33.     UCA0BR1 = 0;//高8位
  34.     UCA0BR0 = 0xAD;//低8位,20MHz 115200 (see User's Guide)
  35.     UCA0MCTL |= UCBRS_5 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
  36.   }
  37.   else if(BandRate==230400)//230400=>UCA0BRx=86=0x56
  38.   {
  39.     UCA0BR1 = 0;//高8位
  40.     UCA0BR0 = 0x56;//低8位,20MHz 230400 (see User's Guide)
  41.     UCA0MCTL |= UCBRS_7 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
  42.   }
  43.   else//9600
  44.   {

  45.   }

  46.   UCA0CTL1 &= ~UCSWRST;         // **Initialize USCI state machine**
  47.   //UCA0IE |= UCRXIE;             // Enable USCI_A0 RX interrupt
  48. }
复制代码
我还遇到一个奇怪的现象,现在是准解决了,但还是不放心。

msp430f5438a外接25M,20M晶振,没有接32768晶振。ACLK=SMCLK=MCLK=XT2CLK

发现手一摸那个晶振单片机就死机了,但是我量时钟输出管脚,频率都是对的,说明单片机没有死机。
后来看官方的代码时发现有下面的这个中断:
  1. #pragma vector=UNMI_VECTOR
  2. __interrupt void NMI_ISR(void)
  3. {
  4.   uint16_t status=0;
  5.   do
  6.   {
  7.     // If it still can't clear the oscillator fault flags after the timeout, trap and wait here.
  8.     status = Clear_All_Osc_Flags(1000);
  9.   } while(status != 0);
  10. }
复制代码
我把它加上后硬件仿真(上述代码中加断点),手摸几下后发现单片机跑到它里面去了,执行几遍后单片机又好了。。。原来是时钟有错误中断,我没清。。


大家有没有遇到这个现象,为什么手摸几下就这样了呢,以前还从没遇到过。。这种现象怎么解决呢(最好不要用上述的代码从软件上解决,因为这样单片机会小“死”一会的)

先谢谢大家了

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

 楼主| 发表于 2013-4-8 18:35:06 | 显示全部楼层
看来大家没有遇到过啊

出0入0汤圆

发表于 2013-12-24 15:38:54 | 显示全部楼层
我这几天也发现有乱码了!也是115200,我的单片机是msp430f5529.在传大量数据时候就偶而又乱码大概1MB数据里面就有几十个,而且是连着的几十个,后面又恢复了!真奇怪,我晚上试试串电阻测试下。

出0入0汤圆

 楼主| 发表于 2013-12-24 17:36:02 | 显示全部楼层
wolyond 发表于 2013-12-24 15:38
我这几天也发现有乱码了!也是115200,我的单片机是msp430f5529.在传大量数据时候就偶而又乱码大概1MB数据 ...

包好,不信可以试试啊

出0入0汤圆

发表于 2014-1-8 20:35:41 | 显示全部楼层
楼主,是不是有干扰,接地没做好啊?电源滤波有没有做好呢?

出0入0汤圆

 楼主| 发表于 2014-1-9 08:57:22 | 显示全部楼层
ele-boy 发表于 2014-1-8 20:35
楼主,是不是有干扰,接地没做好啊?电源滤波有没有做好呢?

地都接了,但是我用同样方法在149上就没有问题

出0入0汤圆

发表于 2014-4-30 21:40:36 | 显示全部楼层
我今天也遇到这样的情况啦  是串一电阻  还是接上拉电阻啊  串电阻好像有点大了

出0入0汤圆

 楼主| 发表于 2014-4-30 22:25:28 | 显示全部楼层
电气工程化动自 发表于 2014-4-30 21:40
我今天也遇到这样的情况啦  是串一电阻  还是接上拉电阻啊  串电阻好像有点大了 ...

就是在R 和 T 间接一个电阻即可

出0入0汤圆

发表于 2014-5-1 09:58:52 | 显示全部楼层
guxingganyue 发表于 2014-4-30 22:25
就是在R 和 T 间接一个电阻即可

楼主  你的方案有点错误,  只需要接一个4.7K——10K的上拉就解决问题啦
这是因为430的IO是真正的双向IO口   是MOS管的, 所以需要接上拉  不然会乱码的   

出0入0汤圆

 楼主| 发表于 2014-5-1 10:11:35 | 显示全部楼层
电气工程化动自 发表于 2014-5-1 09:58
楼主  你的方案有点错误,  只需要接一个4.7K——10K的上拉就解决问题啦
这是因为430的IO是真正的双向IO ...

我没有接上拉电阻哦

我是在R和T间接了一个电阻,这个算是上拉吗?

出0入0汤圆

发表于 2014-5-2 09:23:32 | 显示全部楼层
guxingganyue 发表于 2014-5-1 10:11
我没有接上拉电阻哦

我是在R和T间接了一个电阻,这个算是上拉吗?

这只能是一种限流的作用   在一定程度上防止了一些干扰   但是当你频率越高的时候  就不行啦   还是会有乱码   特别是你用的晶振频率很高的时候

出0入0汤圆

 楼主| 发表于 2014-5-2 16:26:28 | 显示全部楼层
电气工程化动自 发表于 2014-5-2 09:23
这只能是一种限流的作用   在一定程度上防止了一些干扰   但是当你频率越高的时候  就不行啦   还是会有 ...

哦,那怎么能彻底解决这个问题呢

我以前在AVR上也遇到过

但是在stm32和lpc2132上没有遇到。

出0入0汤圆

发表于 2014-5-5 16:14:03 | 显示全部楼层
guxingganyue 发表于 2014-5-2 16:26
哦,那怎么能彻底解决这个问题呢

我以前在AVR上也遇到过

加上拉 啊  强制上拉  就可以啦

出0入0汤圆

 楼主| 发表于 2014-5-5 18:08:25 | 显示全部楼层
电气工程化动自 发表于 2014-5-5 16:14
加上拉 啊  强制上拉  就可以啦

以前也是两根线间接了一个电阻就好了

出0入0汤圆

发表于 2014-5-6 10:21:19 | 显示全部楼层
guxingganyue 发表于 2014-5-1 10:11
我没有接上拉电阻哦

我是在R和T间接了一个电阻,这个算是上拉吗?

当然算上拉了,T无数据是什么电平?
这个办法,全双工就没了

出0入0汤圆

发表于 2014-5-6 14:58:58 | 显示全部楼层
加一定大小的上拉电阻,用于阻抗匹配,减少反射,避免震荡,保证稳定性,但是你俩线间加电阻的方法应该是一种缓解,并没有实质解决问题。

出0入0汤圆

发表于 2015-11-25 11:07:08 | 显示全部楼层
学习了,一般情况下都是加上拉电阻

出0入0汤圆

发表于 2015-11-30 15:36:05 | 显示全部楼层
单片机的发送加上拉电阻,4.7k,10K都可以
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 21:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表