久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

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

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

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

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

本文引用地址:http://www.cqxgywz.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)



評論


技術專區

關閉