MSP430中继通讯协议

发布者:灵感发电站最新更新时间:2017-09-09 来源: eefocus关键字:MSP430  中继通讯协议 手机看文章 扫描二维码
随时随地手机看文章
  1. //===========================================================================//  

  2. //                MSP430接收中继端协议——徐方鑫                             //  

  3. //                通讯协议格式为:16进制发送                                 //  

  4. //                53 09 AA AA AA AA AA AA 45                                 //  

  5. //                53为数据包打头,字符's'                                    //  

  6. //                09为字符串长度,char类型                                   //  

  7. //                其后AA AA AA 等为数据内容                                  //  

  8. //                45为数据包结尾,字符'E'                                    //  

  9. //===========================================================================//  

  10.   

  11. #include "msp430x54x.h"  

  12. #include   

  13. #include   

  14. #include   

  15. #include "PIN_DEF.H"  

  16.   

  17. #define uchar unsigned char  

  18. #define uint unsigned int  

  19.   

  20. #define  FLL_FACTOR     749                // FLL_FACTOR: DCO倍频系数      

  21. #define DATA_BAG_ERROR_MAX 0x5000         //最大数据包长度,int类型,串口所用8位基本都支持  

  22.   

  23. char event;     //待机模式事件  

  24. uint Data_Bag_Length,Data_Length;   //Data_Bag_Leangth接收数据包的长度  

  25. char RXBuffer[20]; // 接收缓存  

  26.   

  27.   

  28. //***************************************************************************//  

  29. //                                                                           //  

  30. //                 初始化主时钟: MCLK = XT1×(FLL_FACTOR+1)                  //  

  31. //                                                                           //  

  32. //***************************************************************************//  

  33. void Init_CLK(void)  

  34. {  

  35.   WDTCTL     = WDTPW + WDTHOLD                            ; // 关看门狗  

  36.   P7SEL     |= 0x03                                       ; // 端口选择外部低频晶振XT1  

  37.   UCSCTL6   &=~XT1OFF                                     ; // 使能外部晶振   

  38.   UCSCTL6   |= XCAP_3                                     ; // 设置内部负载电容  

  39.   UCSCTL3   |= SELREF_2                                   ; // DCOref = REFO  

  40.   UCSCTL4   |= SELA_0                                     ; // ACLK   = XT1    

  41.   __bis_SR_register(SCG0)                                 ; // 关闭FLL控制回路  

  42.   UCSCTL0    = 0x0000                                     ; // 设置DCOx, MODx  

  43.   UCSCTL1    = DCORSEL_7                                  ; // 设置DCO振荡范围  

  44.   UCSCTL2    = FLLD__1 + FLL_FACTOR                       ; // Fdco = ( FLL_FACTOR + 1)×FLLRef = (649 + 1) * 32768 = 21.2992MHz  

  45.   __bic_SR_register(SCG0)                                 ; // 打开FLL控制回路                                                              

  46.   __delay_cycles(1024000)                                 ;   

  47.   do  

  48.   {  

  49.     UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志                                                              

  50.     SFRIFG1 &= ~OFIFG                                     ;   

  51.   }while(SFRIFG1&OFIFG)                                   ; // 检测振荡器错误标志   

  52. }  

  53. //***************************************************************************//  

  54. //                                                                           //  

  55. //  Init_Port(void): 设置IO端口                                              //  

  56. //                                                                           //  

  57. //***************************************************************************//  

  58. void Init_Port(void)  

  59. {  

  60.   P5DIR  |= POWER                                                  ; // 主电源  

  61.   MAIN_POWER_ON                                                    ;  

  62.   P7DIR  |= LED_PWR                                                ; // 发光二极管电源  

  63.   P7OUT  &=~LED_PWR                                                ;  

  64.   INTERNAL_PULL_UP                                                 ; // 使能键盘端口内部上拉电阻   

  65.   ROW_IN_COL_OUT                                                   ; // 设置行输入,列输出0  

  66. }  

  67. //***************************************************************************//  

  68. //                                                                           //  

  69. //  Init_UART(void): 初始化USB端口                                           //  

  70. //                                                                           //  

  71. //***************************************************************************//  

  72. void Init_UART(void)  

  73. {   

  74.   USB_PORT_SEL   |= TXD_U + RXD_U                                  ; // 选择引脚功能  

  75.   USB_PORT_DIR   |= TXD_U                                          ; // 选择引脚功能  

  76.   UCA1CTL1        = UCSWRST                                        ; // 状态机复位  

  77.   UCA1CTL1       |= UCSSEL_1                                       ; // CLK = ACLK  

  78.   UCA1BR0         = 0x03                                           ; // 32kHz/9600=3.41   

  79.   UCA1BR1         = 0x00                                           ;   

  80.   UCA1MCTL        = UCBRS_3 + UCBRF_0                              ; // UCBRSx=3, UCBRFx=0  

  81.   UCA1CTL1       &= ~UCSWRST                                       ; // 启动状态机  

  82.   UCA1IE         |= UCRXIE                                         ; // 允许接收中断  

  83. }  

  84.   

  85. //***************************************************************************//  

  86. //                                                                           //  

  87. //  UTX_PROC(void): USB端口发送程序                                          //  

  88. //                                                                           //  

  89. //***************************************************************************//  

  90. void UTX_PROC(char *tx_buf)  

  91. {  

  92.   unsigned char i,length;  

  93.   length = strlen(tx_buf);  

  94.   for(i=0;i

  95.   {  

  96.     UCA1TXBUF = *tx_buf++;   

  97. //    __delay_cycles(5000);  

  98.     while (!(UCA1IFG&UCTXIFG));   

  99.   }  

  100. }  

  101. //***************************************************************************//  

  102. //                                                                           //  

  103. //  UTX_PROC(void): USB端口发送程序                                          //  

  104. //                                                                           //  

  105. //***************************************************************************//  

  106. void Data_Bag_Send(char *tx_buf)  

  107. {  

  108.   unsigned char i,length_all,length;      //声明数据总长度,length_all为转发数据包,length为不带转发数据包  

  109.   length_all = strlen(tx_buf)+Data_Length;    //转发数据包为待发送数据长度+转发数据长度  

  110.   length = strlen(tx_buf);      //length为本身数据长度,当无转发数据时从串口发送  

  111.   UCA1TXBUF = 'S';          //发送启始指令'S',八进制为0x53  

  112.     while(!(UCA1IFG&UCTXIFG));   //等待发送完成  

  113.       

  114.   if(Data_Length

  115.   {  

  116.     UCA1TXBUF = length_all+3;     //发送数据总长度  

  117.     while(!(UCA1IFG&UCTXIFG));    //等待发送完成  

  118.     for(i=2;i<2+Data_Length;i++)    //发送转发数据包  

  119.     {  

  120.       UCA1TXBUF = RXBuffer[i];  

  121.       while(!(UCA1IFG&UCTXIFG));  

  122.     }  

  123.   }  

  124.   else  

  125.   {  

  126.     UCA1TXBUF = length+3;       //没有中继数据的时候,直接发送数据包  

  127.     while(!(UCA1IFG&UCTXIFG));  

  128.   }  

  129.     

  130.   for(i=0;i

  131.   {  

  132.     UCA1TXBUF = *tx_buf++;    //发送本地数据包  

  133. //    __delay_cycles(5000);  

  134.     while (!(UCA1IFG&UCTXIFG));   

  135.   }  

  136.     

  137.   UCA1TXBUF = 'E';        //发送包尾'E'  

  138. }  

  139. //***************************************************************************//  

  140. //                                                                           //  

  141. //                              主函数                                       //  

  142. //                                                                           //  

  143. //***************************************************************************//  

  144. void main( void )  

  145. {  

  146.   int i;  

  147.   WDTCTL = WDTPW + WDTHOLD;     //看门狗关闭  

  148.   Init_CLK();       //时钟初始化  

  149.   Init_Port();      //IO端口初始化  

  150.   Init_UART();      //串口初始化  

  151.   _EINT();    //启动中断  

  152.   for(;;)  

  153.   {  

  154.     if(event)  

  155.     {  

  156.       event   = 0x00;  

  157.       UTX_PROC(RXBuffer);  

  158.     }  

  159.       

  160.     if((P6IN&0x0F)!=0x0F)            // 检测按键按下  

  161.     {  

  162.       //UTX_PROC(Data_Bag);  

  163.       //UTX_PROC(RXBuffer);  

  164.       //UTX_PROC(&Data_Length);  

  165.       Data_Bag_Send("123");       //本地数据包为123  

  166.       __delay_cycles(5000000);  

  167.     }      

  168.   }  

  169. }  

  170. //***************************************************************************//  

  171. //                                                                           //  

  172. //  USB接收中断服务程序                                                      //  

  173. //                                                                           //  

  174. //***************************************************************************//  

  175. #pragma vector=USCI_A1_VECTOR  

  176. __interrupt void USCI_A1_ISR(void)  

  177. {  

  178.   static char rx_byte = 0x00;   //接收字段初始化  

  179.   unsigned char temp,event = 0x00;    //BUFFER空间,还有待机模式初始化  

  180.   switch(__even_in_range(UCA1IV,4))  

  181.   {  

  182.   case 0:break; // Vector 0 - no interrupt  

  183.   case 2:            // Vector 2 - RXIFG  

  184.       temp = UCA1RXBUF;  

  185.       if(rx_byte==0)  

  186.       {  

  187.         if(temp=='S')  

  188.         {  

  189.           RXBuffer[0] = UCA1RXBUF;    //如果首位为's’接收数据  

  190.           rx_byte++;      //计数  

  191.         }  

  192.       }  

  193.       else  

  194.       {  

  195.         RXBuffer[rx_byte++] = temp;  

  196.         if(rx_byte>=RXBuffer[1])      //若数据还在接收范围内部,接收数据  

  197.         {  

  198.           Data_Bag_Length = RXBuffer[1];    //数据总长赋值  

  199.           Data_Length=Data_Bag_Length-3;    //数据长赋值  

  200.           if(RXBuffer[rx_byte-1] == 'E')      //如果数据尾巴为E,保存数据  

  201.           {  

  202.             rx_byte = 0x00;  

  203.             event |= 0x01;  

  204.           }  

  205.           else        //否则,在数据总长不对或者数据尾不对的情况下,删除数据  

  206.           {  

  207.             rx_byte = 0x00;    

  208.             for(temp=0;temp<20;temp++)  

  209.               RXBuffer[temp] = 0x00; // 通讯有误,清除缓冲区  

  210.           }  

  211.         }          

  212.       }  

  213.       break;  

  214.   case 4:break;  // Vector 4 - TXIFG  

  215.   default: break;    

  216.   }    

  217.   if(event)    

  218.     LPM3_EXIT;      //唤醒待机模式  

  219. }  


关键字:MSP430  中继通讯协议 引用地址:MSP430中继通讯协议

上一篇:MSP430驱动DDS模块AD9851
下一篇:MSP430F5438无线温度发送

推荐阅读最新更新时间:2024-03-16 15:36

MSP430F249外部中断P1.3口
/****************************************************************** ** ** File : DExternInterrupt.c | Interrupt | ** Version : 1.0 ** Description: Extern Interrupt ** Author : LightWu ** Date : 2013-4-16
[单片机]
MSP430F5438 Unified System Clock
#include msp430x54x.h void UCS_Init(void) { P5SEL |= 0x0C; // Port select XT2 UCSCTL6 &= ~ XT2OFF; // Set XT2 On P7SEL |= 0x03; // 端口选择外部低频晶振XT1 UCSCTL6 &=~XT1OFF; // 使能外部晶振 UCSCTL6 |= XCAP_3; // 设置内部负载电容 UCSCTL3 |= SELREF_2; // DCOref = REFO UCSCTL4 |= SELA_0; // ACLK = XT1 __bis_SR_register(SCG0); // 关闭FLL控制回路 UCSCT
[单片机]
MSP430Ware使用笔记 初始化DCO至8MHz
1.平台说明MSP430F5438。 2.ACLK选择XT1,频率为32.768K,MCLK和SMCLK选择DCOCLKDIV,频率为8000K。 // 辅助时钟 ACLK 32.768K // 系统时钟 子系统时钟 8000K #include inc/hw_memmap.h #include ucs.h #include wdt_a.h #include gpio.h #include sfr.h void main (void) { // 停止看门狗 WDT_A_hold(WDT_A_BASE); // P4.0保持输出状态 GPIO_setAsOutputPin(GPIO_POR
[单片机]
MSP430的看门狗常见用法以及中断函数的书写方法
今天下午看了一下MSP430的看门狗的基本用法 看门狗是为了防止程序跑飞而设定的,但是由于看门狗是一个类似于定时器,因此可以把他当作定时器来使用 示例代码:用看门狗定时器使一个led闪烁 #include msp430x14x.h void main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDT_MDLY_32;//宏定义 IE1 |=WDTIE; //允许看门狗定时器中断 P2DIR |= BIT7; _BIS_SR(LPM0_bits+GIE);//在这里的话将cpu进入低功耗模式 } #pragma ve
[单片机]
MSP430液晶屏1602驱动程序
1602液晶显示: 1,16脚:地 2,15脚:+5 3脚:接滑动变阻器,滑动变阻器另一端接地 4脚:P4.5(RS) 5脚: P4.6 (RW) 6脚: P4.7 (E) 7~14脚:接单片机的数据口P5(D0~D7) #include msp430x14x.h #define RS_HIGN P4OUT|=BIT5 //P4.5 #define RS_LOW P4OUT&=~BIT5 #define RW_HIGN P4OUT|=BIT6 //P4.6 #define RW_LOW P4OUT&=~BIT6 #define E_HIGN P4OUT|=BIT7 //P
[单片机]
MSP430之共用体中结构体字节对齐问题
先上代码: 我所用的平台的字节对齐默认是2字节,下面////////之间的变量定义为7个字节,为了保证2字节对齐,Power变量就会自动扩展一个字节,但是变量类型又是一个字节,所以发生了字节偏移的情况。 typedef union _PARARW{ struct{ UINT8 Name ; /////////////////////////////// UINT8 Read; UINT8 Start; UINT8 Stop; UINT8 Alarm; UINT8 Unit; // UINT8 Nothing;//字节对齐填充 UINT8 Display; UINT8 Power; ///
[单片机]
<font color='red'>MSP430</font>之共用体中结构体字节对齐问题
MSP430状态寄存器SR的使用实验及小结
研究LCD128128驱动程序时,看到一个语句LCD_SDA = CY; 当时明白C51中CY是进位标志,这种写法有点意思,好象很简洁。原程序见下: //传送指令 voidtransfer_command_lcd(unsigned char cmd) { int k; LCD_CS = 0; LCD_RS= 0; for (k=0; k 8; k++) { cmd = cmd 1; LCD_SCL = 0; LCD_SDA = CY; LCD_SCL = 1; } LCD_CS=1; } 因为要用MSP430驱动,很多语句要改,这个C
[单片机]
<font color='red'>MSP430</font>状态寄存器SR的使用实验及小结
MSP430在频率测量系统中的应用
1 概述 在通信系统中,频率测量具有重要地位。近几年来频率测量技术所覆盖的领域越来越广泛,测量精度越来越高,与不同学科的联系也越来越密切。与频率测量技术紧密相连的领域有通信、导航、空间科学、仪器仪表、材料科学、计量技术、电子技术、天文学、物理学和生物化学等。 频率测量一般都是由计数器和定时器完成,将两个定时/计数器一个设置为定时器,另一个设置为计数器,定时时间到后产生中断,在中断服务程序中处理结果,求出频率。这种方法虽然测量范围较宽,但由于存在软件延时,尽管在高频段能达到较高的精度,而低频段的测量精度较低。所以利用单片机测频时,如果选择不好的测量方法,可能会引起很大的误差。测量频率时如果不是真正依靠硬件控制计数或定时,而是
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved