急求!!请各位大虾帮我看看MSP430FE425的串口通讯程序有什么问题?

canycall   2006-5-27 11:21 楼主
用MSP430FE425做485串口通讯,程序不知道那有问题,串口接收中断都进不了,各位大虾帮我看看我的程序有什么问题,急啊!!!!!
void main (void)
{
init_usart();
while (1)
{
_BIS_SR (LPM0_bits); //低功耗模式0
if(nRev_UART0==1)
{
UART0_TX_BUF[0]=0xFF; //开始标志
UART0_TX_BUF[1]=ADDRESS0; //电表固定地址
UART0_TX_BUF[2]=ADDRESS1;
UART0_TX_BUF[3]='R';
nTX0_Len=4;
IFG1 |=UTXIFG0; //设置中断标志,进入发送中断程序
}

}
}
/*******************************************************************************
* 初始化USART *
********************************************************************************/
void init_usart(void)
{
P2SEL |=0x30; //P2.4,5=USART0 TX/RX
ME1 |=UTXE0+URXE0; //Ena××e USART0 TXD/RXD
UCTL0 |=CHAR; //8位数据位,1位停止位,无效验
UTCTL0 |=SSEL1; //UCLK=SMCLK
UBR00=0x6D;
UBR10=0x00;
UMCTL0=0x00; //波特率设置为9600
UCTL0 &=~SWRST; //SWRST复位,USART允许
IE1 |=URXIE0; //接受中断允许
IE1 |=UTXIE0; //发送中断允许
P2DIR=0x10; //P2.4输出,P2.5输入
} //end of init_usart
/*******************************************************************************
* USART0 接收中断 *
********************************************************************************/
interrupt[UART0RX_VECTOR] void USART0_RX(void)
{
UART0_RX_BUF[nRX0_Len_temp] = RXBUF0; //接收来自的数据

nRX0_Len_temp += 1;
if(UART0_RX_BUF[nRX0_Len_temp-1]==0x0D)
{
//接收标志置1
nRev_UART0 = 1;
nRX0_Len_temp = 0; //接收数据长度复位
}
}
/*******************************************************************************
* USART0 发送中断 *
********************************************************************************/
interrupt[UART0TX_VECTOR] void USART0_TX(void)
{
if(nTX0_Len !=0)
{
//表示缓冲区里的数据没有发送完
nTX0_Flag=0;
TXBUF0=UART0_TX_BUF[nSend_TX0];
while((UTCTL0&0x01)==0);
nSend_TX0+=1;
//如果数据发送完毕
if(nSend_TX0>=nTX0_Len)
{
nSend_TX0=0;
nTX0_Len=0;
nTX0_Flag=1;
}
}

}

回复评论 (7)

