4830|4

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

430串口通讯问题 [复制链接]

//两块电路板,单片机都是MSP430F427,一块通过串口发送,另一块通过串口接收,现在问题是
//发送板一直没有发出信号,测量输出端口(TX),一直保持高电平,通过硬件仿真跟踪发现只要
//将该串口引脚设置为串口功能该引脚(TX)就一直处于高电平。不明白为什么,希望高手指点是
//不是程序有问题,首先可以确定硬件电路没发现问题下面是两个程序,一个是发射控制程序,
//另一个是接收程序

//发射程序
void IO_init (void)
{
//定义液晶显示器控制端口为输出
P1DIR|=((1<<5)|(1<<6)|(1<<7));
//定义液晶显示器背光控制端口为输出
// P2DIR|=(1<<P2DIR_0);
P2DIR|=(1<<0); // P2DIR_0 宏定义有问题不能正常使用,要改为数字
//定义DA转换器的控制端口为输出
P1DIR|=((1<<0)|(1<<1)|(1<<2)); //定义DA转换器的控制端口为输出
// P1DIR|=((1<<0)|(1<<1)|(1<<2));
//定义电源状态监测口p1.4为输入
P1DIR&=~(1<<4);
//定义电源控制端口p1.3为输出
P2DIR|=(1<<3);
P2OUT&=~(1<<3);
//定义指示灯控制端口P2.1为输出
P2DIR|=(1<<1);
P2OUT|=(1<<1);

//定义P2.4和P2.5为外设功能
P2SEL|=((1<<4)|(1<<5));
//定义P2.5为输入(串口的输入)
P2DIR&=~(1<<5);
//定义P2.4为输出(串口的输出)
P2DIR|=(1<<4);
// P2OUT&=~(1<<4);
}

/********************************************************************
函 数 名:Usart0init ()
功 能:UART0初始化函数
说 明:
入口参数:设定值
返 回 值:
设 计:HX 日 期:2006-7-21
修 改: 日 期:
********************************************************************/
void Usart0init(void)
{

ME1 |=( (1<<6)|(1<<7)); //UTXE0 + URXE0; // Ena××e USART0 TXD/RXD
UCTL0= (1<<4); // 8-bit character
UTCTL0= (1<<4); // UCLK = ACLK 8MHZ
UBR00 = 0x45; // 8MHz 115200
UBR10 = 0x00; // 8MHz 115200
UMCTL0 = 0x6F; // modulation
UCTL0 &= ~(1<<0);//SWRST; // Initialize USART state machine

IE1 |= 0xc0; //URXIE0 + UTXIE0; // Ena××e USART0 RX/TX interrupt

/*
P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD
ME1 |= UTXE0 + URXE0; // Ena××ed USART0 TXD/RXD
UCTL0 |= CHAR; // 8-bit character, SWRST = 1
UTCTL0 |= SSEL1 + SSEL0 + URXSE; // UCLK = ××CLK, start edge detect
UBR00 = 0x36; // 19200 from 1Mhz
UBR10 = 0x00;
UMCTL0 = 0x6B; // Modulation
UCTL0 &= ~SWRST; // Initialize USART state machine
IE1 |= URXIE0; // Ena××e USART0 RX interrupt
*/

}



/********************************************************************
函 数 名:Usart0_rx (void)
功 能:UART0接收中断函数
说 明:
入口参数:设定值
返 回 值:
设 计:HX 日 期:2006-7-22
修 改: 日 期:
********************************************************************/
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
}

/********************************************************************
函 数 名:Usart0_tx (void)
功 能:UART0发送中断函数
说 明:
入口参数:设定值
返 回 值:
设 计:HX 日 期:2006-7-22
修 改: 日 期:
********************************************************************/
#pragma vector=UART0TX_VECTOR
__interrupt void usart0_tx (void)
{

}


void main( void )
{
Sysclk_init();
// a××("mov.w #WDTPW+WDTHOLD,&WDTCTL");
WDTCTL = WDTPW |0x0080; //WDTHOLD; // Stop watchdog timer
// WDTCTL|=(1<<7); //关闭看门狗
// _BIS_SR( GIE); //允许中断

IO_init();
SD16_init();
// Timer_init();
Usart0init();
_EINT();
while(1) //开始检测
{

P2OUT|=(1<<1);
Delay_ms(50000);
P2OUT&=~(1<<1);
Delay_ms(50000);
timer_1++;
TXBUF0=8; //timer_1;
SD16CCTL0|=(1<<1); //开始AD转换
}
}


