第3章HCS12单片机的通信模块 串行通信是微控制器与外围设备或其他计算机之间通信的一种重要渠道,计算机或微控制器与外界进行数据交换称为通信。它是采用一根或几根传输线作为通信连接线,把一组二进制数据逐位、顺序、分时进行传输的方式。串行通信的缺点是传送速度较慢; 其突出的优点是所需传输线的数量较少,占用微控制器(MCU,又称单片机)的引脚资源较少。串行通信必须遵守严格的通信协议才可以用于传输数据。 HCS12单片机作为飞思卡尔(Freescale)公司生产的一款面向汽车电子行业的微控制器芯片,它的串行通信模块包括多个独立的串行子系统,本章以HCS12单片机为例,介绍异步串行通信(SCI)和CAN总线通信两个串行通信子系统。 3.1串行通信接口 目前几乎所有的台式计算机都带有9芯的异步串行通信口,简称串行口或COM口。因为简单且常用的串行通信只需要3根线(发送线、接收线和地线),所以串行通信仍然是MCU与外界通信的简便方式之一。大部分MCU都具有串行通信接口(SCI),掌握SCI也是学习MCU的重要内容之一。 串行通信是MCU与外部设备之间进行的一种简单而有效的硬件方法。串行通信接口可以将终端或个人计算机连接到MCU,也可以将几个分散的MCU连接成通信网络。 3.1.1异步串行通信的基础知识 1. 基本概念 “位”(bit)是单个二进制数字的简称,是可以拥有两种状态的最小二进制值,分别用0和1表示。在计算机中,通常一个信息单位用8位二进制表示,称为1字节(byte,表示为1B)。串行通信的特点是: 数据以字节为单位,按位的顺序从一条传输线上发送出去。这里至少涉及几个问题: ①每个字节之间是如何区分的?②发送1位的持续时间是多少?③怎样知道传输是正确的?④可以传输多远?等等。这些问题属于串行通信的基本概念。串行通信分为异步通信和同步通信两种方式,本节主要给出异步串行通信的一些常用概念。 1) 异步串行通信的格式 在MCU的英文芯片手册上,通常说SCI采用的是NRZ数据格式,英文全称是Standard NonReturnZero Mark/Space Data Format,可以译为“标准不归零传号/空号数据格式”。这是一个通信术语。“不归零”的最初含义是: 用负电平表示一种二进制值,正电平表示另外一种二进制值,不使用零电平。Mark/Space即“传号/空号”,分别表示两种状态的物理名称,逻辑名称记为1/0。图31给出了8位数据无校验情况的传输格式。 图31串行通信数据格式 这种格式的空闲状态为1,发送器通过发送一个0表示一字节传输的开始,随后是数据位(在MCU中一般是8位或9位,也可以包含校验位)。最后,发送器发送1~2位的停止位,表示一字节传输结束。若继续发送下一字节,则重新发送开始位,开始一个新字节传送。若不发送新的字节,则维持1的状态,即使发送数据处于空闲。从开始位到停止位结束的时间间隔称为1帧(frame)。因此,也称这种格式为帧格式。 通过这段内容可以知道,在异步串行通信中,是通过开始位和停止位来区分每个传送字节的。因此,每发送一个字节,都要发送开始位和停止位,这是影响异步串行通信传送速度的因素之一。同时,因为每发送一个字节,必须首先发送开始位,所以称之为“异步”通信。 2) 串行通信的波特率 “位长”(bit length),也称为位的持续时间(bit duration)。其倒数就是单位时间内传送的位数。人们把每秒内传送的位数叫做波特率(baud rate)。波特率的单位是位/秒,记为b/s或bps。bps是英文bit per second的缩写,习惯上这个缩写不用大写,而用小写。 通常使用的波特率有300、600、900、1200、1800、2400、4800、9600、19200、38400b/s。在包含开始位和停止位的情况下,发送一字节数据需要10位,所以很容易计算出在各种波特率下,发送1KB所需时间。显然,这个速度相对于目前的许多通信方式是慢的,那么,异步串行通信的速度能否提的很高呢?答案是否定的。这是因为随着波特率的提高,位长变小,以致很容易受到电磁源的干扰,通信就不可靠了。当然,还有通信距离问题,距离短,可以适当提高波特率。后面还会涉及此问题。 3) 奇偶校验 在异步串行通信中,如何知道传输是正确的?最常见的方法就是增加一位(奇偶校验位),供错误检测使用。字符奇偶校验检查(character parity checking)称为垂直冗余检查(vertical redundancy checking,VRC),它是每个字符增加一个额外位使字符中的1的个数为奇数或是偶数。奇数或偶数依据使用的是奇校验检查还是偶校验检查而定。当使用奇校验检查时,如果字符数据位中1的数目是偶数,则校验位应为1; 如果1的数目是奇数,则校验位应为0。当使用偶校验检查时,如果字符数位中1的数目是偶数,则校验位应为0; 如果是奇数,则为1。 这里给出奇偶校验检查的一个实例,例如ASCII字符R,其位构成是01010010。由于字符R中有3个1位,因此若使用奇校验则校验位为0; 若使用偶校验则校验位为1。 在传输过程中,若有1位(或奇数个数据位)发生错误,使用奇偶校验检查可以知道发生传输错误; 若有2位(或偶数个数据位)发生错误,使用奇偶校验检查不能知道发生传输错误。但是奇偶校验检查方法简单,使用方便,发生1位错误的概率远大于发生2位错误的概率,所以“奇偶校验”还是最为常用的一种校验方法,几乎所有MCU的串行异步通信接口都提供这种功能。 4) 串行通信的传输方式 在串行通信中,经常用到“单工”“全双工”“半双工”等术语,它们是串行通信的不同传输方式。下面简要介绍这些术语的基本含义。 (1) 单工(simplex): 数据传送是单向的,一端为发送端,另一端为接收端。在这种传输方式中,除了地线之外,只要一根数据线就可以了。有线广播就是单工的。 (2) 全双工(fullduplex): 数据传送是双向的,且可以同时接收与发送数据。在这种传输方式中,除了地线之外,发送方和接收方均需要两根数据线,一根为发送线,另一根为接收线。一般情况下,MCU的异步串行通信接口均是全双工的。 (3) 半双工(halfduplex): 数据传送也是双向的,但是在这种传输方式中,除了地线之外,一般还有一根数据线。任何一个时刻,只能由一方发送数据,另一方接收数据,不能同时收发。 2. RS232C接口 1) RS232C接口标准 MCU引脚输入/输出一般使用TTL电平,而TTL电平的1和0的特征电压分别为2.4V和 0.4V(目前一些使用3V供电的MCU中,该特征值有所变动),它适用于板内数据传输。若用TTL电平将数据传输到5m之外,那么可靠性是值得考究的。为了使信号传输得更远,美国电子工业协会(Electronic Industry Association,EIA)制定了串行物理接口标准RS232C。RS232C采用负逻辑,-15~-3V为逻辑1,3~15V为逻辑0。RS232C最大的传输距离是30m,通信速率一般低于20Kb/s。当然,在实际应用中,也有人用降低通信速率的方法,通过RS232C电平将数据送到300m之外,这是很少见的,且稳定性很不好。 RS232C接口标准最初是为远程数据通信制定的,但目前主要用于几米到几十米范围内的近距离通信。有专门的书籍介绍这个标准,但对于一般的读者不需要掌握RS232C标准的全部内容,只要了解本节介绍的这些基本知识就可以了。目前,一般的PC机均带有1或2个串行通信接口,人们也称之为RS232C接口,简称“串口”,它主要用于连接具有同样接口的室内设备。早期的标准串行通信接口是25芯插头, 图329芯串行接口排列 这是RS232C规定的标准连接器(其中: 2条地线、4条数据线、11条控制线、3条定时信号线,其余5条线备用或未定义)。后来,人们发现在计算机的串行通信中,25芯线中的大部分并不使用,于是逐渐改为使用9芯串行接口。一段时间内,市场上还有25芯与9芯的转接头,方便了两种不同类型插头之间的转换。后来,使用25芯串行插头极少见到,25芯与9芯转接头也极少有售。因此,目前几乎所有计算机上的串行接口都是9芯接口。图32给出了9芯串行接口的排列位置,相应引脚含义如表31所列。 表319芯串行接口引脚含义 引脚号 功能引脚号 功能 1 接收线信号检测(载波DCD) 2 接收数据线(RxD) 3 发送数据线(TxD) 4 数据终端准备就绪(DTR) 5 信号地(GND) 6 数据通信设备就绪(DSR) 7 请求发送(RTS) 8 清除发送 9 振铃指示 在RS232C通信中,常常使用精简的RS232通信,通信时仅使用3根线: RxD(接收线)、TxD(发送线)和GND(地线)。其他为进行远程传输时接调制/解调器之用,有的也可以作为硬件握手信号,初学时可以忽略这些信号的含义。 2) 电平转换电路 在MCU中,若用RS232C总线进行串行通信,则需要外接电路实现电平转换。在发送端需要用驱动电路将TTL电平转 图33MAX232芯片的引脚图 换成RS232C电平,在接收端需要用驱动电路将RS232C电平转换为TTL电平。电平转换器不仅可以由晶体管分立元件构成,也可以直接使用集成电路。目前使用MAX232芯片较多,该芯片能使用单一+5V电源供电实现RS232C电平转换。图33给出了MAX232芯片的引脚图。 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脚): 一般接1μF的电解电容。 C1+、C1-(1、3脚): 一般接1μF的电解电容。 MAX232芯片输入/输出引脚分两组,基本含义如表32所列。在实际使用时,若只需要一路SCI,可以使用其中的任何一组。 表32MAX232芯片输入/输出引脚分类与基本接法 组别 TTL 电平引脚 方向 典 型 接 口 RS232 电平引脚 方向 典 型 接 口 1 11 输入 接MCU的TxD 13 输入 12 输出 接MCU的RxD 14 输出 连接到接口,与其他设备通过RS232相接 2 10 输入 接MCU的TxD 8 输入 9 输出 接MCU的RxD 7 输出 连接到接口,与其他设备通过RS232相接 图34给出了一个基本SCI电平转换电路。 图34SCI电平转换电路 由图34可知,其基本工作过程如下: 发送过程: MCU的TxD(TTL电平)经过MAX232的引脚11(T1IN)送到MAX232内部,在内部TTL电平被“提升”为RS232电平,通过引脚14(T1OUT)发送出去。 接收过程: 外部RS232电平经过MAX232的引脚13(R1IN)进入MAX232内部,在内部RS232电平被“降低”为TTL电平,经过引脚12(R1OUT)送到MCU的RxD,进入MCU内部。 进行MCU的SCI编程时,只针对MCU的发送与接收引脚,与MAX232无关,MAX232只起到电平转换作用。 3. SCI通用编程原理 从基本原理角度看,串行通信接口SCI的主要功能是: 接收时,把外部的单线输入的数据变成1B的并行数据送入MCU内部; 发送时,把需要发送的1B的并行数据转换为单线输出。图35给出了一般MCU的SCI模块的功能描述。 图35SCI编程模型 为了设置波特率,SCI应具有波特率寄存器。为了能够设置通信格式,是否校验,是否允许中断等,SCI应具有控制寄存器; 而要知道串口是否有数据可收,数据是否发送出去等,需要有SCI状态寄存器。当然,若一个寄存器不够用,控制与状态寄存器可能有多个。而SCI数据寄存器存放要发送的数据,也存放接收的数据,这并不冲突,因为发送与接收的实际工作是通过发送移位寄存器和接收移位寄存器完成的。编程时,程序员并不直接与发送移位寄存器和接收移位寄存器打交道,只与数据寄存器打交道,所以MCU中并没有设置发送移位寄存器和接收移位寄存器的映像地址。发送时,程序员通过判断状态寄存器的相应位,了解是否可以发送一个新的数据。若可以发送,则将待发送的数据放入SCI数据寄存器中即可,剩下的工作由MCU自动完成; 将数据从SCI数据寄存器发送到移位寄存器,硬件驱动将发送移位寄存器的数据逐位地按照规定的波特率移到发送引脚TxD,供对方接收。接收时,数据逐位地从接收引脚RxD进入接收移位寄存器,当收到一个完整字节时,MCU会自动将数据送入SCI数据寄存器,并将状态寄存器的相应位改变,供程序员判定并取出数据。 3.1.2HCS12单片机的SCI SCI串行通信接口是一种异步串行通信系统,它是计算机最常用的通信接口之一。HCS12单片机的SCI是全双工异步串行通信接口,通常用于微控制器与其他计算机、调制解调器等设备之间的通信。 1. SCI的特点 在HCS12微控制器中集成了两个SCI串行通信模块: SCI0、SCI1。每个SCI模块的内部结构如图36所示。 图36SCI模块的内部结构 SCI是一种采用标准的不归零数据(NRZ)格式的异步串行通信接口,它内置独立的波特率产生电路和SCI收发器,可以选择8或9个数据位(其中9位数据格式的第9位可由SCI控制寄存器的M位指定为奇或偶校验位)。发送和接收的奇偶校验位可以选择是否由硬件生成。 HCS12单片机SCI的功能特点: 双线串行接口; 标准NRZ格式; 硬件自动生成奇偶标志; 全双工操作; 独立的波特率产生逻辑; 独立的发送器和接收器允许控制位; 通信过程可采用中断驱动机制; 具有回送方式,方便了调试; 可以监视发送器的输出; 实现通信过程的自诊断。 HCS12单片机SCI串行通信在普通和特殊运行模式下的功能是一样的。它除了运行模式外,还有两种低电源工作模式,即等待模式和停止模式。 2. SCI的设置 1) 波特率寄存器(SCIBDH、SCIBDL) SCIBDH和SCIBDL构成一个16位的波特率寄存器,其中,SCIBDH为高8位波特率寄存器,SCIBDL为低8位波特率寄存器。SCI0模块的波特率寄存器写成SCI0BDH、SCI0BDL,SCI1模块的波特率寄存器写成SCI1BDH、SCI1BDL。 (1) 波特率寄存器SCIBDH 复位默认值: 0000 0000B 读写 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 Read/Write 0 0 0 SBR12 SBR11 SBR10 SBR9 SBR8 (2) 波特率寄存器SCIBDL 复位默认值: 0000 0100B 读写 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 Read/Write SBR7 SBR6 SBR5 SBR4 SBR3 SBR2 SBR1 SBR0 SBR12~SBR0为波特率常数,SCI的波特率计算公式如下: 波特率=SCI模式时钟/(16×BR) 式中,BR为SCI波特率寄存器的常数,由SBR12~SBR0设定,其取值范围为1~8191; SCI模式时钟为主频频率(由图36可知)。 2) SCI控制寄存器1(SCICR1) SCI的工作方式主要由该寄存器设置。可选择工作模式、设置帧格式、唤醒、空闲检测类型以及奇偶校验等。SCI0模块的控制寄存器1写成SCI0CR1,SCI1模块的控制寄存器1写成SCI1CR1。 复位默认值: 0000 0100B 读写 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 Read/Write LOOPS SCISWAI RSRC M WAKE ILT PE PT LOOPS: 循环选择位。 0—正常工作使能; 1—循环工作使能。 SCISWAI: SCI等待模式停止位。 0—SCI等待模式使能; 1—SCI等待模式禁止。 RSRC: 接收器信号源位。当LOOPS为1时,RSRC决定接收器移位寄存器的信号源。 0—接收器的输入在内部连接到发送器输出; 1—接收器的输入连接到发送引脚。 M: 数据帧格式位。 0—1个起始位,8个数据位,1个停止位; 1—1个起始位,9个数据位,1个停止位。 WAKE: 唤醒条件位。 0—由空闲线唤醒; 1—地址标志也即第9位数据位唤醒。 ILT: 空闲线类型位。 0—在一帧的开始位后立即对空闲特征位计数; 1—在停止位后开始对空闲特征位计数。 PE: 奇偶校验使能位。 0—奇偶校验禁止; 1—奇偶校验使能。 PT: 奇偶校验类型位。 0—偶校验; 1—奇校验。 3) SCI控制寄存器2(SCICR2) SCI控制寄存器2主要完成收发中断的控制、收发的允许等设置操作。SCI0模块的控制寄存器2写成SCI0CR2,SCI1模块的控制寄存器2写成SCI1CR2。 复位默认值: 0000 0000B 读写 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 Read/Write TIE TCIE RIE ILIE TE RE RWU SBK TIE: 发送中断使能位。 0—TDRE中断请求禁止; 1—TDRE中断请求使能。 TCIE: 发送结束中断使能位。 0—TC中断请求禁止; 1—TC中断请求使能。 RIE: 接收满中断使能位。 0—RDRF和OR中断请求禁止; 1—RDRF和OR中断请求使能。 ILIE: 空闲中断使能位。 0—IDLE中断请求禁止; 1—IDLE中断请求使能。 TE: 发送允许位。 0—发送禁止; 1—发送使能。 RE: 接收使能位。 0—接收器禁止; 1—接收器使能。 RWU: 接收器唤醒位。 0—正常工作; 1—唤醒功能使能。 SBK: 中止符发送使能位。 0—中止符产生器禁止; 1—产生中止符。 4) SCI状态寄存器1(SCISR1) SCI状态寄存器1可显示SCI的运行情况,例如接收、发送数据状态,是否出错等。SCI0模块的状态寄存器1写成SCI0SR1,SCI1模块的状态寄存器1写成SCI1SR1。 复位默认值: 0000 0000B 读写 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 Read TDRE TC RDRF IDLE OR NF FE PF TDRE: 发送数据寄存器空标志位。 0—无字节传送到发送移位寄存器; 1—数据已被传送到发送移位寄存器,发送数据寄存器为空。 TC: 发送结束标志。 0—正在发送; 1—发送结束。 RDRF: 接收数据满标志。当数据从接收移位寄存器传输到SCI数据寄存器RDRF置1,读取SCI状态寄存器SCISR1和SCI数据寄存器低位将会清除RDRF。 0—SCI数据寄存器数据无效; 1—SCI数据寄存器接收到的数据有效。 IDLE: 空闲线标志。当接收到10或11个以上连续的1时,IDLE置位。 0—RxD线非空闲; 1—RxD线空闲。 OR: 重叠标志。当接收数据寄存器中的数据未被取走之前,又要接收移位寄存器写入新的一帧数据,这种情况称重叠错误。 0—无重叠; 1—出现重叠错误。 NF: 噪声标志。当SCI检测到接收输入端有噪声,该位置位。 0—无噪声; 1—有噪声。 FE: 帧格式错误标志。如果在应该出现停止位的时刻,检测到0,则该位置位。 0—无帧格式错误; 1—有帧格式错误。 PF: 奇偶校验错误标志。当奇偶校验允许(PE为1),接收到数据的奇偶性与校验位SCICR1中的PT不相匹配,该位置位。 0—奇偶校验正确; 1—奇偶校验错误。 5) SCI数据寄存器(SCIDRH、SCIDRL) SCIDRH和SCIDRL构成一个16位的数据寄存器,其中,SCIDRH为高8位数据寄存器,SCIDRL为低8位数据寄存器。SCI0模块的数据寄存器写成SCI0DRH、SCI0DRL,SCI1模块的数据寄存器写成SCI1DRH、SCI1DRL。 (1) SCI数据寄存器SCIDRH 复位默认值: 0000 0000B 读写 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 Read R8 Write T8 0 0 0 0 0 0 (2) SCI数据寄存器SCIDRL 复位默认值: 0000 0100B 读写 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 Read R7 R6 R5 R4 R3 R2 R1 R0 Write T7 T6 T5 T4 T3 T2 T1 T0 R8: 接收位8。该位写操作无效。当SCI设置成9位数据运行模式(M为1)时,该位是从串行数据流中接收到的第9位。 T8: 发送位8。任何时候可读可写。当SCI设置成9位数据运行模式时,该位是送到串行数据流的第9位。 R7~R0: 接收数据位7~0。 T7~T0: 发送数据位7~0。 3. SCI的应用实例 1) 点对点通信 HCS12单片机的SCI模块采用RS232电平转换芯片MAX232,可以利用异步串行通信协议与PC机进行点对点通信,如图37所示。 实验说明: (1) HCS12单片机的SCI0模块与PC机进行SCI通信; (2) HCS12单片机的主频为8MHz,SCI0波特率设置为9600b/s; (3) HCS12单片机SCI0的数据格式设置为: 正常8位模式,无奇偶校验; (4) HCS12单片机的输入/输出A口控制8个共阳发光二极管(流水灯)的亮灭; (5) PC机的上位机软件利用SCI串口小助手。 实验效果: (1) 定时方式(每隔1s)向PC机发送一个字符“A”(串口小助手的接收窗口可显示);