新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 串行通信口SCI__HCS12學習筆記(2)

        串行通信口SCI__HCS12學習筆記(2)

        作者: 時間:2016-11-24 來源:網絡 收藏
        基本概念:

        SCI采用NRZ數據格式,用負電平表示一種二進制值,正電平表示另一種二進制值,不使用零電平。空閑狀態為1,發送器通過發送一個0表示一字節傳輸開始隨后是數據位,最后發送1~2位的停止位,表示一字節的傳送結束。一個開始位到一個停止位,為1幀Frame。

        本文引用地址:http://www.104case.com/article/201611/321072.htm

        波特率有300、600、900、1200、1800、2400、4800、9600、19200、38400。隨著波特率的提高,信號受干擾的程度也越大,因此,串行口的傳輸速率有限。

        寄存器:

        對于編程者來說,直接面對的就是寄存器,因此對于寄存器的介紹是非常重要的。

        這里只列舉,詳細各個位的介紹參照數據手冊:

        波特率寄存器 SCIBDH SCIBDL H的高3位無效,因此一種13位1~8191

        控制寄存器 SCICR1 SCICR2 傳輸格式,中斷使能

        狀態寄存器 SCISR1 SCISR2 中斷標志,發送與接收狀態

        數據寄存器 收發的數據

        初始化、收、發子函數:

        //串行通信需要用到的頭文件
        #include "mc9s12dg128.h" //MCU映像寄存器名
        #include "Type.h" //類型別名定義

        //串行通信寄存器及標志位定義
        #define ReSendStatusR SCI0SR1 //SCI狀態寄存器
        #define ReTestBit 5 //接收緩沖區滿標志位
        #define SendTestBit 7 //發送緩沖區空標志位
        #define ReSendDataR SCI0DRL //數據寄存器

        //串行通信相關函數聲明
        void SCIInit(void); //串行口初始化函數聲明
        void SCISend1(INT8U o); //串行發送1個字節
        void SCISendN(INT8U n,INT8U ch[]); //串行發送n個字節
        INT8U SCIRe1(INT8U *p); //串行接收1個字節
        INT8U SCIReN(INT8U n,INT8U ch[]); //串行接收n個字節

        //特別聲明,這里的INT8U表示8位無符號數

        //[SCI.c]串行通信----------------------------------------------------------*
        //本文件包含: *
        // (1)SCIInit:串行口初始化 *
        // (2)SCISend1:串行發送1個字節 *
        // (3)SCISendN:串行發送n字節 *
        // (4)SCIRe1:串行接收1字節 *
        // (5)SCIReN:串行接收n字節 *
        //硬件連接: *
        // MCU的SCI0模塊接口與PC方的串行口相連 *
        //-------------------------------------------------------------------------*

        //頭文件
        #include "SCI.h" //串行通信頭文件

        //SCIInit:DG128串行口0初始化函數-------------------------------------------*
        //功 能: *
        // 開SCI0關SCI1,關串口中斷,對串行口進行初始化,默認為允許SCI,正常碼輸出 *
        // ,8位數據,無校驗等,允許發送器允許接收器.查詢方式收發,波特率為9600 *
        // (設fBUS=19.6608Mhz) *
        //參 數:無 *
        //返 回:無 *
        //說 明: *
        // (1)若初始化SCI1,只需SCI0->SCI1 *
        // (2)該初始化函數與芯片有關 *
        //-------------------------------------------------------------------------*
        void SCIInit(void)
        {
        INT8U t;
        //定義波特率Bt=9600,SCI0BD=fBUS/(16*Bt)
        SCI0BDL = 0x80; //須先給低8位賦值
        SCI0BDH = 0x00; //再給高8位賦值
        SCI0CR1 = 0x00; //設置允許SCI,正常碼輸出,8位數據,無校驗
        t = SCI0DRL; //讀數據寄存器(清0)
        t = SCI0SR1; //讀狀態寄存器(清0)
        SCI0CR2 = 0x0C; //允許SCI0接收和發送 查詢方式
        }

        //SCISend1:串行發送1個字節-------------------------------------------------*
        //功 能:串行發送1個字節 *
        //參 數:o=要發送的數據 *
        //返 回:無 *
        //-------------------------------------------------------------------------*
        void SCISend1(INT8U o)
        {
        //判斷ReStatusR的第SendTestBit位是否為1,是1可以發送
        while (1)
        if ((ReSendStatusR & (1< {
        ReSendDataR = o;
        break;
        }
        }

        //SCISendN:串行發送N個字節-------------------------------------------------*
        //功 能:發送數組中的N個字節數據 *
        //參 數:n=待發送的數據字節數,ch=存放待發送數據的數組首地址 *
        //返 回:無 *
        //內部調用函數:SCISend1 *
        //-------------------------------------------------------------------------*
        void SCISendN(INT8U n,INT8U ch[])
        {
        INT8U i;
        for (i=0; i SCISend1(ch[i]);
        }

        //SCIRe1:串行收一個字節數據------------------------------------------------*
        //功 能:從串行口接收1個字節的數據 *
        //參 數:p=標志指針 *
        //返 回:接收到的數據(若接收失敗,返回0xff) *
        //說 明:參數*p帶回接收標志=0收到數據,=1未收到數據 *
        //-------------------------------------------------------------------------*
        INT8U SCIRe1(INT8U *p)
        {
        INT16U k;
        INT8U i;
        //ReStatusR第ReTestBit位為1表示可接收數據
        for (k=0; k<0xfbbb; k++)
        if ((ReSendStatusR & (1< {
        i = ReSendDataR;
        *p = 0x00;
        break;
        }
        //接收失敗
        if (k >= 0xfbbb)
        {
        i=0xff;
        *p=0x01;
        }
        return i; //返回接收到的數據
        }

        //SCIReN:HC08串行接收N個字節-----------------------------------------------*
        //功 能:接收N個字節數據,并存放在ch數組中 *
        //參 數:n=待接收的數據字節數,ch=存放待接收數據的數組首地址 *
        //返 回:接收標志=0收到數據,=1未收到數據 *
        //內部調用函數:SCIRe1 *
        //-------------------------------------------------------------------------*
        INT8U SCIReN(INT8U n,INT8U ch[])
        {
        INT8U m;
        INT8U fp;
        m = 0;
        //接收n個數據
        while (m {
        ch[m] = SCIRe1(&fp);
        if (fp == 1) return 1; //只要有1個字節數據沒接收到就返回報錯
        m++;
        }
        return 0;
        }

        這段程序是嵌入式系統--使用HCS12微控制器的設計與應用中附帶的。格式很規范。

        在計算機上使用軟件收發給單片機時也容易出錯,一般是波特率不匹配,這樣出現的就是亂碼,一定要注意。

        Bt=fBUS/(16*BR)



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 工布江达县| 舞阳县| 张家口市| 观塘区| 渝中区| 汨罗市| 阳信县| 万源市| 玛多县| 蛟河市| 禹城市| 泸西县| 奉节县| 资兴市| 连江县| 滨州市| 齐齐哈尔市| 柳江县| 汝南县| 宜城市| 方山县| 巴里| 温宿县| 荃湾区| 什邡市| 新津县| 敖汉旗| 波密县| 安图县| 三原县| 兰西县| 娄底市| 类乌齐县| 东台市| 长岛县| 宝鸡市| 岳普湖县| 吴江市| 宝丰县| 博爱县| 赤水市|