【求助】msp430f5438a的串口发数有乱码,加电阻就好了!!...
本帖最后由 guxingganyue 于 2013-4-8 11:02 编辑如题:msp430f5438a,外接20M晶振,单片机跑115200。
我在while1中连续发一个字符串,但是每隔3次左右就会出现一堆乱码。即使单片机不发数,串口也收到连续的乱码。
现在我在收发两条线间接了一个4.7k的电阻,没有出现乱码了。即使单片机不发数,电脑串口也不会收到数据了。
这个现象我以前也遇到过一次,在avr单片机上,后来也没细究。今天又遇到了,特来请教各位有没有遇到过,为什么加电阻就好了呢?
下面是我的msp430f5438a初始化代码(按照官方的代码稍做了扩展):
void UART0_Init(uint32_t BandRate)
{
P3SEL = 0x30; // P3.4,5 = USCI_A0 TXD/RXD
//UCA0CTL0= 0x00;//这句话不要,因为复位后的状态就是这样:8位数据,1位停止位,无奇偶校验,异步串口模式
UCA0CTL1 |= UCSWRST; // Put state machine in reset
UCA0CTL1 |= UCSSEL_2; // 时钟选择:ACLK
if (BandRate==9600)//9600=>UCA0BRx=2083=0x0823
{
UCA0BR1 = 0x08;//高8位
UCA0BR0 = 0x23;//低8位,20MHz 9600 (see User's Guide)
UCA0MCTL |= UCBRS_2 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
}
else if (BandRate==19200)//19200=>UCA0BRx=1041=0x0411
{
UCA0BR1 = 0x04;//高8位
UCA0BR0 = 0x11;//低8位,20MHz 19200 (see User's Guide)
UCA0MCTL |= UCBRS_6 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
}
else if (BandRate==38400)//38400=>UCA0BRx=520=0x0208
{
UCA0BR1 = 0x02;//高8位
UCA0BR0 = 0x08;//低8位,20MHz 38400 (see User's Guide)
UCA0MCTL |= UCBRS_7 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
}
else if (BandRate==57600)//57600=>UCA0BRx=347=0x015B
{
UCA0BR1 = 0x01;//高8位
UCA0BR0 = 0x5B;//低8位,20MHz 57600 (see User's Guide)
UCA0MCTL |= UCBRS_2 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
}
else if (BandRate==115200)//115200=>UCA0BRx=173=0xAD
{
UCA0BR1 = 0;//高8位
UCA0BR0 = 0xAD;//低8位,20MHz 115200 (see User's Guide)
UCA0MCTL |= UCBRS_5 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
}
else if(BandRate==230400)//230400=>UCA0BRx=86=0x56
{
UCA0BR1 = 0;//高8位
UCA0BR0 = 0x56;//低8位,20MHz 230400 (see User's Guide)
UCA0MCTL |= UCBRS_7 + UCBRF_0;// Modulation UCBRSx=1, UCBRFx=0
}
else//9600
{
}
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
//UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
}我还遇到一个奇怪的现象,现在是准解决了,但还是不放心。
msp430f5438a外接25M,20M晶振,没有接32768晶振。ACLK=SMCLK=MCLK=XT2CLK
发现手一摸那个晶振单片机就死机了,但是我量时钟输出管脚,频率都是对的,说明单片机没有死机。
后来看官方的代码时发现有下面的这个中断:#pragma vector=UNMI_VECTOR
__interrupt void NMI_ISR(void)
{
uint16_t status=0;
do
{
// If it still can't clear the oscillator fault flags after the timeout, trap and wait here.
status = Clear_All_Osc_Flags(1000);
} while(status != 0);
}我把它加上后硬件仿真(上述代码中加断点),手摸几下后发现单片机跑到它里面去了,执行几遍后单片机又好了。。。原来是时钟有错误中断,我没清。。
大家有没有遇到这个现象,为什么手摸几下就这样了呢,以前还从没遇到过。。这种现象怎么解决呢(最好不要用上述的代码从软件上解决,因为这样单片机会小“死”一会的)
先谢谢大家了 看来大家没有遇到过啊 我这几天也发现有乱码了!也是115200,我的单片机是msp430f5529.在传大量数据时候就偶而又乱码大概1MB数据里面就有几十个,而且是连着的几十个,后面又恢复了!真奇怪,我晚上试试串电阻测试下。 wolyond 发表于 2013-12-24 15:38
我这几天也发现有乱码了!也是115200,我的单片机是msp430f5529.在传大量数据时候就偶而又乱码大概1MB数据 ...
包好,不信可以试试啊 楼主,是不是有干扰,接地没做好啊?电源滤波有没有做好呢? ele-boy 发表于 2014-1-8 20:35
楼主,是不是有干扰,接地没做好啊?电源滤波有没有做好呢?
地都接了,但是我用同样方法在149上就没有问题 我今天也遇到这样的情况啦是串一电阻还是接上拉电阻啊串电阻好像有点大了 电气工程化动自 发表于 2014-4-30 21:40
我今天也遇到这样的情况啦是串一电阻还是接上拉电阻啊串电阻好像有点大了 ...
就是在R 和 T 间接一个电阻即可 guxingganyue 发表于 2014-4-30 22:25
就是在R 和 T 间接一个电阻即可
楼主你的方案有点错误,只需要接一个4.7K——10K的上拉就解决问题啦
这是因为430的IO是真正的双向IO口 是MOS管的, 所以需要接上拉不然会乱码的 电气工程化动自 发表于 2014-5-1 09:58
楼主你的方案有点错误,只需要接一个4.7K——10K的上拉就解决问题啦
这是因为430的IO是真正的双向IO ...
我没有接上拉电阻哦
我是在R和T间接了一个电阻,这个算是上拉吗? guxingganyue 发表于 2014-5-1 10:11
我没有接上拉电阻哦
我是在R和T间接了一个电阻,这个算是上拉吗?
这只能是一种限流的作用 在一定程度上防止了一些干扰 但是当你频率越高的时候就不行啦 还是会有乱码 特别是你用的晶振频率很高的时候 电气工程化动自 发表于 2014-5-2 09:23
这只能是一种限流的作用 在一定程度上防止了一些干扰 但是当你频率越高的时候就不行啦 还是会有 ...
哦,那怎么能彻底解决这个问题呢
我以前在AVR上也遇到过
但是在stm32和lpc2132上没有遇到。 guxingganyue 发表于 2014-5-2 16:26
哦,那怎么能彻底解决这个问题呢
我以前在AVR上也遇到过
加上拉 啊强制上拉就可以啦 电气工程化动自 发表于 2014-5-5 16:14
加上拉 啊强制上拉就可以啦
以前也是两根线间接了一个电阻就好了 guxingganyue 发表于 2014-5-1 10:11
我没有接上拉电阻哦
我是在R和T间接了一个电阻,这个算是上拉吗?
当然算上拉了,T无数据是什么电平?
这个办法,全双工就没了 加一定大小的上拉电阻,用于阻抗匹配,减少反射,避免震荡,保证稳定性,但是你俩线间加电阻的方法应该是一种缓解,并没有实质解决问题。 学习了,一般情况下都是加上拉电阻 单片机的发送加上拉电阻,4.7k,10K都可以
页:
[1]