XS128_串行通信接口SCI.doc_第1页
XS128_串行通信接口SCI.doc_第2页
XS128_串行通信接口SCI.doc_第3页
XS128_串行通信接口SCI.doc_第4页
XS128_串行通信接口SCI.doc_第5页
免费预览已结束,剩余38页可下载查看

下载本文档

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

文档简介

第5章 串行通信接口SCI目前几乎所有的台式电脑都带有9芯的异步串行通信口,简称串行口或COM口。由于历史的原因,通常所说的串行通信就是指异步串行通信。USB、以太网等也用串行方式通信,但与这里所说的异步串行通信物理机制不同。有的台式电脑带有两个串行口COM1和COM2,部分笔记本电脑也带有串行口。随着USB接口的普及,串行口的地位逐渐降低,但是作为设备间简便的通信方式,在相当长的时间内,串行口还不会消失,在市场上也可很容易的购买到USB到串行口的转接器。因为简单且常用的串行通信只需要三根线(发送线、接收线和地线),所以串行通信仍然是MCU与外界通信的简便方式之一。实现异步串行通信功能的模块在一部分MCU中被称为通用异步收发器(Universal Asynchronous Receiver/Transmitters,UART),在另一些MCU中被称为串行通信接口(Serial Communication Interface,SCI)。串行通信接口可以将终端或个人计算机连接到MCU,也可将几个分散的MCU连接成通信网络。本章主要内容有:异步串行通信的通用基础知识;XS128的SCI模块的编程结构与SCI构件设计,并测试这个构件;借助XS128的串行接收中断来阐述中断概念与编程方法,并给出编程实例。对基于构件的编程思想,再次在设计SCI构件中加以阐述,读者在阅读时可以仔细体会,以求得对编程方法更深刻的理解。通过本章学习了中断编程例子后,至此,以一个MCU为蓝本学习嵌入式系统硬件软件基础知识的基本要素已经完成,后续章节将进行知识的不断积累与扩展,学习新模块的工作原理与驱动软件设计,但基本思想与方法方法是一致的。5.1 异步串行通信的通用基础知识本节简要概述异步串行通信中常用的基本概念与硬件连接方法,为学习MCU的串行通信接口编程做准备。5.1.1 串行通信的基本概念“位”(bit)是单个二进制数字的简称,是可以拥有两种状态的最小二进制值,分别用“0”和“1”表示。在计算机中,通常一个信息单位用8位二进制表示,称为一个“字节”(byte)。串行通信的特点是:数据以字节为单位,按位的顺序(例如最高位优先)从一条传输线上发送出去。这里至少涉及到以下几个问题:第一,每个字节之间是如何区分开的?第二,发送一位的持续时间是多少?第三,怎样知道传输是正确的?第四,可以传输多远?这些问题属于串行通信的基本概念。串行通信分为异步通信与同步通信两种方式,本节主要给出异步串行通信的一些常用概念。正确理解这些概念,对串行通信编程是有益的。1异步串行通信的格式在MCU的英文芯片手册上,通常说的异步串行通信采用的是NRZ(不归零)数据格式,英文全称是:“standard non-return-zero mark/space data format”,可以译为:“标准不归零传号/空号数据格式”。这是一个通信术语,“不归零”的最初含义是:用负电平表示一种二进制值,正电平表示另一种二进制值,不使用零电平。“mark/space”即“传号/空号”分别是表示两种状态的物理名称,逻辑名称记为“1/0”。对学习嵌入式应用的读者而言,只要理解这种格式只有“1”、“0”两种逻辑值就可以了。图5-1给出了8位数据、无校验情况的传送格式。图5-1 串行通信数据格式这种格式的空闲状态为“1”,发送器通过发送一个“0”表示一个字节传输的开始,随后是数据位(在MCU中一般是8位或9位,可以包含校验位)。最后,发送器发送1到2位的停止位,表示一个字节传送结束。若继续发送下一字节,则重新发送开始位,开始一个新的字节传送。若不发送新的字节,则维持“1”的状态,使发送数据线处于空闲。从开始位到停止位结束的时间间隔称为一帧(frame)。所以,也称这种格式为帧格式。每发送一个字节,都要发送“开始位”与“停止位”,这是影响异步串行通信传送速度的因素之一。同时因为每发送一个字节,必须首先发送“开始位”,所以称之为“异步”(Asynchronous)通信。2串行通信的波特率位长(Bit Length),也称为位的持续时间(Bit Duration)。其倒数就是单位时间内传送的位数。人们把每秒内传送的位数叫做波特率(Baud Rate)。波特率的单位是:位/秒,记为bps。bps是英文bit per second的缩写,习惯上这个缩写不用大写,而用小写。通常情况下,波特率的单位可以省略。通常使用的波特率有600、900、1200、1800、2400、4800、9600、19200、38400、57600、115200、128000等。在包含开始位与停止位的情况下,发送一个字节需10位,很容易计算出,在各波特率下,发送1K字节所需的时间。显然,这个速度相对于目前许多通信方式而言是慢的,那么,异步串行通信的速度能否提得很高呢?答案是不能。因为随着波特率的提高,位长变小,以至于很容易受到电磁源的干扰,通信就不可靠了。当然,还有通信距离问题,距离小,可以适当提高波特率,但这样毕竟提高的幅度非常有限,达不到大幅度提高的目的。3奇偶校验在异步串行通信中,如何知道传输是正确的?最常见的方法是增加一个位(奇偶校验位),供错误检测使用。字符奇偶校验检查(Character Parity Checking)称为垂直冗余检查(Vertical Redundancy Checking,VRC),它是为每个字符增加一个额外位使字符中“1”的个数为奇数或偶数。奇数或偶数依据使用的是“奇校验检查”还是“偶校验检查”而定。当使用“奇校验检查”时,如果字符数据位中“1”的数目是偶数,校验位应为“1”,如果“1”的数目是奇数,校验位应为“0”。当使用“偶校验检查”时,如果字符数据位中“1”的数目是偶数,则校验位应为“0”,如果是奇数则为“1”。这里列举奇偶校验检查的一个实例,看看ASCII字符“R”,其位构成是1010010。由于字符“R”中有3个位为“1”,若使用奇校验检查,则校验位为0;如果使用偶校验检查,则校验位为1。在传输过程中,若有1位(或奇数个数据位)发生错误,使用奇偶校验检查,可以知道发生传输错误。若有2位(或偶数个数据位)发生错误,使用奇偶校验检查,就不能知道已经发生了传输错误。但是奇偶校验检查方法简单,使用方便,发生1位错误的概率远大于2位的概率,所以“奇偶校验”这种方法还是最为常用的校验方法。几乎所有MCU的串行异步通信接口,都提供这种功能。4串行通信的传输方式在串行通信中,经常用到“单工”、“双工”、“半双工”等术语。它们是串行通信的不同传输方式。下面简要介绍这些术语的基本含义。(1)单工(Simplex):数据传送是单向的,一端为发送端,另一端为接收端。这种传输方式中,除了地线之外,只要一根数据线就可以了。有线广播就是单工的。(2)全双工(Full-duplex):数据传送是双向的,且可以同时接收与发送数据。这种传输方式中,除了地线之外,需要两根数据线,站在任何一端的角度看,一根为发送线,另一根为接收线。一般情况下,MCU的异步串行通信接口均是全双工的。(3)半双工(Half-duplex):数据传送也是双向的,但是在这种传输方式中,除地线之外,一般只有一根数据线。任何时刻,只能由一方发送数据,另一方接收数据,不能同时收发。5.1.2 RS-232总线标准现在回答“可以传输多远”这个问题。MCU引脚输入/输出一般使用TTL(Transistor Transistor Logic)电平,即晶体管-晶体管逻辑电平。而TTL电平的“1”和“0”的特征电压分别为2.4V和0.4V(目前使用3V供电的MCU中,该特征值有所变动),即大于2.4V则识别为“1”,小于0.4V则识别为“0”。它适用于板内数据传输。若用TTL电平将数据传输到5m之外,那么可靠性就很值得考究了。为使信号传输得更远,美国电子工业协会EIA(Electronic Industry Association)制订了串行物理接口标准RS-232C,以下简称RS-232。RS-232采用负逻辑,-15V-3V为逻辑“1”,+3V+15V为逻辑“0”。RS-232最大的传输距离是30m,通信速率一般低于20Kbps。当然,在实际应用中,也有人用降低通信速率的方法,通过RS-232电平,将数据传送到300m之外,这是很少见的,且稳定性很不好。RS-232总线标准最初是为远程数据通信制订的,但目前主要用于几米到几十米范围内的近距离通信。有专门的书籍介绍这个标准,但对于一般的读者,不需要掌握RS-232标准的全部内容,只要了解本节介绍的这些基本知识就可以使用RS-232。目前一般的PC机均带有1到2个串行通信接口,人们也称之为RS-232接口,简称“串口”,它主要用于连接具有同样接口的室内设备。早期的标准串行通信接口是25芯插头,这是RS-232规定的标准连接器(其中:2条地线,4条数据线,11条控制线,3条定时信号,其余5条线备用或未定义)。图5-2 9芯串行接口排列后来,人们发现在计算机的串行通信中,25芯线中的大部分并不使用,逐渐改为使用9芯串行接口。一段时间内,市场上还有25芯与9芯的转接头,方便了两种不同类型之间的转换。后来,使用25芯串行插头极少见到,25芯与9芯转接头也极少有售。因此,目前几乎所有计算机上的串行口都是9芯接口。图5-2给出了9芯串行接口的排列位置,相应引脚含义见表5-1。在RS-232通信中,常常使用精简的RS-232通信,通信时仅使用3根线:RXD(接收线)、TXD(发送线)和GND(地线)。其他为进行远程传输时接调制解调器之用,有的也可作为硬件握手信号(如请求发送RTS信号与允许发送CTS信号),初学时可以忽略这些信号的含义。表5-1 9芯串行接口引脚含义表引脚号功能引脚号功能1接收线信号检测(载波检测DCD)6数据通信设备准备就绪(DSR)2接收数据线(RXD)7请求发送(RTS)3发送数据线(TXD)8允许发送(CTS)4数据终端准备就绪(DTR)9振铃指示5信号地(SG)5.1.3 TTL电平到RS-232电平转换电路在MCU中,若用RS-232总线进行串行通信,则需外接电路实现电平转换。在发送端,需要用驱动电路将TTL电平转换成RS-232电平;在接收端,需要用接收电路将RS-232电平转换为TTL电平。电平转换器不仅可以由晶体管分立元件构成,也可以直接使用集成电路。目前广泛使用MAX232芯片较多,该芯片使用单一+5V电源供电实现电平转换。图5-3给出了MAX232的引脚说明。引脚含义简要说明如下:Vcc(16脚):正电源端,一般接+5V。GND(15脚):地。VS+(2脚):VS+=2Vcc-1.5V=8.5V。VS-(6脚):VS-=-2Vcc-1.5V=-11.5V。C2+、C2-(4、5脚):一般接1F的电解电容C1+、C1-(1、3脚):一般接1F的电解电容。输入输出引脚分两组,基本含义见表5-2。在实际使用时,若只需要一路串行通信接口,可以使用图5-3 MAX232引脚图图5-4 串行通信接口电平转换电路表5-2 MAX232芯片输入输出引脚分类与基本接法组别TTL电平引脚方向典型接口232电平引脚方向典型接口111(T1IN)输入接MCU的TXD13输入接到9芯接口的2脚RXD12(R1OUT)输出接MCU的RXD14输出接到9芯接口的3脚TXD210(T2IN)输入接MCU的TXD8输入接到9芯接口的2脚RXD9(R2OUT)输出接MCU的RXD7输出接到9芯接口的3脚TXD其中的任何一组。焊接到PCB板上的MAX232芯片检测方法:正常情况下,(1)T1IN=5V,则T1OUT=-9V;T1IN=0V,则T1OUT=9V。(2)将R1IN与T1OUT相连,令T1IN=5V,则R1OUT=5V;令T1IN=0V,则R1OUT=0V。具有串行通信接口的MCU,一般具有发送引脚(TXD)与接收引脚(RXD),不同公司或不同系列的MCU,使用的引脚缩写名可能不一致,但含义相同。串行通信接口的外围硬件电路,主要目的是将MCU的发送引脚TXD与接收引脚RXD的TTL电平,通过RS-232电平转换芯片转换为RS-232电平。图5-4给出了基本串行通信接口的电平转换电路。MAX232芯片进行电平转换基本原理是:发送过程:MCU的TXD(TTL电平)经过MAX232的11脚(T1IN)送到MAX232内部,在内部TTL电平被“提升”为232电平,通过14脚(T1OUT)发送出去。接收过程:外部232电平经过MAX232的13脚(R1IN)进入到MAX232的内部,在内部232电平被“降低”为TTL电平,经过12脚(R1OUT)送到MCU的RXD,进入MCU内部。进行MCU的串行通信接口编程时,只针对MCU的发送与接收引脚,与MAX232无关,MAX232只是起到电平转换作用。5.1.4 串行通信编程模型从基本原理角度看,串行通信接口SCI的主要功能是:接收时,把外部的单线输入的数据变成一个字节的并行数据送入MCU内部;发送时,把需要发送的一个字节的并行数据转换为单线输出。图5-5给出了一般MCU的SCI模块的功能描述。为了设置波特率SCI应具有波特率寄存器。为了能够设置通信格式、是否校验、是否允许中断等,SCI应具有控制寄存器。而要知道串口是否有数据可收、数据是否发送出去等,需要有SCI状态寄存器。当然,若一个寄存器不够用,控制与状态寄存器可能有多个。而SCI数据寄存器存放要发送的数据,也存放接收的数据,这并不冲突,因为发送与接收的实际工作是通过“发送移位寄存器”和“接收移位寄存器”完成的。编程时,程序员并不直接与“发送移位寄存器”和“接收移位寄存器”打交道,只与数据寄存器打交道,所以MCU中并没有设置“发送移位寄存器”和“接收移位寄存器”的映像地址。发送时,程序员通过判定状态寄存器的相应位,了解是否可以发送一个新的数据。若可以发送,则将待发送的数据放入“SCI数据寄存器”中就可以了,剩下的工作由MCU自动完成:将数据从“SCI数据寄存器”送到“发送移位寄存器”,硬件驱动将“发送移位寄存器”的数据一位一位地按照规定的波特率移到发送引脚TxD,供对方接收。接收时,数据一位一位地从接收引脚RxD进入“接收移位寄存器”,当收到一个完整字节时,MCU会自动将数据送入“SCI数据寄存器”,并将状态寄存器的相应位改变,供程序员判定并取出数据。SCI 数据寄存器MCU 的内部总线(Internal Bus) 接收移位寄存器15 SPH 15 H 8 7 X 07 07 015 SPH 15 H 8 7 X 07 07 0发送移位寄存器接收引脚RxD发送引脚TxDSCI 控制寄存器SCI状态寄存器SCI波特率寄存器图5-5 SCI编程模型5.2 XS128的SCI模块寄存器本节从编程角度介绍MC9S12XS128 MCU的SCI模块。该芯片有两个串行口SCI0和SCI1。从外部引脚来看,负责串行通信的是PS0/RxD0、PS1/TxD0、PS2/RxD1、PS3/TxD1四个引脚。当允许SCI时,这些引脚作为串行通信引脚;每个串口模块包含2个引脚,分别称为串行发送引脚TxD和串行接收引脚RxD。本章以SCI0为例来介绍SCI模块,SCI1的使用方法与SCI0完全相同,只是相关寄存器映像地址不同,以下统称SCI模块,具体使用时在头文件中区分使用哪个串口。从程序员角度看,SCI模块有11个8位寄存器,表5-3给出了主要寄存器的基本信息。只要理解和掌握这8个寄存器的用法,就可以进行SCI编程。下面从编程角度介绍SCI模块的寄存器(波特率寄存器、控制寄存器、状态寄存器和数据寄存器)。表5-3 XS128的SCI寄存器地址寄存器名称与缩写访问权限基本功能SCI0SCI1$00C8$00D0波特率寄存器(SCIBDH、SCIBDL)读/写设置波特率$00C9$00D1$00CA$00D2控制寄存器(SCICR1、SCICR2)读/写设置传输格式、中断使能$00CB$00D3$00CC$00D4状态寄存器(SCISR1、SCISR2)只读中断标志、发送与接收状态$00CD$00D5$00CE$00D6数据寄存器(SCIDRH、SCIDRL)读/写收发的数据$00CF$00D7说明:由于有两个串行口,使用SCIx时,寄存器名称中SCI改为SCIx,x=0,1。1. SCI波特率寄存器(SCI Baud Rate Register,SCIBDH/L)波特率寄存器SCIBDH:SCIBDL,分为波特率寄存器的高8位与低8位。SCIBDH的高3位为0,SCIBDH的低5位与SCIBDL一起给出了共13位的串行通信分频系数BR,其取值范围是18191。SCIBDH:SCIBDL不能为0,复位时为4。SCIBDH:数据位D7D6D5D4D3D2D1D0定义xxxSBR12SBR11SBR10SBR9SBR8复位00000000SCIBDL:数据位D7D6D5D4D3D2D1D0定义SBR7SBR6SBR5SBR0SBR4SBR3SBR2SBR1SBR0复位00000100串行通信模块的时钟源为内部总线,设fSCI为串行通信时钟源频率,则fSCI=fBUS。数据手册给出的计算SCI波特率Bt的公式为:Bt=fBUS/(16BR)一般情况下,内部总线频率fBUS是已知的,波特率Bt是编程者希望设定的,然后根据fBUS、Bt求出BR的值:BR=fBUS/(16Bt)例如,fSCI=fBUS=18.6608Mhz=19660800Hz,希望设定波特率Bt=9600,可以求得BR=19660800/(169600)=128,转为十六进制为0x80,则SCIBRH=0x00,SCIDBL=0x80。要注意遵循根据手册的要求,先写SCIBRL再写SCIBRH。若是使用SCI0,则程序如下:SCI0BDH=0x00; /先给高位赋值SCI0BDL=0x80; /后给低位赋值注意:若fBUS=25Mhz,则BR=25000000/(169600)=162.76163,由于不能整除,所以有时存在一定误差,这是允许的。2. SCI控制寄存器1(SCI Control Register1,SCICR1)数据位D7D6D5D4D3D2D1D0定义LOOPSSCISWAIRSRCPTMWAKEILTPEPT复位00000000D7LOOPS位,循环模式选择位(Loop Select Bit)。LOOPS=1,允许自发自收方式;LOOPS=0,正常模式。在允许自发自收方式下,接收引脚RxD与SCI内部断开,内部发送数据直接作为接收的输入,用于自测试。接收器的输入由RSRC位决定。D6SCISWAI位,等待模式下SCI禁止位(SCI Stop in Wait Mode Bit)。SCISWAI=1,禁止SCI模块,即允许在Wait模式下停止SCI;SCISWAI=0,允许SCI模块。D5RSRC位,接收器资源位(Receiver Source Bit)。当LOOPS=1时,RSRC位决定了接收移位寄存器接收数据的来源。RSRC=1,RXD引脚和SCI模块断开,SCI使用TXD引脚来进行发送与接收;RSRC=0,发送器的输出作为接收器的输入。D4M位,模式/字符长度选择位(Data Format Mode Bit)。定义收发数据格式,M=1,9位传送;M=0,8位传送。D3WAKE位,唤醒方式位(Wakeup Condition Bit)。WAKE=1,地址唤醒;WAKE=0,空闲线唤醒。D2ILT位,全1空闲字符位计算方式位(Idle Line Type Bit),决定SCI何时开始计数“空闲字符”的位数。ILTY=1,空闲字符位从“停止位”开始计数;ILTY=0,空闲字符位从“起始位”开始计数。D1PE位,奇偶校验允许位(Parity Enable Bit)。PE=1,允许奇偶校验;PE=0,不进行奇偶校验。D0PT位,奇偶校验类型选择位(Parity Type Bit)。PT=1,奇校验;PT=0,偶校验。不进行奇偶校验时,该位无意义,一般写0。3. SCI控制寄存器2(SCI Control Register1,SCICR2)数据位D7D6D5D4D3D2D1D0定义TIETCIERIEILIETERERWUSBK复位00000000D7TIE位,发送中断允许位(Transmitter Interrupt Enable Bit)。SCTIE=1,允许产生发送中断请求;反之不允许。D6TCIE位,发送完成中断允许位(Transmission Complete Interrupt Enable Bit)。TCIE=1,允许发送完成产生中断;反之不允许。D5RIE位,接收中断允许位(SCI Receive Interrupt Enable Bit)。SCRIE=1,允许产生接收中断请求;反之不允许。D4ILIE位,空闲线中断允许位(Idle Line Interrupt Enable Bit)。ILIE=1,允许产生空闲中断请求;反之不允许。D3TE位,发送器允许位(Transmitter Enable Bit)。TE=1,允许发送器发送;反之不允许发送器发送。D2RE位,接收器允许位(Receiver Enable Bit)。RE=1,允许接收器接收;反之不允许接收器接收。D1RWU位,接收器唤醒位(Receiver Wakeup Bit)。RWU=1,等待状态;RWU=0,正常操作。D0SBK位,发送13或14位全0信号(Send Break Bit)。SBK=1,发送终止字符(逻辑1);SBK=0,正在发送非终止字符。MCU复位后,SCI0CR2寄存器中默认的值是全部为0。可以看出,所有中断都是禁止的,SCI口本身也是被禁止的,因为TE和RE位为0。没有初始化SCI0口之前,SCI0口为普通I/O口的输入口,初始化SCI0口必须允许SCI0口的发送和接收,即向该寄存器写入立即数$0C以给TE和RE位置1。4. SCI替换状态寄存器1(SCI Alternative Status Register,SCIASR1)数据位D7D6D5D4D3D2D1D0定义(只读)RXEDGIFPEBERRVBERRIFBKDIF复位000000000D7RXEDGIF位,接收输入活动沿中断位。该位是确定的,如果一个活动沿(如果RXPOL=0,是下降沿。如果RXPOL=1,是上升沿)在RXD输入出现,改位写1清零。该位为0,表明接收输入没有活动的输入发生。该位为1,表示在接收输入没有活动沿发生。D2BERRV位,比特错误位(Noise Flag)。当比特错误检测电路使能和一个期望值不匹配发生时,BERRV反映了RXD输入的状态。该位只有在BERRIF=1时有意义。该位为0时,表明一个低输入是样本的,高输入位期望的。该位为1,表明一个高输入是在装配值,低输入是期望值。D1BERRIF位,比特错误中断标志位(Framing Error Flag)。该位是确定的,当比特错误检测电路使能和在RXD的样本值和传输值不匹配时。如果BERRIE中断使能位被置,一个中断将会发生。该位写1清零。该位为0,表明没有不匹配值检测到。该为位1,表明一个比匹配值发生。D0BKDIF位,打断检测中断标志。该位是确定的,如果打断检测电路使能并接收到一个打断信号时。如果BKDIE中断使能位被置,一个中断将会发生。该位写1请零。该位为0,表明没有打断信号接收到。为1时,表明有打断信号接收到。5. SCI替换控制寄存器1 (SCI Alternative Control Register 1 ,SCIACR1)数据位D7D6D5D4D3D2D1D0定义(只读)RXEDGIEPEBERRIEBKDIE复位000000000D7RXEDGIE位,接收输入活动沿中断使能位。该位为0,RXEDGIF中断请求禁止。该位为1,RXEDGIF中断请求使能。D1BERRIE位,比特错误中断使能。该位使能比特错误中断标志,BERRIF,去产生中断请求。该位为0,表明BERRIF中断请求禁止。该位为1,表明BERRIF中断请求使能。D0位,打断检测中断使能。该位使能打断检测中断位,BKDIF,去生成中断请求。该位为0,BKDIF中断请求禁止。该位为1,表明BKDIF中断请求使能。6. SCI替换控制寄存器2 (SCI Alternative Control Register 2,SCIACR2)数据位D7D6D5D4D3D2D1D0定义(只读)PEBERRM1BERRM0BKDF复位000000000D2,D1比特错误模式。这两个位决定比特错误检测特征功能。见表5-4。.D0打断检测特征使能位。该位使能打断检测电路。该位为0打断检测电路禁止,该位为1打断电路使能。表5-4 比特错误检测特征功能表BERRM1BERRM0功能00比特错误检测电路使能01在传输比特的第9个时钟接收输入样本发生10在传输比特的第13个时钟接收输入样本发生11保留7. SCI状态寄存器1(SCI Status Register,SCISR1)数据位D7D6D5D4D3D2D1D0定义(只读)TDRETCPERDRFIDLEORNFFEPF复位110000000D7TDRE位,发送数据寄存器空标志位(Transmit Data Register Empty Flag)。该位为1时表明要发送的数据已经移入发送移位寄存器,数据寄存器(SCIDRH/SCIDRL)为空,可以发送一个新的数据。D6TC位,发送完成标志位(Transmit Complete Flag)。该位为1,表明发送已经完成,该位为0,表明发送正在进行。D5RDRF位,接收数据寄存器满标志位(Receive Data Register Full Flag)。该位为1,表明接收器已满,可以从SCI数据寄存器SCIDRH/SCIDRL中读取收到的数据。D4IDLE位,线路空闲标志位(Idle Line Flag)。当接收10个连续的逻辑1(M=0)或接收11个连续的逻辑1(M=1)时,IDLE位即被设置为1。IDLE=1表明接收器处于空闲状态。注意当接收唤醒位RWU=1时,空闲线的状态不能影响IDLE位。D3OR位,溢出标志位(Overrun Bit)。该位为1,表明接收器溢出。D2NF位,噪声标志位(Noise Flag)。该位为1,表明接收器出现噪声错误。D1FE位,帧错误标志位(Framing Error Flag)。该位为1,表明接收器出现帧错误。D0PF位,奇偶错误标志位(Parity Error Flag)。该位为1,表明接收器出现奇偶校验错误。该位写无效。8. SCI状态寄存器2(SCI Status Register,SCISR2)数据位D7D6D5D4D3D2D1D0定义AMAPTXPOLRXPOLBK13TXDIRRAF复位00000000D7AMAP位,该位控制哪些共享相同地址空间的寄存器是可访问的。在复位条件下,串口的功能表现为之前的版本。设置改为位1,允许访问另一个系列的控制和状态寄存器并波特率和控制寄存器1。AMAP=0,SCIBDH (0x0000),SCIBDL (0x0001), SCICR1 (0x0002)标记的寄存器是可访问的。AMAP=1,SCIASR1 (0x0000),SCIACR1 (0x0001), SCIACR2 (0x00002)标记的寄存器是可访问的。D6D5,未定义。D4TXPOL,发送极性位。该位控制发送数据的极性。在正常模式NRZ格式下,1表示高,0表示低。在反转极性下刚好相反TXPOL=0,正常极性。TXPOL=1,反转极性。D3RXPOL,接收极性位。RXPOL=0,正常极性。RXPOL=0,反转极性。D2BK13位,终止码标志位(Break Transmit character length)。BK13=1,终止码长度为13或14位;BK13=0,终止码长度为10或11位。帧错误不受该位的影响。D1TXDIR位,单线模式下发送引脚的数据传输方向位(Transmitter pin data direction in Single-Wire mode)。在单线模式下,该位用来决定TxD引脚用于发送数据还是接收数据。TXDIR=1,表明TxD用于发送数据;TXDIR=0,表明TxD用于接收数据。所谓单线模式就是将RxD与SCI断开,只使用TxD发送和接收数据,并且由TXDIR位决定是发送还是接收。当LOOPS=1、RSRC=1时,使能单线模式。D0RAF位,接收进行标志位(Receiver Active Flag)。该位为1,表明正在接收。9. SCI数据寄存器(SCI Data Register,SCIDRH/L)SCI数据寄存器SCIDRH:SCIDRL。当使用8位数据格式时,只使用SCIDRL寄存器。当使用9位数据格式发送数据时,先写SCIDRH寄存器,再写SCIDRL寄存器。SCIDRH:数据位D7D6D5D4D3D2D1D0读操作R8000000写操作T8复位00000000数据位D7D6D5D4D3D2D1D0读操作R7R6R5R4R3R2R1R0写操作T7T6T5T4T3T2T1T0复位00000000SCIDRL:SCIDRH:只有D7、D6被定义,分别记为R8、T8。当SCI配置为9位数据格式(M=1)时,R8为收到的第9位数据,T8则存放要发送的第9位数据。SCIDRL:读出时,为接收的数据,记作R7R0;写入时,为要发送的数据,记作T7T0。5.3 XS128的SCI构件设计与测试无论用查询方式还是中断方式进行串行通信编程,在程序初始化时均必须对SCI进行初始化,主要进行波特率设置、通信格式的设置、发送接收数据方式的设置等。本小节给出最基本的方法,作为S12X系列MCU的串行通信编程入门知识。下一小节将给出规范的串行通信编程子程序,读者可以直接将其应用于实际的嵌入式应用系统的开发中。5.3.1 SCI初始化有关寄存器地址的定义已经在头文件MC9S12XS128.h中给出,SCIBDH、SCIBDL、SCICR1、SCICR2、SCISR1、SCISR2、SCISDRH、SCISDRL等接口可以直接使用。对SCI进行初始化,最少由以下三步构成(以SCI0为例):第一步定义波特率。一般选择内部总线时钟为串行通信的时钟源。设MCU系统初始化时已定义总线频率为fBUS,同时准备定义串行通信波特率记为为Bt,可通过设置SCI波特率寄存器SCI0BD的波特率选择位SBR12:0(13位)以便选择合适的分频系数,代入公式BtfBUS/(16SCI0BD),使得Bt等于预设的波特率值。这里举例说明,设总线频率fBUS32Mhz,准备定义波特率Bt=9600,则由公式BtfBUS/(16BR)可以得到SCI0BD208,则SCI0BD的值应为二进制“11010000”,即SCI0BDL=$D0,SCI0BDH=$00,程序如下。/总线频率fBUS32MHz,定义波特率Bt=9600(针对SCI0)SCI0BDH=0x00; /需先给给高位赋值SCI0BDL=0x80; /后给低位赋值第二步写控制字到SCI控制寄存器1(SCI0CR1)。设置是否允许SCI、数据长度、输出格式、选择唤醒方法、是否校验等。如若设定允许SCI、正常码输出、8位数据、无校验,则SCI0CR1取值应为二进制“00000000”,程序如下。/设置允许SCI,正常码输出、8位数据、无校验SCI0CR1=0x00;实际上,这种情况只要取SCI0CR1各位的默认值即可。第三步写控制字到SCI控制寄存器2(SCI0CR2)。设置是否允许发送与接收、是中断接收还是查询接收等。如若设置允许发送(TE=1)、允许接收(RE=1)、查询方式收发,则SCI0CR2取值应为二进制“00001100”,程序如下:/设置允许发送、允许接收,查询方式收发SCI0CR2=0x0C;另外几个寄存器供后面编程使用,不需初始化。5.3.2 发送一个数据与接收一个数据一般情况下,对SCI的初始化仅在程序的初始化部分进行一次即可,而串行通信的基本用途就是编程来发送与接收数据。发送数据是通过判断状态寄存器SCI0SR1的第7位(TDRE)进行的,而接收数据是通过判断状态寄存器SCI0SR1的第5位(RDRF)进行的。不论是发送还是接收,均会使用SCI数据寄存器SCI0DRL。发送时将要发送的数据送入SCI0DRL即可,接收时从SCI0DRL中取出的即是收到的数据。例如,下面的程序将字节型变量i中的数从串行引脚TxD发送出去。通过对状态寄存器SCI0SR1的第7位(TDRE)判断是否可以向数据寄存器SCI0DRL送数,若TDRE=1可以送数,否则必须等待。/判断SCI0SR1的第7位(TDRE)是否为1,是1则可以发送数据Datawhile(1)if (SCI0SR1 &(17) != 0) / SCI0SR1.7=0?为0则等待 / SCI0SR1.7=1,可以发送数据SCI0DRL =i;break;要以查询方式接收一个数据,首先通过状态寄存器SCI0SR1的第5位(RDRF)判断有没有数据可收,若RDRF=1则有数据可收,下面程序持续等待串行口(实际上是RxD引脚)接收一个字节数据。/查询方式接收一个字节的数据放入字节型变量i中:while(1)if (SCI0SR1 &(15) != 0) / SCI0SR1.5=0?为0则等待 / SCI0SR1.5=1,可以取出数据i = SCI0DRL;break;在实际编写串行通信接收子函数时,不采用永久循环形式,而改用测试一段时间,若无数据可接收,则带错误标志返回。5.3.3 SCI构件SCI具有初始化、接收和发送三种基本操作。按照构件的思想,可将它们封装成几个独立的功能函数,初始化函数完成对SCI模块的工作属性的设定,接收和发送功能函数则完成实际的通信任务。对SCI模块进行编程,实际上已经涉及到对硬件底层寄存器的直接操作,因此,可将初始化、接收和发送三种基本操作所对应的功能函数共同放置在命名为SCI.c的文件中,并按照相对严格的构件设计原则对其进行封装,同时配以命名为SCI.h的头文件,用来定义模块的基本信息和对外接口。头文件SCI.h中的内容可分为两个主要的部分,它们分别是5个函数原型的声明和外设模块寄存器相关信息的定义。前者给出了本SCI构件对上层构件或软件所提供的接口函数,而后者则指明了本“元构件”与具体硬件相关的信息。串行通信头文件SCI.h含有串行通信寄存器和标志位定义,以及串行通信相关函数声明,下表简要给出了它的主要内容。以初始化函数SCIInit为例,通道号、当前的系统时钟、希望实现的通信波特率以及初始化时是否使能中断,都被设计为函数参数。这样的话,应用程序和上层构件在使用(调用)它时,将具有极大的灵活性。文件还给出了必要的硬件相关信息,当要把该构件移植到其他芯片时,就必须检查并修改这些信息。5.3.4 编程实例1查询方式的串行通信测试工程实例(1)硬件连接接PC机串口(2)具体实现SCI0模块首先向PC机发送字符串“Hello! World!”,然后等待接收PC机从串口发送来的数据,若成功接收到1个数据(调用SCIRe1函数接收数据),则立即将该数据回发给PC机(调用SCISend1函数发送数据),随后继续等待接收1个数据并回发,如此循环。注:使用的波特率为9600,并使用SCI0和PC机通信该实例的详细代码可随书资料。2中断方式的串行通信测试工程实例(1)硬件连接接PC机串口(2)具体实现PC机向XS128发送数据,XS128收到后返回。该实例的详细代码可参阅附带的代码文件。5.4 XS128的中断源与第一个带有中断的编程实例5.4.1 中断与异常的通用知识中断是MCU实时地处理内部或外部事件的一种内部机制。当某种内部或外部事件发生时,中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断的程序处,继续执行下去。实际上中断提供了一种方法来保存当前CPU状态和寄存器,转而执行中断服务子程序,然后恢复CPU状态,以便返回执行中断之前的处理状态。与只是程序指令的软件中断不同,中断由硬件事件触发。中断的处理过程一般为:关中断(在此中断处理完成前,不处理其它中断)、保护现场、执行中断服务程序、恢复现场、开中断等。异常是CPU强行从正常的程序执行切换到由某些内部或外部条件所要求的处理任务上去,这些任务是优先于处理器正在执行的任务的。引起异常的外部条件是来自外围设备、硬件断点请求、访问错误和复位等;引起异常的内部条件是指令、不对界错误、违反特权级和跟踪等。许多处理器把硬件复位和硬件中断都归类为异常,把硬件复位看作是一种具有最高优先级的异常;把来自外围设备的强行任务切换请求称为中断。处理器对复位、中断、异常具有同样的处理过程,在谈及这个处理过程时统称为异常。处理器在指令流水线的译码或者执行阶段识别异常,若检测到一个异常,则强行中止后面尚未流到该阶段的指令。对于在指令译码阶段检测到的异常,以及对于与执行阶段有关的指令异常来说,由于引起的异常与该指令本身无关,指令并没有得到正确执行,所以为该类异常保存的程序计数器的值指向引起该异常的指令,以便异常返回后重新执行。对于中断和跟踪异常,异常与指令本身有关,处理器在执行完当前指令后才识别和检测这类异常,故为该类异常保存的PC值是指向要执行的下一条指令。5.4.2 XS128的中断机制详解1XS128的XINT中断解析模块在S12X系列的微控制器中都有一个XINT模块,该模块主要用于解析中断请求的优先级并且将中断向量交给CPU(对于S12XS系列而言只有CPU,其它如XE系列还存在

温馨提示

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

评论

0/150

提交评论