/*
采用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++;
}
}
}
}
}
}
上一篇:关于MSP430单片机的大数组初始化
下一篇:MSP430 SPI接口(模式)通信
推荐阅读最新更新时间:2024-11-08 11:11
设计资源 培训 开发板 精华推荐
- EVAL-AD7654CB,AD7654 评估板,48 引脚,16 位 PulSAR 模数转换器
- TEA2025功放板
- 支持CAN通信的SimpleFOC无刷驱动
- 使用 Analog Devices 的 LTC1643AHCGN 的参考设计
- LR8 高输入电压、5.0V 输出线性稳压器的典型应用
- LT3595A 16 通道降压模式 LED 驱动器的典型应用
- 基于TL494的10*10的可调电源
- DC851A-A,使用 LTC2299IUP DeMUX 双通道、80Msps、14 位 ADC 的演示板
- AlphaPose-实时全身多人姿势估计与跟踪系统
- MPC86XADS、MPC8xx 参考板,基于 MPC860DE MPU PowerQUICC MPC8xx 处理器
- RIGOL那些年我们用过的仪器出炉,赶紧为你喜欢的作品投票吧!
- 下载有礼|西北模电王《新概念模拟电路》全五册
- 赞一赞我国的青年:专访TI杯2019年国赛9支优秀队伍
- 看展闯关赢好礼|MPS 芯云展厅与您不见不散!
- “集齐五友”参与KW41Z创意征集活动,赢100元京东卡!
- 关注 PI 最新 SCALE-iDriver IC产品系列 答题有好礼!
- 4小时实战+剖析:TI工程师教你快速上手 各种无线产品开发 (限量$14售CC1352R1无线开发板,助你参与动手实验)
- 免费测评|涂鸦三明治Wi-Fi&BLE 开发板
- 有奖直播:市场环境不确定,为物联网设备保驾护航英飞凌很确定
- LPC4370重磅来袭 有奖问答赢好礼!