5783|10

86

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

哭求高手指点串口232 [复制链接]

上位机自己测试串口没有问题。但是和下位机430通信时确不通啊,不只怎么回事啊。程序很简单的。449的单片机
源程序如下:
#ifndef MSP430XF449_h
#include <msp430x44x.h>
#endif

/*******************************************************
* 模块初始化
*******************************************************/
void main (void)
{
unsigned char tmpv;
FLL_CTL0 &= 0xbf;
UCTL0 |=SWRST;
UCTL0 |=CHAR; // 8-bit 字符


FLL_CTL1|=SELS+XT2OFF+SELM_XT2; //开启第二个振荡器
do
{
IFG1 &= ~OFIFG; // 清除OSCFault标志
for(tmpv = 0xff;tmpv > 0;tmpv--); //
}
while ((FLL_CTL0&XT1OF) == XT1OF ); // 第二个振荡器是否正常工作
UCTL0|=SWRST;
UCTL0|=CHAR; // 8-bit 字符
UTCTL0=SSEL0+SSEL1; // UCLK=SMCLK
UBR00=0xa0; // 在4MHz下进行 9600波特率通信
UBR10=0x01; // 在4MHz下进行 9600波特率通信
UMCTL0=0x5e; // 调整寄存器
UCTL0&=~SWRST;

ME1|= (UTXE0 + URXE0); // 使能 USART0 TXD/RXD
IE1|= URXIE0 ;
IFG1 = 0x00;
P2SEL |= 0x30; // P2.4,P2.5 = USART0 TXD/RXD
P2DIR |= 0x10;

LPM3;



}