//接收程序
void IO_init (void)
{
//定义液晶显示器控制端口为输出
P1DIR|=((1<<5)|(1<<6)|(1<<7));
//定义液晶显示器背光控制端口为输出
// P2DIR|=(1<<P2DIR_0);
P2DIR|=(1<<0); // P2DIR_0 宏定义有问题不能正常使用,要改为数字
//定义DA转换器的控制端口为输出
P1DIR|=((1<<0)|(1<<1)|(1<<2)); //定义DA转换器的控制端口为输出
// P1DIR|=((1<<0)|(1<<1)|(1<<2));
//定义电源状态监测口p1.4为输入
P1DIR&=~(1<<4);
//定义电源控制端口p1.3为输出
P2DIR|=(1<<3);
P2OUT&=~(1<<3);
//定义指示灯控制端口P2.1为输出
P2DIR|=(1<<1);
P2OUT|=(1<<1);

//定义P2.4和P2.5为外设功能
P2SEL|=((1<<4)|(1<<5));
//定义P2.5为输入(串口的输入)
P2DIR&=~(1<<5);
//定义P2.4为输出(串口的输出)
P2DIR|=(1<<4);
// P2OUT&=~(1<<4);
}
/********************************************************************
函 数 名:Usart0init ()
功 能:UART0初始化函数
说 明:
入口参数:设定值
返 回 值:
设 计:HX 日 期:2006-7-21
修 改: 日 期:
********************************************************************/
void Usart0init(void)
{

ME1 |=( (1<<6)|(1<<7)); //UTXE0 + URXE0; // Ena××e USART0 TXD/RXD
UCTL0 = (1<<4); // 8-bit character
UTCTL0 = (1<<4); // UCLK = ACLK 8MHZ
UBR00 = 0x45; // 8MHz 115200
UBR10 = 0x00; // 8MHz 115200
UMCTL0 = 0x6F; // modulation
UCTL0 &= ~0x01; //SWRST; // Initialize USART state machine

IE1 |=0xc0; // URXIE0 + UTXIE0; // Ena××e USART0 RX/TX interrupt

/*
P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD
ME1 |= UTXE0 + URXE0; // Ena××ed USART0 TXD/RXD
UCTL0 |= CHAR; // 8-bit character, SWRST = 1
UTCTL0 |= SSEL1 + SSEL0 + URXSE; // UCLK = ××CLK, start edge detect
UBR00 = 0x36; // 19200 from 1Mhz
UBR10 = 0x00;
UMCTL0 = 0x6B; // Modulation
UCTL0 &= ~SWRST; // Initialize USART state machine
IE1 |= URXIE0; // Ena××e USART0 RX interrupt
*/

}



/********************************************************************
函 数 名:Usart0_rx (void)
功 能:UART0接收中断函数
说 明:
入口参数:设定值
返 回 值:
设 计:HX 日 期:2006-7-22
修 改: 日 期:
********************************************************************/
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
xyz=RXBUF0;
}

/********************************************************************
函 数 名:Usart0_tx (void)
功 能:UART0发送中断函数
说 明:
入口参数:设定值
返 回 值:
设 计:HX 日 期:2006-7-22
修 改: 日 期:
********************************************************************/
#pragma vector=UART0TX_VECTOR
__interrupt void usart0_tx (void)
{

}


void main( void )
{
Sysclk_init();
// a××("mov.w #WDTPW+WDTHOLD,&WDTCTL");
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
// WDTCTL|=(1<<7); //关闭看门狗
// _BIS_SR( GIE); //允许中断

IO_init();
P2OUT|=(1<<0);
LCD_INI();
SD16_init();
Usart0init();
_EINT();
// Timer_init();
// Usart0init();
while(1) //开始检测
{

P2OUT|=(1<<1);
Delay_ms(50000);
P2OUT&=~(1<<1);
float_to_LED(disp_buffer,xyz1,TA××E_0,7);
display();
Delay_ms(50000);
timer_1++;
write_to_da(timer_1);
// test_value= timer_1/1000.0;
float_to_LED(disp_buffer,xyz,TA××E_0,7);
display();
SD16CCTL0|=(1<<1); //开始AD转换
}
}

最新回复

给点建议 1:I/O口初始化部分能用宏最好,增加可读性 2:串口采用主动发送,中断接收。  详情 回复 发表于 2009-1-6 14:47
 
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你所谓的可以确定硬件电路是好的,是怎么确定的?
建议你下个TI的例程跑跑,如果能跑通的话,再参照TI的例程来看看软件是哪儿的问题。
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这个程序问题太多:
1.接收中断内不应有WHILE语句,会导致进入中断后无限等待,退不出中断
********************************************************************/
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?}

/********************************************************************
2.发送中断为空函数,所以发送时无相应的操作,管脚电平不会有变化
#pragma vector=UART0TX_VECTOR
__interrupt void usart0_tx (void)
{

}


3.MAIN()函数中不应延时后就发送,应检测BUSY位后才决定是发送还是继续等待.

MAIN( void)
{
......
while( ..... ) ;//检测BUSY位
....
}

4.收发时,最好关闭其他中断,否则会影响收发时序导致收发数据出错.
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
程序有点乱,一看I/O口的初始化就有点特殊,没细看。自己找个TI的例程看下,就能解决
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
给点建议
1:I/O口初始化部分能用宏最好,增加可读性
2:串口采用主动发送,中断接收。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

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