新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 采用MSP430地址位多機協議通訊程序

        采用MSP430地址位多機協議通訊程序

        作者: 時間:2016-11-13 來源:網絡 收藏
        /*
        采用MSP430地址位多機協議通訊程序
        微控論壇原創(chuàng)作品 作者:tianxy
        各位同仁,響應版主號召,現就"愛好者"同志提出的<<關于UART的地址位多機通訊>>做出本人的見解.希望大家多多指點.
        430串口發(fā)送格式中,我們可以看到.一個字節(jié)由1個起始位+7位或8位數據位+校驗位+1位或2位停止組成.如果要使用
        430的地址位多機協議.主要是將UxCTL寄存器中的MM位置1,同時將UxRCTL寄存器中的URXWIE置1.
        例程如下:
        上位機先用Mark校驗方式.格式為:1個起始位+8位數據位+1位校驗位+1位停止位.
        發(fā)送5個字節(jié):0x02(地址號) 0x05(命令字節(jié)) 0x00(預留字節(jié)) 0x07(累加和校驗低字節(jié)) 0x00(累加和校驗高字節(jié))
        單片機接收程序如下,同時將收到的數據再返回給上位機.
        程序中所使用的變量.請自行定義.有標注說明.

        Microcontrol CODE
        */
        void COM_Init(void)
        {
        //---------------------------------串口初始化函數
        U0CTL &= ~SWRST;
        U0TCTL&=~TXWAKE;
        U0CTL|=CHAR+MM;//8bit+地址位多機協議
        IFG1&=~(URXIFG0+UTXIFG0);//接收,發(fā)送中斷標志清零
        ME1|=(UTXE0+URXE0); //使能接收和發(fā)送中斷
        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;//除命令字節(jié)外還要接收3個字節(jié)
        fmaddr=0;
        mling_flag|=0x01;//已收到命令字節(jié),下一字節(jié)應為數據
        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)//收到累加和的高位,表示接收完畢,可以處理并發(fā)送數據
        {
        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允許發(fā)送數據
        UTCTL0|=TXWAKE;//USART0發(fā)送地址位
        ME1|=UTXE0;//USART0允許發(fā)送
        IFG1&=~(UTXIFG0+URXIFG0);
        TXBUF0=addr;//--------------------------------------------------------地址
        while((UTCTL0&BIT0)==0);//當發(fā)送空時,TXEPT=1
        TXBUF0=order;//--------------------------------------------------------命令
        while((UTCTL0&BIT0)==0);//當發(fā)送空時,TXEPT=1
        TXBUF0=0x00;//--------------------------------------------------------預留
        while((UTCTL0&BIT0)==0);//當發(fā)送空時,TXEPT=1
        TXBUF0=0x07;//--------------------------------------------------------累加和低
        while((UTCTL0&BIT0)==0);//當發(fā)送空時,TXEPT=1
        TXBUF0=0x00;//--------------------------------------------------------累加和高
        while((UTCTL0&BIT0)==0);//當發(fā)送空時,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++;
        }
        }
        }
        }
        }
        }


        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 贵南县| 建平县| 通城县| 抚宁县| 荃湾区| 洛隆县| 张家港市| 连云港市| 南充市| 都安| 临城县| 建昌县| 清流县| 留坝县| 云和县| 缙云县| 上犹县| 兴国县| 昆山市| SHOW| 海兴县| 赫章县| 扶沟县| 岳西县| 阿城市| 区。| 成武县| 白城市| 潞西市| 招远市| 花莲县| 英德市| 如东县| 德令哈市| 新竹市| 绥芬河市| 榕江县| 怀柔区| 肇州县| 宁波市| 竹溪县|