异步串行通信
不论8位、16位还是32 位,单片机的基本系统都是通过异步串行口与人沟通的。使用串行通信接口SCI(Serial Communication Interface)通信是计算机与人对话最传统、最基本的方法,异步通信接口也称为通用异步接收器/发送器UART(Universal Asynchronous Receiver/Transmitter),在介绍SCI口的驱动设计之前,有必要先了解一些异步串行通信的基本知识。
串行通信协议RS-232标准
多年来,人与计算机通信主要采用异步串行通信方式,人通过计算机数据终端设备与计算机通信。EIA RS-232-C是美国电子工业协会正式公布的异步串行通信标准,也是目前最常用的异步串行通信标准,用来实现计算机与计算机之间、计算机与外设之间的数据通信,与国际电报电话咨询委员会CCITT指定的串行接口标准V.24“数据终端设备(DTE)和数据通信设备(DCE)之间的接口电路定义表”基本相同。
RS-232-C电平采用负逻辑,即,逻辑1:-3~-15V,逻辑0:+3~+15V。注意,单片机使用的CMOS电平中,高于电源电压70%为高电平,例如,若单片机以+5V供电,则高于3.5V为逻辑1,低电平0~0.8V为逻辑0。单片机的SCI口要外接电平转换电路芯片把与TTL兼容的CMOS高电平表示的1转换成RS-232的负电压信号,把地电平转换成RS-232的正电压信号。典型的转换电路给出-9V和+9V。
在RS-232端口,如PC机的COM1,用万用表测量到+9V或-9V 电位则说明这一端为输出端,量到不确定电平的是输入端。量到负电压信号说明信号有效,有效的含义是1,和定义一致,如DTR(Data Terminal Ready),为负电压时为“Ready”,正电压表示“Not Ready”。
RS-232-C适用于设备之间的通信距离不大于15m(50英尺),传输速率最大为20KB/s的数据传输领域,后来随着CPU运行速度的提高,对于较短的通信距离,例如2m (约6英尺),单片机与PC之间,异步串行通信的速率可使用115200B/s。
PC机的串行口是按照数据终端设备DTE定义的,要实现单片机与PC通过串行口通信,要用一根电缆连接单片机的SCI接口和PC机的SCI接口,通常为COM1或COM2,设计单片机的SCI接口要知道这个口怎么接。既然PC机是按DTE定义的,单片机一端必须按照DCE定义,二者才能直接相连,如果都按DTE定义,则电缆两端的发送、接收要“拧”一下才行。
RS-232-C标准主要是DTE1和DCE2之间的连接定义,内容包括接口的电气特性、机械特性等。RS-232-C的插头分为DCE端和DTE端。传统的RS-232-C接口标准有22根线,采用标准25芯D型插头座。后来的PC上使用简化了的9芯D型插座,在单片机应用中25芯插头座已很少采用。这两种类型中,25芯定义与9芯相关的RS-232-C串行标准接口信号定义见表5-1。虽然表5-1中9芯D型插头座没有定义保护地,但金属外壳设备的保护地不应没有,这里显然可以借用1或9。遇到接RS-232电缆的情况时,最好是用万用表量一下。
1DTE:Data Terminal Equipment,即数据终端设备,指PC机或终端。
2 DCE:Data Communication Equipment,即数据通信设备,指调制解调器等外设。
由上表所示,RS-232-C 的接口信号标准除发送接收信号RXD 、TXD 以及GND 以外,还有通信应答信号或称为握手信号。因为PC 与单片机通信只需要传送ASCII 码字符,ASCII 码字符集中已经含有流量控制字符,可以不使用握手线,但用于数据通信就必须使用握手线了。数据的发送流程是这样的:在发送数据之前,发送端要给出请求发送RTS ,接收端利用这个信号清空接收缓冲区,发送端接收到接收端的允许发送信号CTS 。接着接收端发出数据终端准备好信号DTR ,发送端的DSR 接收到对方的DTR 以后,开始在TXD 上送出数据。和调制解调器相连,通过电话线传输数据时,必须使用指向握手线,RS-232-C 信号定义中的数据载波检测(DCD )、振铃指示等就是用于这一目的的。
表5-1 RS-232接口信号定义 简写符 DTE 25芯(公) DCE 25芯(母) DTE 9芯(公)DCE
9芯(母)
信号方向 信号功能解释 PG 1 1 - - 保护地
TXD 2 3 3 2 DTE →DCE 发送数据Transmit Data
RXD 3 2 2 3 DTE ←DCE 接收数据
Receive Data
RTS 4 5 7 8 DTE →DCE 请求发送 Require to Send
CTS 5 4 8 7 DTE ←DCE
清除请求 Clear to Send DSR 6 20 6 4 DTE ←DCE 数据装置就绪 Data Set Ready GND 7 7 5 5 GND 信号地 Ground DCD 8 8 1 1 In 接收线信号检测
Data Carry
Detected
DTR 20 6 4 6 DTE →DCE 数据终端准备好Data Terminal
Ready
RI 22 22 9 9 In 振铃指示
注:“-”表示没有定义 串行数据格式
数据的串行发送是靠SCI 模块内部的移位寄存器将数据一位一位地发送到传输线上。信号线上无信号传输时是逻辑1,注意,此时对于单片机的TTL 电平来说是高电平,对于RS-232数据线上是负电压,如图5-1中表示的是单片机的逻辑值。
起始位必须是逻辑0,因为异步通信是靠这个起始位的下降沿来同步通信双方的。接下来是数据位,数据位可以是5位、6位、7位、8位或9位。发送时从低位(b0)起,一位一位地发出,低位在前,高位在后,常用的数据位数目是7位和8位,S08单片机也可以使用9位。如果校验允许,高位后面的一位是奇偶校验位,奇偶校验位是计算前面数据位为1的数目,加上校验位,使之永远为偶数,则称为偶校验;使之永远为奇数,则称为奇校验。接收数据时,边接收边计算1的个数,和校验位符合则接收数据正确。
低位高位
同步通信和异步通信的区别起始位
图5-1 异步串行通信的数据格式
停止位永远为逻辑1,停止位可以是1个、1.5个或2个,含义是,两个被发送的数据之间至少要间隔1位、1.5位或2位。
通信速率、数据位数目、校验方式、最少停止位数目等是通信规约,双方必须约定好。规约中还有一个概念是全双工和半双工,全双工指发送和接收可以在两条信号线上同时进行,半双工只需要一条信号线,通信中任何一方发送时不能接收,接收时不能发送。PC与单片机的串行通信使用独立的发送信号线和接收信号线,应使用全双工。误将PC端设为半双工会出现以下现象,即当通过PC键盘向单片机发命令时,敲一个键会看到PC屏幕上显示两个字符。这是因为半双工方式将PC发送出去的字符在PC上显示出来,单片机收到PC 发来的字符后回送了该字符。
RS-232电缆的连接方法
用RS-232连接系统时,有近程方式和远程方式之分:近程方式是指通信距离小于15m(50英尺)的通信,远程方式指15m以上的长距离通信。近程方式直接使用RS-232电平方式;远程方式可使用20mA电流环、使用差分电平的RS-485方式等。这里只讨论近程方式。
PC与单片机系统最简单的接法是使用3根信号线的接法,单片机SCI的发送数据端要接PC的接收数据端,
PC的发送数据端要接单片机SCI的接收数据端;PC的信号地与单片机的信号地相连。单片机端按DCE标准设计,对于9针D型插头,只使用2、3、5针就可以了。此时若PC一方使用超级终端仿真软件,必须将PC一方的流量控制设为“无”或设置成使用“XON/XOFF”软件协议。若设置成硬件流量控制,而此时又没有接相应的握手线,通信就不能实现。
为避免因没有连握手线可能引起的麻烦,可在制作RS-232电缆时,对于25芯D型插头,将4、5针短接,6、8、20针短接;对于9芯D型插头,将7、8针短接,1、4、6针短接。让双方各自的RTS接CTS,DTR接DSR和DCD。
通信速率
所谓异步通信是指通信双方没有共同的时钟用以同步。通信双方使用各自的时钟,并约定使用同样的通信数据速率,这一通信速率被称为波特率(Baud Rate),波特率为1表示每秒传送1位。标准的波特率有50、110、300、600、1200、2400、4800、9600、19200、38400、57600、115200等。
若双方没有同步时钟,通信速率不可能很快,因为完成通信需要有16倍于波特率的时钟。要实现115200的波特率,SCI模块内部的工作时钟就必须不低于1.8432MHz。这一频率的时钟是从单片机时钟分频而来的。
单片机片内的SCI模块靠第3、5、7个时钟来采样接收信号下降沿,探测对方发送来的数据起始位。对第3、5、7个时钟周期采样到的信号做3取2处理,以确认起始位信号
的下降沿,以此实现和对方的数据同步。探测到下降沿以后,第8、9、10个时钟周期采样到低个时钟周期采样到低电平就可以确认收到了起始位。以后,对于每个数据位都要用第8、9、10个时钟周期采样接收到的数据位,并作3取2处理,以克服传输线上可能的噪声。
有了上面关于RS-232和异步串行通信的知识和对某一单片机的了解就可以设计单片机最小硬件系统了。
ASCII 码
精简的RS-232通信仅使用3根线:RXD、TXD和GND,不使用硬件握手信号,此时可以用XON/XOFF软件协议。软件协议用一个ASCII字符Ctrl+ S($13,称为XOFF)让对方停止发送ASCII字符,Ctrl +Q($11,称为XON)让对方继续发送。使用XON/XOFF 协议只能传送以ASCII码表示的文本文件,不能传送二进制文件,因为 ASCII码中有控制字符,7位数据组成的128B的前32个代码$00到$1F 和最后一个代码 $7F 是控制字符代码,表5-2给出了这些代码的定义,$7F 是控制字DEL。
常用的ASCII 码中的控制符有:
NUL $00 空字符,C语言中表示字符串结束、空指针;
EOT $04 End of Text,汇编语言程序中表示字符串结束;
BEL $07 Bell, 发出铃声;
BS $08 Back
行编辑时用于退格;
Space,
LF $0A Line Feed , 换行;
回车;
CR $0D Carriage
Return,
DC3 $13 请求对方停止发送;
DC1 $11 请求对方继续发送。
表5-2 ASCII 字符码表中的控制代码
$00 $01 $02 $03 $04 $05 $06 $07 NUL SOH STX ETX EOT ENQ ACK BEL $08 $09 $0A $0B $0C $0D $0E $0F BS NT LF VT FF CR SO SI $10 $11 $12 $13 $14 $15 $16 $17 DLE DC1 DC2 DC3 DC4 NAK SYN ETB $18 $19 $1A $1B $1C $1D $1E $1F CAN EM SUB ESC FS GS RS US
没有通信控制线,直接用RS-232传送数据就很困难,若数据中有上面这些值,接收方只能当作控制字符处理,数据必须转成ASCII 码传送。下面的程序显示所有可显示的95个ASCII码:
ASCIIDSP LDA #$20 ; First Displayable ASCII Code is Space CMP #$7F ; End of ASCII
BEQ DONE
JSR $FE83 ; System Call for OUTCH
INC ; Next Character
BRA ASCIIDSP
DONE JMP WARMSTART ;Finished
表5-3给出可显示的ASCII码:
表5-3 ASCII字符码表中的可显示码
x0 x1 x2x3 x4 x5x6x7x8x9xA xB xC xD xE xF
2x !"#$%&'()*+,-./
3x 0 1 2 3 4 5 6 7 8 9 :;<=>?
4x @ A B C D E F G H I J K L M N O 5x P Q R S T U V W X Y Z[\]^_
6x ` a b c d e f g h i j k L m n o 7x p q r s t u v w x y z {|}~DEL
这里 $20是空格,$7F 是控制字DEL。
SCI功能简介
MCU芯片内的波特率发生器从MCU振荡器经过分频得到各种标准波特频率。SCI发送器和接收器功能独立,但使用同样的数据格式和波特率。HCS08系列MCU中也有一些产品的发送与接收的波特率不同。下面简单介绍一下SCI的功能,在本章稍后还会详细说明。
SCI系统功能:
z标准NRZ格式
z全双工操作,发送器和接收器分别有独立的允许位
z软件预置32种波特率之一
z软件选择数据字长(每字8或9个bit)
z SCI可用中断驱动,有四个分立的中断条件
SCI接收器功能:
z接收器唤醒功能(空闲线或地址位)
z空闲线探测标志
z错误检测标志-帧错误、噪声、溢出检测
z接收数据寄存器满标志
SCI发送器功能:
z发送数据寄存器空标志
z发送完成标志
z在发送过程中CPU随时可以中止发送行为
SCI发送器
软件写入SCI数据寄存器(SCIxD)之后,数据送到发送缓冲区,移位寄存器发送缓冲区得到数据。移位寄存器得到数据之后,即在它的LSB位装入0作为起始位,在最后一位装入
1作为停止位。当串行控制寄存器SCIxC2中的TE位(发送允许)由0变1时,移位寄存器将全部装入1,包括通常装入0的起始位,作为数据头。而在发送中止命令时,移位寄存器全部装入0,包括通常装入1的停止位。发送缓冲区的附加位(第9位)由SCI控制寄存器
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论