自己顶一下,怎么没人帮我看看啊,非常急啊
点赞  2006-5-27 14:07
1、建议发送不使用中断方式。改用接收完成后退出LPM0后返回主程序中执行调用(修改“IFG1 |=UTXIFG0; //设置中断标志,进入发送中断程序”)

2、接收数据前先判断是否接收完成:
while ((IFG1 & UTXIFG0) == 0); // USART0 TX buffer ready?

3、在接收中断中,完成设置“接收标志置1”后退出中断程序前,安排一条退出LPM0语句“EXIT_LPM0”,否则,在主程序中,当进入LPM0后,其后面的程序将不会被执行。

3、初始化修改/调整一下试试:
void init_usart(void)
{
UTCTL0 |=SSEL1; //UCLK=SMCLK
UBR00=0x6D;
UBR10=0x00;
UMCTL0=0x10; //波特率设置为9600
UCTL0 =CHAR; //8位数据位,1位停止位,无效验
//UCTL0 &=~SWRST; //SWRST复位,USART允许
ME1 |=UTXE0+URXE0; //Ena××e USART0 TXD/RXD
IE1 |=URXIE0; //接受中断允许
//IE1 |=UTXIE0; //发送中断允许
P2SEL |=0x30; //P2.4,5=USART0 TX/RX
P2DIR=0x10; //P2.4输出,P2.5输入
} //end of init_usart

4、若还是不能进入中断(只能在硬件仿真才会进入中断),检查PCB板的通讯器件、RS-232/RS-485转换器、232通讯电缆、485通讯端的A/B端极性、PC通讯口(COM1/COM2)等硬件设施是否连接正确或工作正常。
点赞  2006-5-27 23:30
非常感谢,我试试!!!
点赞  2006-5-28 00:04
我改成下面的了,还是不行!
void main (void)
{
while (1)
{
if(nRev_UART0==1)
{
nRev_UART0=0;
//将需要发送的数据保存
UART0_TX_BUF[0]=0xFF; //开始标志
UART0_TX_BUF[1]=ADDRESS0; //电表固定地址
UART0_TX_BUF[2]=ADDRESS1;
send_data();
}
_BIS_SR(LPM0_bits); //低功耗模式0
}
/*******************************************************************************
* USART0 接收中断 *
********************************************************************************/
interrupt[UART0RX_VECTOR] void USART0_RX(void)
{
while ((IFG1 & UTXIFG0) == 0); // USART0 TX buffer ready?
UART0_RX_BUF[nRX0_Len_temp] = RXBUF0; //接收来自的数据

nRX0_Len_temp += 1;

// if(UART0_RX_BUF[0]==0xFF && UART0_RX_BUF[1]==ADDRESS0 && UART0_RX_BUF[2]==ADDRESS1 && UART0_RX_BUF[3] == 0x52)
if(UART0_RX_BUF[nRX0_Len_temp-1]==0x0D)
{
//接收标志置1
nRev_UART0 = 1;
nRX0_Len_temp = 0; //接收数据长度复位
LPM0_EXIT;
}
}
void send_data(void)
{
int i;
for(i=0;i<=nTX0_Len;i++)
{
TXBUF0=UART0_TX_BUF[nSend_TX0];
// while((UTCTL0&0x01)==0);
}
nSend_TX0=0;
nTX0_Len=0;
}
程序还有什么问题?
点赞  2006-5-28 02:07
我不明白,为什么主程序要这么改?
在你的系统中,正在调试的单片机是通讯主机吗?那么从机是PC还是一块电表?
还有,主程序main()中最后一条语句“_BIS_SR(LPM0_bits); //低功耗模式0”是在“while(1)”循环体中还是之外,似乎main()少了一个“}”号?

调试通讯中断接收,通常调试机是被动接收的,利用PC机上的“串口调试助手”软件主动发送数据到调试机,看是否能进入中断程序,然后在中断程序中适当语句上设置断点,看接收数据是否为PC发送的数据或在“串口调试助手”的接收窗口中是否能够收到调试机在接收到PC发出的命令帧后回传的数据。
如果你是这个目的,那主程序应该是这样的:
void main (void)
{
......

init_usart();//USART0初始化
while (1)
{
_BIS_SR(LPM0_bits); //进入低功耗模式0,等待USART0接收中断
if(nRev_UART0==1)
{
nRev_UART0=0;
//将需要发送的数据保存
UART0_TX_BUF[0]=0xFF; //开始标志
UART0_TX_BUF[1]=ADDRESS0; //电表固定地址
UART0_TX_BUF[2]=ADDRESS1;
send_data();//回发数据(执行完后看主机是否能收到完整的数据帧)
}
}
}
点赞  2006-5-28 23:29
你的问题在于_BIS_SR (LPM0_bits); //低功耗模式0无法执行,接收中断是可以进入,但返回时仍然在低功耗模式。应该在接收中断返回前加入_BIC_SR(CPUOFF)指令
点赞  2006-5-29 18:07
已经在接收状态退出了底功耗模式,现在我发现了问题是没有对MX485的控制端进行控制,现在的问题是怎样去操作HC595
点赞  2006-5-30 20:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复