打印

F149接收数据异常

[复制链接]
947|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
android2|  楼主 | 2017-10-25 17:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大神好,
为何波特率9600低速的时候正常,发送和接收都是一致的,
但是115200就不行了呢?串口助手发送和接收不一致了。


#include <msp430x14x.h>
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/*当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数*/
#define baud 115200 //设置波特率的大小
#define baud_setting (uint)((ulong)CPU_F/((ulong)baud)) //波特率计算公式
#define baud_h (uchar)(baud_setting>>8) //提取高位
#define baud_l (uchar)(baud_setting) //低位
/*RS485控制管脚*/
#define RS485_CTR1 P3OUT |= BIT3; //控制线置高,RS485发送状态
#define RS485_CTR0 P3OUT &= ~BIT3; //控制线置低,RS485接收状态
//***********************************************************************
// MSP430IO口初始化
//***********************************************************************
void Port_Init()
{
P3DIR |= BIT3; //P20口为RS485控制口,输出模式
P3OUT |= BIT3; //置高P20
}
//***********************************************************************
// 系统时钟初始化
//***********************************************************************
void Clock_Init()
{
uchar i;
BCSCTL1&=~XT2OFF; //打开XT2振荡器
BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
do{
IFG1&=~OFIFG; //清楚振荡器错误标志
for(i=0;i<100;i++)
_NOP();
}
while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待
IFG1&=~OFIFG;
}
//***********************************************************************
// MSP430内部看门狗初始化
//***********************************************************************
void WDT_Init()
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
}
//*************************************************************************
// MSP430串口初始化
//*************************************************************************
void UART_Init()
{
U1CTL|=SWRST + CHAR; //复位SWRST,8位数据模式
U1TCTL|=SSEL1; //SMCLK为串口时钟
U1BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
U1BR0=baud_l; //N=UBR+(UxMCTL)/8
U1MCTL=0x4A; //微调寄存器为0,波特率9600bps
ME2|=UTXE1; //UART1发送使能
ME2|=URXE1; //UART1接收使能
U1CTL&=~SWRST;
IE2|=URXIE1; //接收中断使能位
P3SEL|= BIT6 + BIT7; //设置IO口为第二功能模式,启用UART功能
P3DIR|= BIT6; //设置TXD1口方向为输出
}
//*************************************************************************
// 串口1发送数据函数
//*************************************************************************
void Send_Byte(uchar data)
{
RS485_CTR1;
while(!(IFG2&UTXIFG1)); //发送寄存器空的时候发送数据
U1TXBUF=data;
//RS485_CTR0;
}
//*************************************************************************
// 串口1发送字符串函数
//*************************************************************************
void Print_Str(uchar *s)
{
while(*s != '\0')
{
Send_Byte(*s++);
delay_ms(2);
}
}
//*************************************************************************
// 处理来自串口1的接收中断
//*************************************************************************
#pragma vector=UART1RX_VECTOR
__interrupt void UART1_RX_ISR(void)
{
uchar data=0;
data=U1RXBUF; //接收到的数据存起来
Send_Byte(data); //将接收到的数据再发送出去
delay_ms(5); //切换之前先有个小延时
RS485_CTR0; //切换到接收状态
}
//*************************************************************************
// 主函数
//*************************************************************************
void main(void)
{
WDT_Init(); //看门狗设置
Clock_Init(); //系统时钟设置
Port_Init(); //端口初始化
UART_Init(); //串口设置初始化
Print_Str("DM430-A Board UART Test\n"); //发送字符串测试
RS485_CTR0; //切换到接收状态
_EINT(); //开中断
while(1) //无限循环
{
}
}

相关帖子

沙发
拉克丝| | 2017-10-25 17:16 | 只看该作者
MSP430发给谁?

使用特权

评论回复
板凳
lefeng| | 2017-10-25 17:25 | 只看该作者
提高MSP430的晶振试试

使用特权

评论回复
地板
qinlicn| | 2017-10-26 08:48 | 只看该作者
//*************************************************************************
// MSP430串口初始化
//*************************************************************************
void UART_Init()
{
U1CTL|=SWRST + CHAR; //复位SWRST,8位数据模式
U1TCTL|=SSEL1; //SMCLK为串口时钟
U1BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
U1BR0=baud_l; //N=UBR+(UxMCTL)/8
U1MCTL=0x4A; //微调寄存器为0,波特率9600bps
ME2|=UTXE1; //UART1发送使能
ME2|=URXE1; //UART1接收使能
U1CTL&=~SWRST;
IE2|=URXIE1; //接收中断使能位
P3SEL|= BIT6 + BIT7; //设置IO口为第二功能模式,启用UART功能
P3DIR|= BIT6; //设置TXD1口方向为输出
}

三个波特率寄存器的设置参考一下官方例程吧,有两个:
  UBR00 = 0x45;                             // 8MHz 115200
  UBR10 = 0x00;                             // 8MHz 115200
  UMCTL0 = 0x00;                            // 8MHz 115200 modulation
第二个:
  UBR01 = 0x45;                             // 8Mhz/115200 - 69.44
  UBR11 = 0x00;                             //
  UMCTL1 = 0x2C;                            // modulation

有条件的话,建议使用外部晶振,3.6864M,UART误差小很多。

使用特权

评论回复
5
zhangbo1985| | 2017-10-27 13:36 | 只看该作者
qinlicn 发表于 2017-10-26 08:48
//*************************************************************************
// MSP430串口初始化
//** ...

串口初始化的问题要谨慎的

使用特权

评论回复
6
wangdezhi| | 2017-10-28 22:07 | 只看该作者
通信两端的波特率都一样了吗?

使用特权

评论回复
7
isseed| | 2017-10-28 22:07 | 只看该作者
是不是能够接收到信号呢

使用特权

评论回复
8
xietingfeng| | 2017-10-28 22:08 | 只看该作者
串口通信需要共地处理的。

使用特权

评论回复
9
wangdezhi| | 2017-10-28 22:12 | 只看该作者
需要配置相同的波特率才能通信。

使用特权

评论回复
10
xietingfeng| | 2017-10-28 22:12 | 只看该作者
基准信号不一样,可能导致数据处理有问题。

使用特权

评论回复
11
isseed| | 2017-10-28 22:12 | 只看该作者
可能不支持高波特率的通信。

使用特权

评论回复
12
sdlls| | 2017-11-1 22:33 | 只看该作者
使用的多大的晶振?

使用特权

评论回复
13
pixhw| | 2017-11-1 22:33 | 只看该作者
硬件电路时怎么设计的?

使用特权

评论回复
14
pixhw| | 2017-11-1 22:34 | 只看该作者
是不是通信的IO信号都正常吗?

使用特权

评论回复
15
sdlls| | 2017-11-1 22:34 | 只看该作者
如果是内部的DCO最大也就是9600了。

使用特权

评论回复
16
hellosdc| | 2017-11-3 21:57 | 只看该作者
通信距离 长 ?

使用特权

评论回复
17
uiint| | 2017-11-3 21:57 | 只看该作者
估计是波特率太高时,硬件不支持。

使用特权

评论回复
18
51xlf| | 2017-11-3 21:58 | 只看该作者
波特率越小越不容易出错。

使用特权

评论回复
19
hellosdc| | 2017-11-3 22:04 | 只看该作者
用 双绞线 试试

使用特权

评论回复
20
51xlf| | 2017-11-3 22:04 | 只看该作者
有可能是发送频率过快。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

137

主题

784

帖子

0

粉丝