/****************************************************
* 数据接收中断
****************************************************/
#pragma vector = UART0RX_VECTOR
__interrupt void data_Receive(void) // UART接收中断
{ while((IFG1&UTXIFG0)==0 );
TXBUF0=RXBUF0; 哭求大侠指点啊。

最新回复

这位先生真是个好人,赞!其实我就是想测试一下串口,但是一直不通,唉,不知道能不能提供一个调试通的449的程序?晶振高低速没有问题,我看是硬件的问题还是软件的问题。谢谢!  详情 回复 发表于 2006-5-1 19:39
 
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
主程序做如下修改后试试:

void main (void)
{
// unsigned char tmpv;

WDTCTL = WDTPW + WDTHOLD; // Stop WDT

FLL_CTL0 &= 0xbf;

// UCTL0 |=SWRST;
// UCTL0 |=CHAR; // 8-bit 字符

FLL_CTL1|=SELS+XT2OFF+SELM_XT2; //开启第二个振荡器

// do
// {
// IFG1 &= ~OFIFG; // 清除OSCFault标志
// for(tmpv = 0xff;tmpv > 0;tmpv--); //
// }
// while ((FLL_CTL0&XT1OF) == XT1OF ); // 第二个振荡器是否正常工作
// UCTL0|=SWRST;

UTCTL0= SSEL1; // UCLK=SMCLK
UBR00=0xa0; // 在4MHz下进行 9600波特率通信
UBR10=0x01; // 在4MHz下进行 9600波特率通信
UMCTL0=0x5e; // 调整寄存器
UCTL0 = CHAR; // 8-bit 字符

//UCTL0&=~SWRST;

ME1|= (UTXE0 + URXE0); // 使能 USART0 TXD/RXD
IE1|= URXIE0 ;

//IFG1 = 0x00;

P2SEL |= 0x30; // P2.4,P2.5 = USART0 TXD/RXD
P2DIR |= 0x10;

_EINT();// Ena××e interrupts

while(1)
{
LPM3;
_NOP();
}

}
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
前辈看看参数设置没有问题吧?9600,N,8,1的设置,就是不通啊。用了第二个主函数也不通,请问大概是什么问题啊,上位机我单独用串口精灵测试过,串行口是通的,收发都没有问题。然后就用串口线与449单片机的串口直接相连了。
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(初级)

4
 
请斑斑解答,拜谢过!
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
在你的程序中,对FLL+锁相环控制器(FLL_CTL0、FLL_CTL1)为什么要如此设置不理解(相互之间是矛盾的)。
1、为什么对FLL_CTL0设置为0xBF?
系统PUC后,FLL_CTL0默认为0x03,即:LFXT1在低频模式下置为失效标志和DCO置为失效标志。你设置为0xBF后,将系统所有的内、外部时钟源都人为设置成失效标志了。同时又将DOC设置为分频后提供给SMCLK/MCLK。我都糊涂了,你最终的系统时钟是源于何处??频率又是多少???

2、为什么对FLL_CTL1设置为0x26(FLL_CTL1 |= SELS+XT2OFF+SELM_XT2)?
从注释上看,你似乎想开启XT2振荡器,选择SMCLK时钟源为XT2CLK。但设置中又将XT2振荡器关闭了(XT2OFF)!还有“SELM_XT2”是个什么意思,查它的真值应该为0x10。在FLL_CTL1 操作中使用它,其实质是对FLL_DIV(LFXT1进行分频因子设置)操作,这里你将LFXT1进行了2分频。

从以上设置分析,你的USART0所需的9600波特率不是源于TX2的4M晶振。所以有可能是波特率不对,造成收发数据失败。

另外,在4MHz作为波特率时钟源,波特率调整器应该为0xC0(UBR00 = 0xA0、UBR10 = 0x01、UMCTL0 =0xC0)。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
谢谢,第一个我FLLO我试过0x20,不行,第二个用(FLL_CTL1 |= SELS+XT2OFF+SELM_XT2)?这个第二个是从试验指导书上看到的设法,查了一下,是xt2ff如果xt2不作为MCLK或者不错SMCLK是关闭xt2.昨天晚上又测试了一种算法,就是不合上位机通信,只在单片机内部通信,把2,3拐角短路,然后自发自接,但是还是不通,源程序如下:
#include <msp430x44x.h>

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
FLL_CTL0 |= XCAP14PF; // Configure load caps
UTCTL0 = SSEL1; // UCLK = SMCLK
UBR00 = 0xa0; //4MHz 9600
UBR10 = 0x01; // 4MHz 9600
UMCTL0 = 0x5e; // modulation
UCTL0 = CHAR; // 8-bit character *SWRST*
ME1 |= UTXE0 + URXE0; // Ena××e USART0 TXD/RXD
IE1 |= URXIE0; // Ena××e USART0 RX interrupt
P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD
P2DIR |= 0x10; // P2.4 output direction
_EINT(); // Ena××e interrupts
TXBUF0=0X05;
while((UTCTL0&0x01)==0);
for (;;)
{
_BIS_SR(CPUOFF); // Enter LPM0
_NOP(); // Required only for C-spy
}
}
#pragma vector = UART0RX_VECTOR
__interrupt void data_Receive(void) // UART接收中断
{ while((IFG1&UTXIFG0)==0 );
TXBUF0=RXBUF0;

}

这个程序就是循环发数,可是程序分步进行到while((UTCTL0&0x01)==0);这就不往下进行了。如果去掉这句话,程序就在下面的LPM0状态中等待,进入不料中断都,发送寄存器有数据,但是接收寄存器总是0x00,没有变化。这个程序应该不关波特率的事情。只是自发自接啊。现在都有点无奈了
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
突然又有了个想法,直接把单片机的收发两个线连在一起用程序测试行不行?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
测试过了,直接连线2。4。和2。5拐角。然后通信也不通,请各位高手指点,崩溃中~
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 
刚才测量了两个晶振之间的电压,(两个引脚间的)是1。03伏。不知道是不是正常?
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用:

谢谢,第一个我FLLO我试过0x20,不行,第二个用(FLL_CTL1 |= SELS+XT2OFF+SELM_XT2)?这个第二个是从试验指导书上看到的设法,查了一下,是xt2ff如果xt2不作为MCLK或者不错SMCLK是关闭xt2.昨天晚上又测试了一种算法,就是不合上位机通信,只在单片机内部通信,把2,3拐角短路,然后自发自接,但是还是不通,源程序如下:
#include <msp430x44x.h>

