3210|1

6366

帖子

4912

TA的资源

版主

楼主
 

MSP430串口调试全记录 [复制链接]

先交代一下相关背景:
Mcu型号:MS9430F149;
实验板:自制(有些毛病,稍后坦白:)
开发环境:IAR Embedded Workbench V2.10A+串口调试助手;
试验仪器:泰克数字示波器,万用表等;
笔者的底细:马上步入而立之年,学习点新东西,已感到有些力不从心了:)以前有些51基础,430是第一次搞!当然这些都是业余爱好,以乐以闹为主:)

PCB以前倒是做过一些,不过都是51的简单板子,线也少,在protel99se下自动布线后再手动调整一下就蒙混过关,作出的板子虽然不太漂亮但也勉强实现功能,呵呵。这次做这块430实验板完全手动布线,大约做了两天,眼睛都花花了:(等到拿到板子一调试发现还是有几处粗心大意的地方,无奈只能飞线:(

转入正题吧,开始串口的收发数据调试:
找了根现成的串口线,和pc连接好,并设置好《串口调试助手》参数,如图。运行,没反应,一模MAX3232有些烫手,赶紧关闭电源,停止!经仔细检查发现9针串口DB9封装错了,应该是DB/M我用的是DB/F一个公头一个母头线序不一样,补救措施:将串口拆下来焊接在底层(Bottom Layer)正好就对应上了,不过当时DB9焊的賳结实,拆下来太困难,于是自己找了两个串口母头和一段线自己做一根串口线,有了前车之鉴这次特别小心别2、3对调,做好后又反复测了几次,没问题了,接好进行二进宫!
接上实验板用示波器测串口的2、3脚(RS232电平)没有波形,拔下来直接测有波形,将2、3短接<串口调试助手接收区>显示发送的内容,没问题。如此一看可能是板子上的MAX3232刚才被烧毁了,拨拉下来再来一片新的,有波形了,但还是没达到设计要求。
用示波器测430的串口1的TXD1端(P3.6)发现没有波形,看来根本没启动串口发送程序,将程序(▲)修改再测,恩不错有波形了经过MAX3232后也有波形了,按常理说这时应该在<串口调试助手接收区>显示接收内容了,但是让人崩溃的是依旧没有:(
以为是MAX3232的硬件(包括4个电容,典型值是0.1uF,当时没找到0.1的就用4.7uF的代替了)出问题了,或者是RS232判决电平的毛病,这时在网上搜到了如下资料:
MAX232/MAX202接口输出的电平为何比计算机输出的RS-232电平低?
由于计算机内部的RS-232接口多数采用±12V供电的接口芯片,而MAX232/MAX202及其它多数Maxim的RS-232接口都是采用单电源(+3.3V或+5V)供电,由内部的电荷泵电路(倍压和倍压反相两种方式)产生接口所需的电源,这样就简化了电源设计。由于工作在倍压和倍压反相的电荷泵输出电压最高为±2×Vin(空载时),且带载能力有限,不管怎样,多数Maxim接口驱动器还是能够保证幅值在±5V以上,以满足RS-232接口端±3V的接收门限值。
没问题啊,我测到的波形在±6V左右啊,正在一筹莫展之际,想到了波特率是否一致的问题,从示波器观察PC发给430的1Bit数据的宽度约100us,频率f=10k和设定的9600非常接近,没问题;在测430发给PC的1Bit数据宽度为6.4us,频率f=156250,于是发现问题所在,重新检查源程序时钟源选择,发现程序(▲2)的疏忽,更改后,一切ok,再看<串口调试助手接收区>正反复的显示“MSP430 MSP430 MSP430 MSP430…”
#include

void init_system(void);
void init_UART(void);
void transmit_data(void);

char Data[6]="MSP430";
//char Data[6]={0xff,0xff,0xff,0x55,0xff,0xff};

void main(void)
{
init_system();
while(1)
{
transmit_data();
}
}
void init_system(void)
{
WDTCTL=WDTPW+WDTHOLD;
init_UART();
}
void init_UART(void)
{
//P3SEL|=UART1_TX+UART1_RX;
P3SEL|=0xc0;
P3DIR |= 0x40; // 串口发送数据端口为输出,接收数据端口为输入?
UCTL1=SWRST; //reset cotrol bit in UCTL1 ?
//UTCTL0|=SSEL0; //ACLK (▲2)
UTCTL1|=SSEL0; //ACLK
UBR01=0x03; //bode rate 9600.
UBR11=0x00;
UMCTL1=0x4a;
UCTL1=CHAR; //8 bits data format. enable UART
IFG2&=~UTXIFG1;
IE2|=URXIE1; //enable receive interrupt.
ME2|=URXE1+UTXE1;
}
void transmit_data(void)
{
unsigned char i;
for(i=0;i<6;i++)
{
TXBUF1=Data;
while((UTCTL1&TXEPT)!=TXEPT);
}
}
//***************************************************************************
//ISR for uart1 receive a byte.
//***************************************************************************
#pragma vector=UART1RX_VECTOR
__interrupt void usart1_rx (void)
{
if (RXBUF1 =='u') // 'u' received?
{
_NOP();
//TXBUF1 = string1[i++];
}
}
以下是网上找到的资料:
使用ACLK为时钟源(32768Hz)做9600bps误差在±13%左右,尝试使用SMCLK为时钟源(默认情况下外部晶振为32768Hz时,SMCLK为1048576Hz)。 如下设置后,波特率误差小于±1%。不过此时CPU低功耗不能使用LPM3/LPM4。
UTCTL0 = SSEL1;     // UCLK = SMCLK
UBR00 = 0x6D;       // 1M/9600 波特率寄存器低字节
UBR10 = 0x00;      // 1M/9600 波特率寄存器高字节
UMCTL0 = 0x10;     // 波特率调整值
总结:通过这次430的串口调试过程,发现这个东西容易之处在于,任何一本430书都能找到串口收发的例子,而且也比较简单易懂;难处在于:涉及到软硬两方面的东西,一旦发现问题得先判断是硬毛病还是软错误,尤其对于象我这样第一次搞的处男,而且还是自制的实验板,出了问题简直是晕菜!!不过只要你不抛弃不放弃,再加上网路上众多高手的指点,相信调试成功只是时间的问题:)祝你成功!!

最新回复

楼主好幸运,我现在串口还没调出来,哎。留个言求个人品吧。  详情 回复 发表于 2012-11-19 16:24
 
点赞 关注

回复
举报

38

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
楼主好幸运,我现在串口还没调出来,哎。留个言求个人品吧。
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表