第7章 串行通信接口SCI.ppt_第1页
第7章 串行通信接口SCI.ppt_第2页
第7章 串行通信接口SCI.ppt_第3页
第7章 串行通信接口SCI.ppt_第4页
第7章 串行通信接口SCI.ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章串行通信接口(SCI),主要内容异步串行通信的基础知识电平转换电路与SCI通用编程原理GP32SCI模块寄存器串行口初始化与收发编程的基本方法串行通信通用函数与测试实例串行通信进一步讨论,7.1异步串行通信的基础知识,7.1.1基本概念()异步串行通信的格式SCI通常采用NRZ数据格式,即:standardnon-return-zeromark/spacedataformat,译为:“标准不归零传号/空号数据格式”。“不归零”的最初含义是:用正、负电平表示二进制值,不使用零电平。“mark/space”即“传号/空号”分别是表示两种状态的物理名称,逻辑名称记为“1/0”。下图给出了8位数据、无校验情况的传送格式。,(2)串行通信的波特率,波特率(baudrate):每秒内传送的位数。波特率单位是位/秒,记为bps。通常情况下,波特率的单位可以省略。通常使用的波特率有300、600、900、1200、1800、2400、4800、9600、19200、38400。,字符奇偶校验检查(characterparitychecking)称为垂直冗余检查(verticalredundancychecking,VRC),它是每个字符增加一个额外位使字符中“1”的个数为奇数或偶数。奇校验:如果字符数据位中“1”的数目是偶数,校验位应为“1”,如果“1”的数目是奇数,校验位应为“0”。偶校验:如果字符数据位中“1”的数目是偶数,则校验位应为“0”,如果是奇数则为“1”。,(3)奇偶校验,单工(Simplex):数据传送是单向的,一端为发送端,另一端为接收端。这种传输方式中,除了地线之外,只要一根数据线就可以了。有线广播就是单工的。全双工(Full-duplex):数据传送是双向的,且可以同时接收与发送数据。这种传输方式中,除了地线之外,需要两根数据线,站在任何一端的角度看,一根为发送线,另一根为接收线。一般情况下,MCU的异步串行通信接口均是全双工的。半双工(Half-duplex):数据传送也是双向的,但是在这种传输方式中,除了地线之外,一般只有一根数据线。任何一个时刻,只能由一方发送数据,另一方接收数据,不能同时收发。在freescale的HC08系列MCU中,监控模式的通信就采用这种方式。,(4)串行通信的传输方式,MCU引脚一般输入/输出使用TTL电平,而TTL电平的“1”和“0”的特征电压分别为2.4V和0.4V,适用于板内数据传输。为了使信号传输得更远,美国电子工业协会EIA(ElectronicIndustryAssociation)制订了串行物理接口标准RS-232C。RS-232C采用负逻辑,-3V-15V为逻辑“1”,+3V+15V为逻辑“0”。RS-232C最大的传输距离是30m,通信速率一般低于20Kbps。,7.1.2RS-232C总线标准,7.1.2RS-232C总线标准,RS-232接口,简称“串口”,它主要用于连接具有同样接口的室内设备。目前几乎所有计算机上的串行口都是9芯接口。右图给出了9芯串行接口的排列位置,相应引脚含义见表7-1。,返回,7.2电平转换电路与SCI通用编程原理,7.2.1SCI的外围硬件电路具有SCI接口的MCU,一般具有发送引脚(TxD)与接收引脚(RxD),不同公司或不同系列的MCU,使用的引脚缩写名可能不一致,但含义相同。SCI的外围硬件电路,主要目的是将MCU的发送引脚TxD与接收引脚RxD的TTL电平,通过RS-232电平转换芯片转换为RS-232电平。下图给出一个基本SCI电平转换电路。,7.2.2SCI的基本编程原理,返回,7.3GP32SCI模块寄存器,SCI的寄存器MC68HC908GP32的SCI有7个寄存器,地址为$0013$0019。(1)SCI波特率寄存器(SCIBaudRateRegister,SCBR)SCBR的作用是设置串行通信的波特率,其地址是$0019。D7、D6、D3:未定义;D5D4SCP:波特率预分频位(SCIBaudRatePrescalerBits)SCP1、SCP0=00011011PD=13413,D2D0SCR:波特率选择位(SCIBaudRateSelectBits),定义波特率另一分频值,记为:BD,定义如下:SCR2、1、0=000001010011100101110111BD=1248163264128设fSCI为串行通信时钟源频率,fSCI=fBUS或CGMXCLK,取决于CONFIG2的SCIBDSRC,一般设定SCIBDSRC=1,SCI用内部总线时钟,则fSCI=fBUS,则波特率的定义公式为:BtfBUS/(64PDBD),(1)SCI波特率寄存器(SCIBaudRateRegister,SCBR),(2)SCI控制寄存器1(SCIControlRegister1,SCC1),SCC1的地址是:$0013,定义为:,D7D6D5D4D3D2D1D0,用于测试,(3)SCI控制寄存器2(SCIControlRegister2,SCC2),SCC2的地址是:$0014,定义为:,(4)SCI控制寄存器3(SCIControlRegister3,SCC3),SCC3的地址是:$0015,定义为:,(5)SCI状态寄存器1(SCIStatusRegister1,SCS1),SCS1的地址是:$0016,定义为:,(6)SCI状态寄存器2(SCIStatusRegister2,SCS2),SCS2的地址是:$0017,定义为:,(7)SCI数据寄存器(SCIDataRegister,SCDR),SCDR为SCI系统最常用的寄存器,它的地址是:$0018。写入时,为要发送的8位数据,记为:T7T0;读出时,为接收的8位数据,记为:R7R0。不受复位影响。,(1)SCI初始化对SCI进行初始化,最少由以下三步构成:第一步:定义波特率。LDA#%00000010STASCBR;总线频率fBUS2.4576MHz,定义波特率Bt=9600第二步:写控制字到SCI控制寄存器1(SCC1)。LDA#%01000000STASCC1;设置允许SCI,正常码输出、8位数据、无校验第三步:写控制字到SCI控制寄存器2(SCC2)。LDA#%00001100STASCC2;设置允许发送、允许接收,查询方式收发,7.4串行口初始化与收发编程的基本方法,(2)发送一个数据与接收一个数据,发送数据是通过判断状态寄存器SCS1的第7位(SCTE)进行的,而接收数据是通过判断状态寄存器SCS1的第5位(SCRF)进行的。不论是发送还是接收,均使用SCI数据寄存器SCDR。发送时,将要发送的数据送入SCDR即可,接收时,从SCDR中取出的即是收到的数据。;串行发送A中的数BRCLR7,SCS1,*;SCS1.7=0?为0则等待STASCDR;SCS1.7=1,可以发送数据;查询方式接收一个串行数据,接收的数据放入寄存器A中BRCLR5,SCS1,*;SCS1.5=0?为0则等待LDASCDR;SCS1.5=1,可以取出数据,返回,7.5串行通信通用函数与测试实例,7.5.1串行通信子程序串行通信头文件SCI.h串行通信驱动文件SCI.c,串行通信驱动文件SCI.c,串行通信驱动文件包括SCI初始化、接收1字节、发送1字节、接收n字节和发送n字节函数。读者可以直接使用这些函数进行MCU的串行通信编程。,/SCI.c串行通信-*/本文件包含:*/(1)SCIinit:串行口初始化*/(2)SCIsend1:串行发送1个字节*/(3)SCIsendN:串行发送n字节*/(4)SCIre1:串行接收1字节*/(5)SCIreN:串行接收n字节*/硬件连接:*/MCU的串口与PC方的串口相连*/-*,/SCIsend1:串行发送1个字节-*/功能:串行发送1个字节*/参数:要发送的数据*/返回:无*/-*voidSCIsend1(INT8Uo)/判断ReStatusR的第SendTestBit位是否为1,是1可以发送while(1)if(ReSendStatusR,/SCIsendN:串行发送N个字节-*/功能:发送数组中的N个字节数据*/参数:待发送数据的字节数及存放这些数据的数组首地址*/返回:无*/内部调用函数:SCIsend1*/-*voidSCIsendN(INT8Un,INT8Uch)inti;for(i=0;in;i+)SCIsend1(chi);,/SCIre1:串行收一个字节数据-*/功能:从串行口接收1个字节的数据*/参数:标志指针p*/返回:接收到的数据(若接收失败,返回0 xff)*/说明:参数*p带回接收标志.*p=0,收到数据;*p=1,未收到数据*/-*INT8USCIre1(INT8U*p)INT16Uk;INT8Ui;/ReStatusR第ReTestBit位为1表示可接收数据,for(k=0;k=0 xfbbb)i=0 xff;*p=0 x01;returni;,/SCIreN:HC08串行接收N个字节-*/功能:接收N个字节数据,并存放在ch数组中*/参数:待接收的数据字节数及其存放的数组首地址*/返回:接收标志=0收到数据,=1未收到数据*/内部调用函数:SCIre1*/-*INT8USCIreN(INT8Un,INT8Uch)intm;INT8Ufp;,m=0;while(mn)chm=SCIre1(,(1)查询方式工程(08C)文件列表(2)查询方式08C语言主程序,7.5.2查询方式工程文件,#includeIncludes.h/总头文件voidmain()INT8Ui;DisableMCUint();/禁止总中断MCUinit();/1.芯片初始化SCIinit();/(1)串口初始化while(1)/总循环i=SCIreN(1,SerialBuff);/接收1个字节的数据if(i=0)/发送接到的1个字节数据SCIsendN(1,SerialBuff);,中断方式08C工程文件列表中断方式08C语言主程序main.c串行中断子函数声明EnDisInt.h串行中断处理函数串行中断方式矢量表文件,7.5.3中断方式工程文件,返回,中断方式08C工程文件列表,中断方式08C语言主程序main.c,串行中断子函数声明EnDisInt.h,在该头文件中对开关总中断进行了宏定义,并且其他各个模块的中断设置函数在此进行声明。,串行中断处理函数,#pragmainterrupt_handlerisrSCIrevoidisrSCIre(void)INT8Uf;/标志是否接受到数据INT8USerialBuff1;/存放接收数据的数组DisableMCUint();/禁止总中断/接收1个字节的数据f=SCIreN(1,SerialBuff);/若收到数据,则发送接到的数据if(f=0)SCIsendN(1,SerialBuff);EnableMCUint();/开放总中断/此处为用户中断处理函数的存放处,/未定义的中断处理函数,本函数不能删除#pragmainterrupt_handlerisrDummyvoidisrDummy(void)/中断矢量表,需定义中断函数,可修改下表中的相应项目/(interruptserviceroutine,isr中断处理程序)#pragmaabs_address:0 xffdc/中断向量表起始地址void(*const_vectab)(void)=/省略其他未使用的中断向量定义isrSCIre,/SCI接收中断/省略其他未使用的中断向量定义;#pragmaend_abs_address,串行中断方式矢量表文件,HC08的中断向量表的详细说明在前面章节已经介绍。在使用中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论