void main(void)
{.....}
这个程序就是循环发数,可是程序分步进行到while((UTCTL0&0x01)==0);这就不往下进行了。如果去掉这句话,程序就在下面的LPM0状态中等待,进入不料中断都,发送寄存器有数据,但是接收寄存器总是0x00,没有变化。这个程序应该不关波特率的事情。只是自发自接啊。现在都有点无奈了
你所说的这个程序,我从《试验指导书》(清华出版社)上看到了,对比了一下你在1楼贴出的程序,你主要是截取了初始化部分,我将它在我的TEST44X实验箱上进行了验证,发现有些小问题,经修改是可以运行的。修改后的程序如下:

#ifndef MSP430XF449_h
#include <msp430x44x.h>

unsigned char Buff;
/*******************************************************
* 模块初始化
*******************************************************/
void main (void)
{
/*
unsigned char tmpv;
FLL_CTL0 &= 0xbf;
UCTL0 |=SWRST;
// UCTL0 |=CHAR; // 8-bit 字符
FLL_CTL1|=SELS+XT2OFF+SELM_XT2; //开启第二个振荡器
do
{
IFG1 &= ~OFIFG; // 清除OSCFault标志
for(tmpv = 0xff;tmpv > 0;tmpv--); //
}
while ((FLL_CTL0 & XT1OF) == XT1OF ); // 第二个振荡器是否正常工作
// UCTL0|=SWRST;
UTCTL0=SSEL0+SSEL1; // UCLK=SMCLK
UBR00=0xa0; // 在4MHz下进行 9600波特率通信
UBR10=0x01; // 在4MHz下进行 9600波特率通信
UMCTL0=0x5e; // 调整寄存器
UCTL0 =CHAR; // 8-bit 字符
// UCTL0&=~SWRST;

ME1|= (UTXE0 + URXE0); // 使能 USART0 TXD/RXD
IE1|= URXIE0 ;
IFG1 = 0x00;
P2SEL |= 0x30; // P2.4,P2.5 = USART0 TXD/RXD
P2DIR |= 0x10;

_EINT(); // Ena××e interrupts

while(1)
{
LPM3;
_NOP();
}
}

/****************************************************
* 数据接收中断
****************************************************/
#pragma vector = UART0RX_VECTOR
__interrupt void data_Receive(void) // UART接收中断
{
// while((IFG1 & UTXIFG0) == 0 );
Buff = RXBUF0;
TXBUF0 = Buff;
while((UTCTL0 & 0x01)==0);
}

上面的程序编译以后运行,用串口助手发送数据,可以正确接收,但没有发送出去。估计是我的实验箱本身通讯口的问题所致,本想换一个已经调试完成的项目文件测试一下通讯口是否正常时,在下载程序时突然报错:“FATAL ERROR: failed to write memory at 0x1122”!
折腾了两个晚上了,仍然没有办法搞定这该死的实验箱,看来只有把那片F449“火化”了换一片,哎~~老眼昏花的,重新焊一片上去真是头疼!短期内是无法解决的。

抱歉,我的其它目标板都不使用高频晶振,故无法帮你完成测试了。你可以自己根据这一结果接着搞吧。我估计发送应该没什么大问题的。

在你原来移植借用的程序中,不能接收(当然也就谈不上发送)的主要原因是没有开总中断“_EINT();”。
另外就是在接收中断中,由于使用了“while((IFG1 & UTXIFG0) == 0 );”这个语句,虽然可以进入中断,但始终无法退出这个判断!这个我到现在都没搞明白是为什么!我在使用低频晶振32768Hz时,也是在读取缓冲区前进行接收完成判断的,没有任何问题,在这里却不行!
查看原例程时发现,原作者在读取数据前就没有这个判断语句!我想会不会是因为使用了TX2做时钟源的原因?lierda的工程师们能否给一个解释,这是为什么?
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

11
 
这位先生真是个好人,赞!其实我就是想测试一下串口,但是一直不通,唉,不知道能不能提供一个调试通的449的程序?晶振高低速没有问题,我看是硬件的问题还是软件的问题。谢谢!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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