新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 串行通信口SCI__HCS12學(xué)習(xí)筆記(2)

串行通信口SCI__HCS12學(xué)習(xí)筆記(2)

作者: 時(shí)間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
基本概念:

SCI采用NRZ數(shù)據(jù)格式,用負(fù)電平表示一種二進(jìn)制值,正電平表示另一種二進(jìn)制值,不使用零電平??臻e狀態(tài)為1,發(fā)送器通過發(fā)送一個(gè)0表示一字節(jié)傳輸開始隨后是數(shù)據(jù)位,最后發(fā)送1~2位的停止位,表示一字節(jié)的傳送結(jié)束。一個(gè)開始位到一個(gè)停止位,為1幀F(xiàn)rame。

本文引用地址:http://butianyuan.cn/article/201611/321072.htm

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

寄存器:

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

這里只列舉,詳細(xì)各個(gè)位的介紹參照數(shù)據(jù)手冊(cè):

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

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

狀態(tài)寄存器 SCISR1 SCISR2 中斷標(biāo)志,發(fā)送與接收狀態(tài)

數(shù)據(jù)寄存器 收發(fā)的數(shù)據(jù)

初始化、收、發(fā)子函數(shù):

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

//串行通信寄存器及標(biāo)志位定義
#define ReSendStatusR SCI0SR1 //SCI狀態(tài)寄存器
#define ReTestBit 5 //接收緩沖區(qū)滿標(biāo)志位
#define SendTestBit 7 //發(fā)送緩沖區(qū)空標(biāo)志位
#define ReSendDataR SCI0DRL //數(shù)據(jù)寄存器

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

//特別聲明,這里的INT8U表示8位無(wú)符號(hào)數(shù)

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

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

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

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

//SCISendN:串行發(fā)送N個(gè)字節(jié)-------------------------------------------------*
//功 能:發(fā)送數(shù)組中的N個(gè)字節(jié)數(shù)據(jù) *
//參 數(shù):n=待發(fā)送的數(shù)據(jù)字節(jié)數(shù),ch=存放待發(fā)送數(shù)據(jù)的數(shù)組首地址 *
//返 回:無(wú) *
//內(nèi)部調(diào)用函數(shù):SCISend1 *
//-------------------------------------------------------------------------*
void SCISendN(INT8U n,INT8U ch[])
{
INT8U i;
for (i=0; i SCISend1(ch[i]);
}

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

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

這段程序是嵌入式系統(tǒng)--使用HCS12微控制器的設(shè)計(jì)與應(yīng)用中附帶的。格式很規(guī)范。

在計(jì)算機(jī)上使用軟件收發(fā)給單片機(jī)時(shí)也容易出錯(cuò),一般是波特率不匹配,這樣出現(xiàn)的就是亂碼,一定要注意。

Bt=fBUS/(16*BR)



關(guān)鍵詞: 串行通信口SCIHCS1

評(píng)論


技術(shù)專區(qū)

關(guān)閉