第7章串行通信接口(SCI)1第7章串行通信接口(SCI)目前几乎所有的台式电脑都带有9芯的异步串行通信口,简称串行口或COM口。有的台式电脑带有两个串行口,分别称为COM1、COM2口。大部分的笔记本电脑也带有串行口。随着USB接口的普及,串行口的地位逐渐变低了。但是,作为设备间的一种简便的通信方式,在相当长的时间内,串行口还不会消失。因为简单且常用的串行通信只需要三根线(发送线、接收线和地线),所以,串行通信可以作为MCU与外界通信的简便方式之一。大部分嵌入式MCU都具有串行通信接口(SerialCommunicationInterface,SCI),掌握SCI的编程是学习MCU的重要内容之一。本章从掌握规范的SCI基本编程角度讨论串行通信编程,把与芯片型号相关内容和与芯片型号无关内容区别开来,便于读者融会贯通与实际应用。本章7.1、7.2节是与芯片无关的有关串行通信的通用基础知识,只有理解这些基础知识,才能进行串行通信的应用。7.3、7.4节阐述GP32芯片的SCI模块的编程方法,在此基础上,重点掌握7.5节给出的编程实例。注意,在汇编程序中,只有初始化子程序与GP32相关,收发程序在整个08系列中是通用的,在C程序中,只有初始化子程序与GP32相关,收发程序对任何芯片是通用的。当然,要注意头文件SCI.h相关位的定义。关于串口程序的测试,最好利用教学资料中提供的PC机方的高级语言源程序进行。根据自己对高级语言的熟悉程度选用VB、C#、VC或其他高级语言。实际上,掌握一门PC机方的高级语言编程对嵌入式系统开发是必要的。7.1异步串行通信的基础知识本节简要概括了串行通信中的通常使用的相关基本概念,为学习MCU的串行接口编程做准备。对于已经了解这方面知识的读者,可以略读本节。7.1.1基本概念“位”(bit)是单个二进制数字的简称,是可以拥有两种状态的最小二进制值,分别用“0”和“1”表示。在计算机中,通常一个信息单位用8位二进制表示,称为一个“字节”(byte)。串行通信的特点是:数据以字节为单位,按位的顺序从一条传输线上发送出去。这里至少涉及到以下几个问题:第一,每个字节之间是如何区分的;第二,发送一位的持续时间是多少;第三,怎样知道传输是正确的;第四,可以传输多远等等。这些问题属于串行通信的基本概念。串行通信分为异步通信与同步通信两种方式,本节主要给出异步串行通信的一些常用概念。正确理解这些概念,对串行通信编程是有益的。1.异步串行通信的格式在MCU的英文芯片手册上,通常说SCI采用的是NRZ数据格式,英文全称是:第7章串行通信接口(SCI)2“standardnon-return-zeromark/spacedataformat”,可以译为:“标准不归零传号/空号数据格式”。这是一个通信术语,“不归零”的最初含义是:用负电平表示一种二进制值,正电平表示另一种二进制值,不使用零电平。“mark/space”即“传号/空号”分别是表示两种状态的物理名称,逻辑名称记为“1/0”。对学习嵌入式应用的读者而言,只要理解这种格式只有“1”、“0”两种逻辑值就可以了。图7-1给出了8位数据、无校验情况的传送格式。这种格式的空闲状态为“1”,发送器通过发送一个“0”表示一个字节传输的开始,随后是数据位(在MCU中一般是8位或9位,可以包含校验位)。最后,发送器发送1到2位的停止位,表示一个字节传送结束。若继续发送下一字节,则重新发送开始位,开始一个新的字节传送。若不发送新的字节,则维持“1”的状态,使发送数据线处于空闲。从开始位到停止位结束的时间间隔称为一帧(frame)。所以,也称这种格式为帧格式。通过这段内容,知道了异步串行通信中,通过“开始位”与“停止位”区分每个传送的字节。所以,每发送一个字节,都要发送“开始位”与“停止位”,这是影响异步串行通信传送速度的因素之一。同时因为每发送一个字节,必须首先发送“开始位”,所以称之为“异步”(asynchronous)通信。2.串行通信的波特率位长(bitlength),也称为位的持续时间(bitduration)。其倒数就是单位时间内传送的位数。人们把每秒内传送的位数叫做波特率(baudrate)。波特率的单位是:位/秒,记为bps。bps是英文bitpersecond的缩写,习惯上这个缩写不用大写,而用小写。通常情况下,波特率的单位可以省略。通常使用的波特率有300、600、900、1200、1800、2400、4800、9600、19200、38400。在包含开始位与停止位的情况下,发送一个字节是10位,很容易计算出,在各种波特率下,发送1K字节所需的时间。显然,这个速度相对于目前的许多通信方式是慢的,那么,异步串行通信的速度能否提得很高呢?答案是否定的。因为随着波特率的提高,位长变小,以致很容易受到电磁源的干扰,通信就不可靠了。当然,还有通信距离问题,距离小,可以适当提高波特率,后面还会涉及此问题。3.奇偶校验在异步串行通信中,如何知道传输是正确的?最常见的方法是增加一个位(奇偶校验位),供错误检测使用。字符奇偶校验检查(characterparitychecking)称为垂直冗余检查(verticalredundancychecking,VRC),它是每个字符增加一个额外位使字符中“1”图7-1SCI数据格式第0位第1位第2位第3位第4位第5位第6位第7位停止位开始位第7章串行通信接口(SCI)3的个数为奇数或偶数。奇数或偶数依据使用的是“奇校验检查”还是“偶校验检查”而定。当使用“奇校验检查”时,如果字符数据位中“1”的数目是偶数,校验位应为“1”,如果“1”的数目是奇数,校验位应为“0”。当使用“偶校验检查”时,如果字符数据位中“1”的数目是偶数,则校验位应为“0”,如果是奇数则为“1”。这里列举奇偶校验检查的一个实例,看看ASCII字符“R”,其位构成是1010010。由于字符“R”中有三个1位,若使用奇校验检查,则校验位为0;如果使用偶校验检查,则校验位为1。在传输过程中,若有1位(或奇数个数据位)发生错误,使用奇偶校验检查,可以知道发生传输错误。若有2位(或偶数个数据位)发生错误,使用奇偶校验检查,不能知道发生传输错误。但是奇偶校验检查方法简单,使用方便,发生一位错误的概率远大于发生二位错误的概率,所以“奇偶校验”这种方法还是最为常用的一种校验方法。几乎所有MCU的串行异步通信接口,都提供这种功能。4.串行通信的传输方式在串行通信中,经常用到“单工”、“双工”、“半双工”等术语。它们是串行通信的不同传输方式。下面简要介绍这些术语的基本含义。①单工(Simplex):数据传送是单向的,一端为发送端,另一端为接收端。这种传输方式中,除了地线之外,只要一根数据线就可以了。有线广播就是单工的。②全双工(Full-duplex):数据传送是双向的,且可以同时接收与发送数据。这种传输方式中,除了地线之外,需要两根数据线,站在任何一端的角度看,一根为发送线,另一根为接收线。一般情况下,MCU的异步串行通信接口均是全双工的。③半双工(Half-duplex):数据传送也是双向的,但是在这种传输方式中,除了地线之外,一般只有一根数据线。任何一个时刻,只能由一方发送数据,另一方接收数据,不能同时收发。在Freescale的HC08系列MCU中,监控模式的通信就采用这种方式。7.1.2RS-232C总线标准现在回答“可以传输多远”这个问题。MCU引脚输入/输出一般使用TTL电平,而TTL电平的“1”和“0”的特征电压分别为2.4V和0.4V(目前一些使用3V供电的MCU中,该特征值有所变动),它适用于板内数据传输。若用TTL电平将数据传输到5m之外,那么可靠性是值得考究的。为了使信号传输得更远,美国电子工业协会EIA(ElectronicIndustryAssociation)制订了串行物理接口标准RS-232C。RS-232C采用负逻辑,-15V~-3V为逻辑“1”,+3V~+15V为逻辑“0”。RS-232C最大的传输距离是30m,通信速率一般低于20Kbps。当然,实际应用中,也有人用降低通信速率的方法,通过RS-232电平,将数据传送到300m之外,这是很少见的,且稳定性很不好。第7章串行通信接口(SCI)4RS-232C总线标准最初是为远程数据通信制订的,但目前主要用于几米到几十米范围内的近距离通信。有专门的书籍介绍这个标准,但对于一般的读者,不需要掌握RS-232C标准的全部内容,只要了解本节介绍的这些基本知识就可以使用RS-232。目前一般的PC机均带有1到2个串行通信接口,人们也称之为RS-232接口,简称“串口”,它主要用于连接具有同样接口的室内设备。早期的标准串行通信接口是25芯插头,这是RS-232C规定的标准连接器(其中:2条地线,4条数据线,11条控制线,3条定时信号,其余5条线备用或未定义)。后来,人们发现在计算机的串行通信中,25芯线中的大部分并不使用,逐渐改为使用9芯串行接口。一段时间内,市场上还有25芯与9芯的转接头,方便了两种不同类型之间的转换。后来,使用25芯串行插头极少见到,25芯与9芯对接头也极少有售。因此,目前几乎所有计算机上的串行口都是9芯接口。图7-2给出了9芯串行接口的排列位置,相应引脚含义见表7-1。图7-29芯串行接口排列图7-3MAX232引脚在RS-232通信中,常常使用精简的RS-232通信,通信时仅使用3根线:RxD(接收线)、TxD(发送线)和GND(地线)。其它为进行远程传输时接调制解调器之用,有的也可作为硬件握手信号,初学时可以忽略这些信号的含义。在MCU中,若用RS-232C总线进行串行通信,则需外接电路实现电平转换。在发送端需要用驱动电路将TTL电平转换成RS-232C电平,在接收端需要用接收电路将RS-232C电平转换为TTL电平。电平转换器不仅可以由晶体管分立元件构成,也可以直接使用集成电路。目前使用MAX232芯片较多,该芯片使用单一+5V电源供电实现电平转换。图7-3给出了MAX232的引脚说明。引脚含义简要说明如下:Vcc(16脚):正电源端,一般接+5VGND(15脚):地VS+(2脚):VS+=2Vcc-1.5V=8.5VVS-(6脚):VS-=-2Vcc-1.5V=-11.5V表7-19芯串行接口引脚含义表引脚号功能引脚号功能12345接收线信号检测(载波检测DCD)接收数据线(RXD)发送数据线(TXD)数据终端准备就绪(DTR)信号地(SG)6789数据通信设备准备就绪(DSR)请求发送(RTS)清除发送振铃指示412嵌入式集成开发系统嵌入式集成开发系统35V1115PA口数据方向寄存器DDRAx位A口6789第7章串行通信接口(SCI)5C2+、C2-(4、5脚):一般接1µF的电解电容C1+、C1-(1、3脚):一般接1µF的电解电容输入输出引脚分两组,基本含义见表7-2。在实际使用时,若只需要一路SCI,可以使用其中的任何一组。利用MAX232将TTL电平转换为RS-232电平的电路接法将在下一节结合SCI的外围硬件电路讨论。7.2电平转换电路与SCI通用编程原理所有型号MCU的串行通信接口(SerialCommunicationInterface,SCI),都具有发送引脚TxD、接收引脚RxD,它们是TTL电平引脚。要利用这两个引脚与外界实现异步串行通信,还必须将TTL电平转为RS-232电平,这可利用上节介绍的MAX232来完成。本节从通用角度讨论SCI的电路设计、基本编程结构与编程原理,为实际编程做准备。7.2.1SCI的外围硬件电路具有SCI接口的MCU,一般具有发送引脚(TxD)与接收引脚(RxD),不同公司或不同系列的MCU,使用的引脚缩写名可能不一致,但含义相同。SCI的外围硬件电路,主要目的是将MCU的发送引脚TxD与接收引脚RxD的TTL电平,通过RS-232电平转换芯片转换为RS-232电平。图7-4,给出一个基本SCI电平转换电路。基本工作过程是:发送