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

当前位置:首页 > 单片机技术文章 > MSP430单片机 > 详细内容
MSP430点对多点通信原理
发布时间:2009/8/2  阅读次数:2604  字体大小: 【】 【】【
作者:huolf

MSP430系列的多机通信有两种实现方式:一种是用地址位来指示地址字符,另一种是用线路足够长的空闲来指示地址字符。以下的点对多点多机通信实例,采用地址位方式实现主机对多机的寻址。一般从机以总线方式和主机连接。每次主机以某一地址呼叫,只有地址相符的从机能识别呼叫并作出响应。

为以下的多机通讯实例设计的简单的协议:

通信帧结构

     随机字节   0xFF0xAA0x55    地址      数据      结束
  
  随机字节:在传输的开始发送的任意字节

  先导字段:先导字段有0xFF、0xAA和0x55

  地址:取值1—16,即主机可以呼叫16个从机之一,发送时地址位有效

  结束:0
  
主机功能:以从机地址呼叫,接着发送字符串,最后以发送0结束。

从机功能:识别呼叫地址,发现相符时接收后续数据,接收到0时结束。

本例值实现了主机向多个从机发送字符串的功能。如果要实现主机接收从机数据,可以修改以上通信协议,增加以下功能:

  主机以特定字符串请求从机发送数据,在帧发完一定时间内等待从机响应。

  如果主机在请求从机发送后规定时间内未收到响应,即认为超时错,结束等待。

  从机在收到请求发送字符串后,发送数据帧响应,可以仍用以上帧格式。

以下是点对多点通信系统的主程序:

/*******************************/

/*说明:UART点对多点多机通信主机程序                                       */

/*UART1以9600bps,8位数据,1位地址,1位停止模式发送。           */

/*发送地址位时,地址位为1,接着发送字符串,以字符串末的0结束。*/

/*****************************************************************/

Include <msp430x14x.h>

Void Init(void);                                                                     //声明UART初始化函数

Char Data[11]=”MSP430 Demo”;

Void main()
{
   Unsigned int i;
   WDTCTL=WDTPW+WDTHOLD;                          //关闭看门狗
   Init();

   While(1)
{
  UTCTL1|=TXWKE;
  TXBUF1=0x01;
  While((UTCTL1&0x01)==0);

  UTCTL&=~TXWAKE;
  For(i=0;i<=11;i++)
   {
     TXBUF1=Data;

      While((UTCTL1&0x01)==0);
     }
  }
}

  

Void Init(void)
{
  UCTL1&=~SWRST;           //SWRDT复位,UART允许
  UCTL1=0x10+MM;           //8位数据位,1位停止位,地址位模式
  UBR01=0x03;
  UBR11=0x00;
  UMCTL1=0x4A;              //使用32kHZ晶振,波特率为9600bps

UTCTL1=0x10;                 //选定ACLK(32kHZ晶振)为时钟源

ME2|=0x30;                     //UART发送,接收模块允许。

P3SEL=0xC0;                   //P3.6、P3.7由UART1发送模块占用

P3DIR=0x40;                     // P3.6输出

}

-------------------------------------------------------------------------------
以下是点对多点通信系统的从程序。
/**************************************************************/
/*说明:UART点对多点多机通信从机程序                                       */
/*UART1以9600bps,8位数据,1位地址,1位停止模式发送。           */
/*当地址位时,确认呼叫,接收后面字符,并检查结束0。                 */
/***************************************************************/

Include <msp430x14x.h>

Void Init(void);   
#define ADDR 0x01;
Char Data[20],Buffer[20];
Unsigned charj,count;

Void main()
{
  WDTCTL=WDTPW+WDTHOLD;                          //关闭看门狗
   Init();
   _EINT();
   While(1);
}

  
Void Init(void)
{
  UCTL1&=~SWRST;                     //SWRDT复位,UART允许
  UCTL1=0x10+MM;                      //8位数据位,1位停止位,地址位模式
  UBR01=0x03;
  UBR11=0x00;
  UMCTL1=0x4A;                          //使用32kHZ晶振,波特率为9600bps
  UTCTL1=0x10;                           //选定ACLK(32kHZ晶振)为时钟源
  ME2|=0x30;                               //UART发送,接收模块允许。
  P3SEL=0xC0;                             //P3.6、P3.7由UART1发送模块占用
  P3DIR=0x40;                             // P3.6输出
  IE2=URXIE1;                             //接收允许中断
  }

  #pragma vector=UART1RX_VECTOR
  __interrupt void UART1RX(void)
{
   If(URCTL&URXWIE)                        //接收为地址方式时等待正确的地址出现
  {
      If(RXBUF1==ADDR)                   //地址正确,改变为接收数据方式,准备接收
      {
        URCTL1&=~URXWIE;
        Count=0;
      }
}

else                                                   //接收为数据方式时
{   
  Data[count]=RXBUF1;                          //数据存入Data数组中
  If(Data[count++]==0)                        //是否到达末尾
   {
     URCTL1|=URXWIE;                           //到达末尾时改变接收为地址方式
     For(j=0;j<count;j++)
      Buffer[j]=Data[j];                 //复制字符串
     }

  }

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

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

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