51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > MSP430单片机 > 详细内容
采用MSP430地址位多机协议通讯程序
发布时间:2009/7/27  阅读次数:872  字体大小: 【】 【】【
各位同仁,响应版主号召,现就"爱好者"同志提出的<<关于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(累加和校验高字节)
   单片机接收程序如下,同时将收到的数据再返回给上位机.
   程序中所使用的变量.请自行定义.有标注说明.

  

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++;
                   }
               }
           }
       }
   }
}

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号