您的位置 首页 汽车

串行通信口SCI__HCS12学习笔记(2)

基本概念:SCI采用NRZ数据格式,用负电平表示一种二进制值,正电平表示另一种二进制值,不使用零电平。空闲状态为1,发送器通过发送一个0表

基本概念:

SCI选用NRZ数据格局,用负电平表明一种二进制值,正电平表明另一种二进制值,不运用零电平。闲暇状况为1,发送器经过发送一个0表明一字节传输开端随后是数据位,最终发送1~2位的中止位,表明一字节的传送完毕。一个开端位到一个中止位,为1帧Frame。

波特率有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)

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/260804.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部