MCU:MSP430F2618
RS485接口芯片:MAX3485
采用第三方开发板作为主机(MCU),从机为一个RS485协议的气体传感器模块
通信要求:通用 R S 4 8 5 总线,所有控制板连接在一条 R S 4 8 5 总线上;
通信方式:通用异步接收 /发送( UART),波特率为 9 60 0,数据位为 8 位, 1 位停止位,偶校验;
我写的的程序主要函数如下,完整程序在附件里,看不出问题出在哪里,就是不能成功实现RS485通信,主机发送指令后,从机返回的数据无法接收到,到底是主机发送格式的问题,还是从机返回数据主机没收到,我无法判断出来,请专家帮忙看看,谢了!
//*************************************************************************
// 系统时钟初始化
//*************************************************************************
void Clock_Init()
{
BCSCTL1 &= ~XT2OFF; //打开XT2振荡器
BCSCTL3 |= XT2S_2; // Mode 2 for XT2 : 3 - 16 MHz
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (uint i = 0xFF; i > 0; i--); // Time for flag to set
}
while (IFG1 & OFIFG); // OSCFault flag still set?
IFG1 &= ~OFIFG;
BCSCTL2 |= SELM_2+SELS; //MCLK为8MHZ,SMCLK为8MHZ
}
//***********************************************************************
// MSP430串口初始化
//*************************************************************************
void UART_Init()
{
UCA1CTL1 |= UCSWRST;
UCA1CTL0 |= UCPEN + UCPAR; //奇偶校验被启用,偶校验,8位数据模式
UCA1CTL1 |= UCSSEL_2; //SMCLK为串口时钟 + UCBRKIE
UCA1BR0 = 0x34; //波特率设置
UCA1BR1 = 0x00; //9600bps@8MHz
UCA1MCTL |= UCBRF_1+UCOS16;
/*
UCA1CTL1 |= UCSSEL_1; // CLK = ACLK
UCA1BR0 = 0x03; // 32kHz/9600 = 3.41
UCA1BR1 = 0x00; //
UCA1MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3
*/
P3SEL|= BIT6 + BIT7; //设置IO口为第二功能模式,启用UART功能
P3DIR|= BIT6; //设置TXD1口方向为输出
UCA1CTL1 &= ~UCSWRST;
UC1IE |= UCA1RXIE; //接收中断启用
}
//***********************************************************************
// CRC16 码直接计算法
//*pSendBuf:首字节指针
//nEnd:数据校验长度
//*************************************************************************
unsigned int GetCheck(unsigned char *pSendBuf,unsigned char nEnd)
{
unsigned char i,j;
unsigned int wCrc = (unsigned int)(0xffff);
for(i = 0;i<nEnd;i++)
{
wCrc ^= (unsigned int)(pSendBuf[i]);
for(j = 0;j<8;j++)
{
if(wCrc&0x01)
{
wCrc >>=1;
wCrc ^= 0xA001;
}
else wCrc >>=1;
}
}
return wCrc;
}
//*************************************************************************
// 串口1发送数据函数
//*************************************************************************
void Send_Byte(uchar data)
{
while(!(UC1IFG & UCA1TXIFG)); //发送寄存器空的时候发送数据
UCA1TXBUF = data;
}
//*************************************************************************
// 串口1发送字符串函数
//*************************************************************************
void Send_CMD(uchar *s,uchar n)
{
uint crc16;
crc16 = GetCheck(s,n-2); //CRC16校验
s[n-2] = crc16 & 0xff; //校验低
s[n-1] = (crc16>>8) & 0xff; //校验高
RS485_CTR1; //切换到发送状态
// delay_us(100);
for(uchar i=0;i<n;i++)
{
Send_Byte(s[i]);
}
while(!(UC1IFG & UCA1TXIFG));
// delay_us(200);
RS485_CTR0; //切换到接收状态
}