/*
选用MSP430地址位多机协议通讯程序
微控论坛原创著作 作者:tianxy
各位同仁,呼应版主召唤,现就”爱好者”同志提出的<<关于UART的地址位多机通讯>>做出自己的见地.期望咱们多多点拨.
在 430串口发送格局中,咱们能够看到.一个字节由1个开端位+7位或8位数据位+校验位+1位或2位中止组成.假如要运用
430的地址位多机协议.主要是将UxCTL寄存器中的MM方位1,一起将UxRCTL寄存器中的URXWIE置1.
例程如下:
上位机先用Mark校验方法.格局为:1个开端位+8位数据位+1位校验位+1位中止位.
发送5个字节:0x02(地址号) 0x05(指令字节) 0x00(预留字节) 0x07(累加和校验低字节) 0x00(累加和校验高字节)
单片机接纳程序如下,一起将收到的数据再回来给上位机.
程序中所运用的变量.请自行界说.有标示阐明.
Microcontrol CODE
*/
void COM_Init(void)
{
//———————————串口初始化函数
U0CTL &= ~SWRST;
U0TCTL&=~TXWAKE;
U0CTL|=CHAR+MM;//8bit+地址位多机协议
IFG1&=~(URXIFG0+UTXIFG0);//接纳,发送中止标志清零
ME1|=(UTXE0+URXE0); //使能接纳和发送中止
U0TCTL|=SSEL0+SSEL1; //时钟挑选–MCLK
UBR10=0x04;//6M/4800
UBR00=0xe2;
UMCTL0=0x00;//波特率调整操控
IE1|=URXIE0;//使能接纳中止
URCTL0|=URXWIE;//只要收到地址字符时才永许中止
}
#pragma vector=USART0RX_VECTOR//接纳中止处理
__interrupt void USART0RX(void)
{
// addr为本机地址号
unsigned char date,date1;
_EINT();
if((URCTL0&0x21)==BIT0)//RXERR
{
//呈现过错且该过错非溢出引起
URCTL0=URXWIE;//只要收到地址字符时才答应中止
ought_receive=0;//应接纳个数变量
mling_flag=0; //指令标志变量
order=0;//指令变量
date=RXBUF0;
}
else
{
date=RXBUF0;
URCTL0&=~RXERR;//接纳过错清零
if(URCTL0&URXWIE)//接受到地址位否?
{
if(date==addr)
{
URCTL0&=~URXWIE;
jieshou_ljh=date;
}
order=0;
ought_receive=0;
mling_flag=0;
}
else//接受指令、数据
{
date1=date;
if((mling_flag&0x01)==0x00)
{
order=date;
jieshou_ljh+=date;//核算累加和
switch(date)
{
case 0x05://指令
ought_receive=3;//除指令字节外还要接纳3个字节
fmaddr=0;
mling_flag|=0x01;//已收到指令字节,下一字节应为数据
break;
default:
URCTL0=URXWIE;
ought_receive=0;
order=0;
mling_flag=0;
jieshou_ljh=0;
P2OUT&=~BIT7;
break;
}
}
else
{
if(ought_receive==0)//接纳犯错
{
URCTL0|=URXWIE;//只要收到地址字符时才永许中止
date1=RXBUF0;
P2OUT&=~BIT7;//RS485 操控信号
jieshou_ljh=0;
order=0;
mling_flag=0;
}
else
{
if(ought_receive==2)//收到累加和的低位
{
ought_receive=1;
txy=date;
}
else if(ought_receive==1)//收到累加和的高位,表明接纳结束,能够处理并发送数据
{
P2OUT|=BIT7;//RS485 操控信号
ought_receive=0;
date1=(unsigned char)txy;//核算累加和.
txy=(unsigned int)date;
txy<<=8;
txy|=date1;
_NOP();
if(jieshou_ljh==txy)
{
IE1&=~URXIE0;//封闭接纳中止
ME1|=UTXE0;//USART0答应发送数据
UTCTL0|=TXWAKE;//USART0发送地址位
ME1|=UTXE0;//USART0答应发送
IFG1&=~(UTXIFG0+URXIFG0);
TXBUF0=addr;//——————————————————–地址
while((UTCTL0&BIT0)==0);//当发送空时,TXEPT=1
TXBUF0=order;//——————————————————–指令
while((UTCTL0&BIT0)==0);//当发送空时,TXEPT=1
TXBUF0=0x00;//——————————————————–预留
while((UTCTL0&BIT0)==0);//当发送空时,TXEPT=1
TXBUF0=0x07;//——————————————————–累加和低
while((UTCTL0&BIT0)==0);//当发送空时,TXEPT=1
TXBUF0=0x00;//——————————————————–累加和高
while((UTCTL0&BIT0)==0);//当发送空时,TXEPT=1
ME1&=~UTXE0;//开端下一次数据帧接纳
ME1|=URXE0;
IE1&=~(UTXIE0+URXIE0);
IFG1&=~(UTXIFG0+URXIFG0);
ought_receive=0;
jieshou_ljh=0;
URCTL0=URXWIE;
IE1|=URXIE0;
mling_flag=0;
P2OUT&=~BIT7;//转为收
}
}
else if(ought_receive>2)
{
ought_receive–;
jieshou_ljh+=date;//核算累加和.
receive_buf[fmaddr]=date;//数据寄存数组
fmaddr++;
}
}
}
}
}
}