




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章 串行通信接口(SCI) 1 第第7 7章章 串串行行通通信信接接口口( (S SC CI I) ) 目前几乎所有的台式电脑都带有 9 芯的异步串行通信口,简称串行口或 COM 口。 有的台式电脑带有两个串行口,分别称为 COM1、COM2 口。大部分的笔记本电脑也 带有串行口。随着 USB 接口的普及,串行口的地位逐渐变低了。但是,作为设备间的 一种简便的通信方式,在相当长的时间内,串行口还不会消失。因为简单且常用的串行 通信只需要三根线(发送线、接收线和地线),所以,串行通信可以作为 MCU 与外界通 信的简便方式之一。大部分嵌入式 MCU 都具有串行通信接口(Serial Communication Interface,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 “standard non-return-zero mark/space data format” ,可以译为: “标准不归零传号/空号数 据格式” 。这是一个通信术语, “不归零”的最初含义是:用负电平表示一种二进制值, 正电平表示另一种二进制值,不使用零电平。 “mark/space”即“传号/空号”分别是表 示两种状态的物理名称,逻辑名称记为“1/0” 。对学习嵌入式应用的读者而言,只要理 解这种格式只有“1” 、 “0”两种逻辑值就可以了。图 7-1 给出了 8 位数据、无校验情况 的传送格式。 这种格式的空闲状态为 “1” ,发送器通过发送一个 “0”表示一个字节传输的开始, 随后是数据位(在 MCU 中一般是 8 位或 9 位,可以包含校验位) 。最后,发送器发送 1 到 2 位的停止位,表示一个字节传送结束。若继续发送下一字节,则重新发送开始位, 开始一个新的字节传送。若不发送新的字节,则维持“1”的状态,使发送数据线处于 空闲。从开始位到停止位结束的时间间隔称为一帧(frame) 。所以,也称这种格式为帧 格式。 通过这段内容,知道了异步串行通信中,通过“开始位”与“停止位”区分每个传 送的字节。所以,每发送一个字节,都要发送“开始位”与“停止位” ,这是影响异步 串行通信传送速度的因素之一。同时因为每发送一个字节,必须首先发送“开始位” , 所以称之为“异步”(asynchronous) 通信。 2串行通信的波特率 位长(bit length) ,也称为位的持续时间(bit duration) 。其倒数就是单位时间内传送 的位数。人们把每秒内传送的位数叫做波特率(baud rate) 。波特率的单位是:位/秒, 记为 bps。bps 是英文 bit per second 的缩写,习惯上这个缩写不用大写,而用小写。通 常情况下,波特率的单位可以省略。 通常使用的波特率有300、 600、 900、 1200、 1800、 2400、 4800、 9600、 19200、 38400。 在包含开始位与停止位的情况下,发送一个字节是 10 位,很容易计算出,在各种波特 率下,发送 1K 字节所需的时间。显然,这个速度相对于目前的许多通信方式是慢的, 那么,异步串行通信的速度能否提得很高呢?答案是否定的。因为随着波特率的提高, 位长变小, 以致很容易受到电磁源的干扰, 通信就不可靠了。 当然, 还有通信距离问题, 距离小,可以适当提高波特率,后面还会涉及此问题。 3奇偶校验 在异步串行通信中,如何知道传输是正确的?最常见的方法是增加一个位(奇偶校 验位),供错误检测使用。字符奇偶校验检查(character parity checking) 称为垂直冗余检 查( vertical redundancy checking,VRC) ,它是每个字符增加一个额外位使字符中“1” 图7-1 SCI数据格式 第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.2 RS-232C总线标准 现在回答“可以传输多远”这个问题。MCU 引脚输入/输出一般使用 TTL 电平, 而 TTL 电平的“1”和“0”的特征电压分别为 2.4V 和 0.4V(目前一些使用 3V 供电的 MCU 中,该特征值有所变动),它适用于板内数据传输。若用 TTL 电平将数据传输到 5m 之外,那么可靠性是值得考究的。为了使信号传输得更远,美国电子工业协会 EIA (Electronic Industry Association)制订了串行物理接口标准 RS-232C。RS-232C 采用负逻 辑, -15V-3V为逻辑 “1” , +3V+15V为逻辑 “0” 。 RS-232C最大的传输距离是30m, 通信速率一般低于 20Kbps。当然,实际应用中,也有人用降低通信速率的方法,通过 RS-232 电平,将数据传送到 300m 之外,这是很少见的,且稳定性很不好。 第7章 串行通信接口(SCI) 4 RS-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-2 9芯串行接口排列图7-3 MAX232引脚 在 RS-232 通信中,常常使用精简的 RS-232 通信,通信时仅使用 3 根线:RxD(接 收线)、TxD(发送线)和 GND(地线)。其它为进行远程传输时接调制解调器之用,有的也 可作为硬件握手信号,初学时可以忽略这些信号的含义。 在 MCU 中,若用 RS-232C 总线进行串行通信,则需外接电路实现电平转换。在发 送端需要用驱动电路将 TTL电平转换成RS-232C电平, 在接收端需要用接收电路将RS -232C 电平转换为 TTL 电平。电平转换器不仅可以由晶体管分立元件构成,也可以直 接使用集成电路。目前使用 MAX232 芯片较多,该芯片使用单一+5V 电源供电实现电 平转换。图 7-3 给出了 MAX232 的引脚说明。 引脚含义简要说明如下: Vcc(16 脚) :正电源端,一般接+5V GND(15 脚) :地 VS+(2 脚) :VS+=2Vcc-1.5V=8.5V VS-(6 脚) :VS-=-2Vcc-1.5V=-11.5V 表 7-1 9 芯串行接口引脚含义表 引脚号功能引脚号功能 1 2 3 4 5 接收线信号检测(载波检测DCD) 接收数据线(RXD) 发送数据线(TXD) 数据终端准备就绪(DTR) 信号地(SG) 6 7 8 9 数据通信设备准备就绪(DSR) 请求发送(RTS) 清除发送 振铃指示 41235 67 8 9 第7章 串行通信接口(SCI) 5 C2+、C2-(4、5 脚) :一般接 1F 的电解电容 C1+、C1-(1、3 脚) :一般接 1F 的电解电容 输入输出引脚分两组,基本含义见表 7-2。在实际使用时,若只需要一路 SCI,可 以使用其中的任何一组。 利用 MAX232 将 TTL 电平转换为 RS-232 电平的电路接法将在下一节结合 SCI 的 外围硬件电路讨论。 7.2 电平转换电路与SCI通用编程 原理 所 有 型 号 MCU 的 串 行 通 信 接 口 (Serial Communication Interface,SCI) ,都具有发送引脚 TxD、接收引脚 RxD,它们是 TTL 电平引脚。要利 用这两个引脚与外界实现异步串行通信,还必须将 TTL 电平转为 RS-232 电平,这可利用上节介绍的 MAX232 来完成。本节从通用角度讨论 SCI 的电路 设计、基本编程结构与编程原理,为实际编程做准 备。 7.2.1 SCI的外围硬件电路 具有 SCI 接口的 MCU,一般具有发送引脚(TxD)与接收引脚(RxD),不同公司或不 同系列的 MCU,使用的引脚缩写名可能不一致,但含义相同。SCI 的外围硬件电路, 主要目的是将 MCU 的发送引脚 TxD 与接收引脚 RxD 的 TTL 电平,通过 RS-232 电平 转换芯片转换为 RS-232 电平。图 7-4,给出一个基本 SCI 电平转换电路。 基本工作过程是: 发送过程: MCU的TxD(TTL电平) 经过MAX232的11(T1IN) 送到MAX232内部, 在内部 TTL 电平被“提升”为 232 电平,通过 14(T1OUT) 发送出去。 接收过程:外部 232 电平经过 MAX232 的 13(R1IN) 进入到 MAX232 的内部,在 表 7-2 MAX232 芯片输入输出引脚分类与基本接法 组别TTL电平引脚方向典型接口232电平引脚方向典型接口 1 11 12 输入 输出 接MCU的TxD 接MCU的RxD 13 14 输入 输出 连接到接口与其它设备通过 232相接 2 10 9 输入 输出 同上 8 7 输入 输出 同上 图7-4 SCI电平转换电路 +5V 232 电平 OUT IN MAX232CPE 16 15 14 13 12 11 10 9 1234567 8 +5V GND TTL 电平 OUT IN 1F5 + TTL 电平 转为 232 电平 + + + + 第7章 串行通信接口(SCI) 6 内部 232 电平被“降低”为 TTL 电平,经过 12(R1OUT) 送到 MCU的 RxD,进入 MCU 内部。 进行 MCU 的 SCI 编程时,只针对 MCU 的发送与接收引脚,与 MAX232 无关, MAX232 只是起到电平转换作用。 7.2.2 SCI的基本编程原理 从基本原理角度看,串行通信接口 SCI 的主要功能是:接收时,把外部的单线输 入的数据变成一个字节的并行数据送入 MCU 内部;发送时,把需要发送的一个字节的 并行数据转换为单线输出。图 7-5 给出了一般 MCU 的 SCI 模块的功能描述。为了设置 波特率SCI应具有波特率寄存器。 为了能够设置通信格式、 是否校验、 是否允许中断等, SCI 应具有控制寄存器。而要知道串口是否有数据可收、数据是否发送出去等,需要有 SCI 状态寄存器。当然,若一个寄存器不够用,控制与状态寄存器可能有多个。而 SCI 数据寄存器存放要发送的数据,也存放接收的数据,这并不冲突,因为发送与接收的实 际工作是通过“发送移位寄存器”和“接收移位寄存器”完成的。编程时,程序员并不 直接与“发送移位寄存器”和“接收移位寄存器”打交道,只与数据寄存器打交道,所 以MCU 中并没有设置 “发送移位寄存器”和 “接收移位寄存器”的映像地址。发送时, 程序员通过判定状态寄存器的相应位,了解是否可以发送一个新的数据。若可以发送, 则将待发送的数据放入 “SCI 数据寄存器” 中就可以了, 剩下的工作由 MCU 自动完成: 将数据从“SCI 数据寄存器”送到“发送移位寄存器” ,硬件驱动将“发送移位寄存器” 的数据一位一位地按照规定的波特率移到发送引脚 TxD,供对方接收。接收时,数据 一位一位地从接收引脚 RxD 进入“接收移位寄存器” ,当收到一个完整字节时,MCU 会自动将数据送入“SCI 数据寄存器” ,并将状态寄存器的相应位改变,供程序员判定 并取出数据。 图7-5 SCI编程模型 SCI 数据寄存器 MCU 的 内 部 总 线 (Internal Bus) 接收移位寄存器发送移位寄存器 接收引脚 RxD 发送引脚 TxD SCI 控制寄存器SCI状态寄存器SCI波特率寄存器 第7章 串行通信接口(SCI) 7 7.3 GP32 SCI模块寄存器 本节从编程角度介绍 MC908GP32 单片机的 SCI。从外部引脚来看,负责串行通信 的是 PTE0/TxD、PTE1/RxD 两个引脚,当允许 SCI 时,它们作为串行通信引脚,分别 称为串行发送引脚 TxD、串行接收引脚 RxD。从程序员角度看,涉及 SCI 的有 7 个寄 存器,其中 1 个波特率寄存器,3 个控制寄存器,2 个状态寄存器,1 个数据寄存器, 只要理解和掌握这 7 个寄存器的用法,就可以进行 SCI 编程。 表 7-3 给出了 GP32 芯片 SCI 模块的寄存器。 表 7-3 GP32 的 SCI 模块寄存器 寄存器名称缩写地址访问权限基本功能 控制寄存器 SCC1$0013 读/写设置传输格式、中断使能SCC2$0014 SCC3$0015 状态寄存器 SCS1$0016 只读中断标志、发送与接收状态 SCS2$0017 数据寄存器SCDR$0018读/写收发数据 波特率寄存器SCBR$0019读/写设置波特率 1SCI波特率寄存器(SCI Baud Rate Register,SCBR) SCI 波特率寄存器 SCBR的作用是设置串行通信的波特率。通常情况下,选择内部 总线时钟为串行通信的时钟源,此时利用 SCBR 对总线频率 fBUS可以进行分频得到串 行通信的波特率。SCBR 的地址是:$0019,定义为: 数据位D7D6D5D4D3D2D1D0 定义未定义未定义 SCP1SCP0 未定义 SCR2SCR1SCR0 复位 00000000 D7、D6、D3:未定义。设置时,为了方便,一般取 0。 D5D4 SCP 位:波特率预分频位(SCI Baud Rate Prescaler Bits)。这 2 位定义波 特率预分频值,记为:PD,定义如下: SCP1、SCP0=00PD=1 =01PD=3 =10PD=4 =11PD=13 D2D0 SCR 位:波特率选择位(SCI Baud Rate Select Bits)。这 3 位定义波特率 另一分频值,记为:BD,定义如下: SCR2、SCR1、SCR0=000BD=1(20) =001BD=2(21) =010BD=4(22) =011BD=8(23) 第7章 串行通信接口(SCI) 8 =100BD=16(24) =101BD=32(25) =110BD=64(26) =111BD=128(27) 设 fSCI为串行通信时钟源频率,fSCI= fBUS或 CGMXCLK,取决于 CONFIG2 的 SCIBDSRC,一般设定 SCIBDSRC=1,SCI 用内部总线时钟,则 fSCI= fBUS,则波特率的 定义公式为: BtfBUS/(64PDBD) 例如:fBUS2.4576MHz,取 PD=1(即 SCP1、SCP0=00)、BD=4(即 SCR2、SCR1、 SCR0=010),则波特率2457600 /(6414) = 9600。 2SCI控制寄存器1(SCI Control Register 1,SCC1) SCI 控制寄存器共有 3 个,分别称为 SCC1、SCC2、SCC3。对它们的写入,实现 对 SCI 的设置。SCC1 的地址是:$0013,定义为: 数据位 D7D6D5D4D3D2D1D0 定义 LOOPSENSCITXINVMWAKEILTYPENPTY 复位00000000 初学时重点掌握其中的 D6、D4、D1 和 D0 位。 D7 LOOPS 位:循环模式选择位(Loop Mode Select Bit),LOOPS=1,循环模式; LOOPS=0,正常功能。在循环模式下,接收引脚 RxD 与 SCI 内部断开,内部发送数据 直接作为接收的输入,用于自测试。 D6 ENSCI位: SCI允许位(Enable SCI Bit)。 ENSCI=1, 允许SCI, 这意味着PTE0 /TxD、 PTE1/RxD两个引脚作为串行通信引脚使用, 而不作为普通I/O。 否则, 若设ENSCI =0,则禁止 SCI,PTE0/TxD、PTE1/RxD 两个引脚则作为普通 I/O 使用。 D5 TXINV 位:发送反转标志位(Transmit Inversion Bit)。TXINV=1,发送输出为 反码;TXINV=0 正常码输出。 D4 M 位:模式字符长度选择位(Mode Character Length Bit)。定义收发数据 格式,只有两种可能:M=1,9 位字符;M=0,8 位字符。 D3 WAKE 位: 唤醒条件位(Wakeup Condition Bit)。 WAKE=1, 地址唤醒; WAKE =0,空闲线唤醒。唤醒功能(Wake-up feature)并不是常用功能,初学时可以不需深入理 解。对唤醒功能的介绍放在 7.6 节。 D2 ILTY 位:空闲线类型位(Idle Line Type Bit),决定 SCI 何时开始计数“空闲 字符”的位数。ILTY=1,空闲字符位从“停止位”开始计数;ILTY=0,空闲字符位从 “起始位”开始计数。从“起始位”开始计数,则“停止位”前的一串“1”可能产生 错误的空闲线条件。从“停止位”开始计数,可避免错误的空闲线识别,但需要适当地 同步发送操作。 D1 PEN 位:奇偶校验允许位(Parity Enable Bit)。PEN=1,允许奇偶校验;PEN =0,不进行奇偶校验。 第7章 串行通信接口(SCI) 9 D0 PTY 位:奇偶校验类型选择位(ParityBit)。PTY=1,奇校验;PTY=0,偶 校验。不进行奇偶校验时,该位无意义,一般写 0。 3SCI控制寄存器2(SCI Control Register 2,SCC2) SCC2 的地址是:$0014,定义为: 数据位 D7D6D5D4D3D2D1D0 定义 SCTIETCIESCRIEILIETERERWUSBK 复位00000000 初学时重点掌握其中的 D3 和 D2 位。 D7 SCTIE 位:发送中断允许位(SCI Transmit Interrupt Enable Bit)。SCTIE=1,允 许产生发送中断请求;反之不允许。 D6 TCIE位: 发送完成中断允许位(Transmission Complete InterruptEnable Bit)。 TCIE=1,允许发送完成产生中断;反之不允许。 D5 SCRIE 位:接收中断允许位(SCI Receive Interrupt Enable Bit)。SCRIE=1,允 许产生接收中断请求;反之不允许。 D4 ILIE 位:空闲线中断允许位(Idle Line Interrupt Enable Bit)。ILIE=1,允许产 生空闲中断请求;反之不允许。 D3 TE 位:发送器允许位(Transmitter Enable Bit)。TE=1,允许发送器发送;反 之不允许发送器发送。 D2 RE 位:接收器允许位(Receiver Enable Bit)。RE=1,允许接收器接收;反之 不允许接收器接收。 D1 RWU 位:接收器唤醒位(Receiver Wakeup Bit)。RWU=1,等待状态;RWU =0,正常操作。 D0 SBK 位:发送终止位(Send Break Bit)。SBK=1,发送终止字符(逻辑 1);SBK =0,正在发送非终止字符。 4SCI控制寄存器3(SCI Control Register 3,SCC3) SCC3 的地址是:$0015,定义为: 数据位D7D6D5D4D3D2D1D0 定义R8T8DMAREDMATEORIENEIEFEIEPEIE 复位 00000000 一般情况下,该寄存器不用。初学时主要了解有单字节校验时使用 D7 和 D6 位。 D7 R8 位:接收位 8 (Received bit 8)。该位只读。 D6 T8 位:发送位 8(Transmitted Bit 8)。 D5、D4 不用。 D3 ORIE位: 接收器溢出中断允许位(Receiver Overrun Interrupt Enable Bit)。 ORIE =1,允许接收器溢出中断;反之不允许。 D2 NEIE 位:接收器噪声错误中断允许位(Receiver Noise Error Interrupt Enable Bit)。NEIE=1,允许接收器噪声错误中断;反之不允许。 第7章 串行通信接口(SCI) 10 D1 FEIE 位:接收器帧错误中断允许位(Receiver Framing Error Interrupt Enable Bit)。FEIE=1,允许接收器帧错误中断;反之不允许。 D0 PEIE 位:接收器奇偶错误中断允许位(Receiver Parity Error Interrupt Enable Bit)。PEIE=1,允许接收器奇偶错误中断;反之不允许。 5SCI状态寄存器1(SCI Status Register 1,SCS1) SCI 状态寄存器共有 2 个,分别称为 SCS1、SCS2。对它们的读出,可以得到当前 SCI 的状态。SCS1 为只读寄存器,它的地址是:$0016,定义为: 数据位 D7D6D5D4D3D2D1D0 定义(只读) SCTETCSCRFIDLEORNFFEPE 复位11000000 初学时主要掌握其中的 D7 和 D5 位。 D7 SCTE 位:发送缓冲区空标志位 (SCI Transmitter Empty bit)。该位为 1 时表 明要发送的数据已经移入发送移位寄存器,可以发送一个新的数据。 D6 TC 位:发送完成标志位(Transmission Complete Bit)。该位为 1,表明发送已 经完成,该位为 0,表明发送正在进行。 D5 SCRF 位:接收器满标志位(SCI Receiver Full Bit)。该位为 1,表明接收器已 满,可以从 SCI 数据寄存器 SCDR 中读取收到的数据。 D4 IDLE 位:接收器空闲标志位(Receiver Idle Bit)。该位为 1,表明接收器处于 空闲状态。 D3 OR 位:接收器溢出标志位(Receiver Overrun Bit)。该位为 1,表明接收器溢 出。 D2 NF 位:接收器噪声标志位(Receiver Noise Flag Bit)。该位为 1,表明接收器 出现噪声错误。 D1 FE 位:接收器帧错误标志位(Receiver Framing Error Bit)。该位为 1,表明接 收器出现帧错误。 D0 PE 位:接收器奇偶错误标志位(Receiver Parity Error Bit)。该位为 1,表明接 收器出现奇偶校验错误。 注意: 读取上述标志位及SCDR数据, 系统自动清除相应的标志位 (SCTE位除外) 。 读取 SCTE 位及向 SCDR 写数据,系统自动清除 SCTE 标志位。 6SCI状态寄存器2(SCI Status Register 2,SCS2) SCS2 为只读寄存器,它的地址是:$0017,定义为: 数据位D7D6D5D4D3D2D1D0 定义(只读)未定义未定义未定义未定义未定义未定义BKFRPF 复位 00000000 该寄存器通常情况下不用。 D7D2:未定义。 D1 BKF 位:终止码标志位(Break Flag Bit)。该位为 1,检测到终止码。读取该 第7章 串行通信接口(SCI) 11 位或向 SCDR 写数据,系统自动清除该标志位。 D0 RPF 位:接收进行标志位(Reception in Progress Flag Bit)。该位为 1,表明正 在接收。该位不能产生中断请求,接收器检测到错误开始位或空闲特征,复位该位。 7SCI数据寄存器(SCI Data Register SCDR) SCDR 为 SCI 系统最常用的寄存器,它的地址是:$0018。写入时,为要发送的 8 位数据,记为:T7T0;读出时,为接收的 8 位数据,记为:R7R0。不受复位影响。 注意:不要对该寄存器使用读-修改-写命令。 7.4 串行口初始化与收发编程的基本方法 无论用查询方式还是中断方式进行串行通信编程,在程序初始化时均必须对 SCI 进行初始化,主要进行波特率设置、通信格式的设置、发送接收数据方式的设置等,本 小节给出最基本的用法,以作为 HC08 系列单片机的串行通信编程入门。下一小节将给 出规范的串行通信编程子程序, 读者可以直接将其应用于实际的嵌入式应用系统的开发 中。 1SCI初始化 有关口地址的定义已经在头文件 GP32.H 中给出, SCC1、SCC2、SCC3、SCBR、 SCS1、SCS2、SCDR 可以直接使用。 对 SCI 进行初始化,最少由以下三步构成: 第一步:定义波特率。一般选择内部总线时钟为串行通信的时钟源(这个设置在 MCU 的系统初始化中完成,令系统设置寄存器 CONFIG2 的 SCIBDSRC 位为 1 即可, 从学习顺序角度,本书将这部分内容放在第 14 章,此处默认系统初始化时已经做了这 样的设置) 。设 MCU 的系统初始化时已经定义总线频率为 fBUS,同时准备定义串行通 信波特率, 记为Bt。 通过选择SCI波特率寄存器 SCBR的波特率预分频位SCP (两位) 、 波特率选择位 SCR(三位) ,以便选择合适的分频系数 PD、BD,代入公式 BtfBUS/(64 PDBD) ,使得 Bt 等于需要的值。当然,从表面上看,由这个公式,已知 fBUS、Bt,求 PD、BD两个未知数不行。但只要注意到,在介绍 SCI 波特率寄存器 SCBR 时,PD、BD 取值是有限制的,这样,由 fBUS、Bt 可以“拼凑”出 PD、BD,从而得到波特率寄存器 SCBR 的设定值。为此,不少书籍还专门列了一个表,给出不同 fBUS、Bt 下的 PD、BD 的“拼凑”值。这里举例说明,设总线频率 fBUS2.4576MHz,准备定义波特率 Bt =9600,则由公式 BtfBUS/(64PDBD)可以“拼凑”出,PD=1(即 SCP1、SCP0 =00) 、BD=4(即 SCR2、SCR1、SCR0=010) ,波特率寄存器 SCBR 的未定义位取 0, 则 SCBR 的值应为二进制“00000010” ,程序如下: /总线频率 fBUS2.4576MHz,定义波特率 Bt=9600 LDA#%00000010 STASCBR 第二步:写控制字到 SCI 控制寄存器 1(SCC1) 。设置是否允许 SCI、数据长度、 第7章 串行通信接口(SCI) 12 输出格式、选择唤醒方法、是否校验等。例如,设定允许 SCI、正常码输出、8 位数据、 无校验,SCC1 取值应为二进制“01000000” ,程序如下: /设置允许 SCI,正常码输出、8 位数据、无校验 LDA#%01000000 STASCC1 实际上,这种情况只是令 SCC1 的 SCI 允许位(第 6 位)为 1,其它位取默认值。 第三步:写控制字到 SCI 控制寄存器 2(SCC2) 。设置是否允许发送与接收、是中 断接收还是查询接收等。例如,设置允许发送(TE=1) 、允许接收(RE=1) 、查询方式 收发,SCC2 取值应为二进制“00001100” ,程序如下: /设置允许发送、允许接收,查询方式收发 LDA#%00001100 STASCC2 用查询方式,可以不对 SCI 控制寄存器 3(SCC3)初始化,另外几个寄存器供后 面编程使用,不需初始化。 2发送一个数据与接收一个数据 一般情况下,对 SCI 的初始化只在程序的初始化部分进行一次,串行通信的基础 编程是发送与接收数据。发送数据是通过判断状态寄存器 SCS1 的第 7 位(SCTE)进 行的,而接收数据是通过判断状态寄存器 SCS1 的第 5 位(SCRF)进行的。不论是发 送还是接收, 均使用SCI数据寄存器SCDR。 发送时, 将要发送的数据送入SCDR即可, 接收时,从 SCDR 中取出的即是收到的数据。 例如,下面的程序将寄存器 A 中的数从串行引脚 TxD 发送出去。通过对状态寄存 器 SCS1 的第 7 位(SCTE)判断是否可以向数据寄存器 SCDR 送数,若 SCTE=1 可以 送数,否则必须等待。 /串行发送 A 中的数 BRCLR 7,SCS1,./SCS1.7=0? 为 0 则等待 STASCDR/SCS1.7=1,可以发送数据 要以查询方式接收一个数据,首先通过状态寄存器 SCS1 的第 5 位(SCRF)判断 有没有数据可收,若 SCRF=1,则有数据可收,下面程序持续等待串行口(实际上是 RxD 引脚)直到接收到一个数,数据接收后放入寄存器 A 中: /查询方式接收一个串行数据,接收的数据放入寄存器 A 中 BRCLR 5,SCS1,./SCS1.5=0? 为 0 则等待 LDASCDR/SCS1.5=1,可以取出数据 第7章 串行通信接口(SCI) 13 7.5 串行通信通用函数与测试实例 7.5.1 串行通信子函数 1串行通信头文件SCI.h /SCI.h串行通信头文件- #include GP32C.h/GP32 MCU映像寄存器名定义 #include Type.h/类型别名定义 #define ReSendStatusR SCS1/SCI状态寄存器 #define ReTestBit5/接收缓冲区满标志位 #define SendTestBit7/发送缓冲区空标志位 #define ReSendDataRSCDR/数据寄存器 /串行通信函数声明 voidSCIinit(void);/串行口初始化 voidSCIsend1(INT8U o);/发送1字节 voidSCIsendN(INT8U n, INT8U ch);/发送n字节 INT8U SCIre1(INT8U *p);/接收1字节 INT8U SCIreN(INT8U n, INT8U ch);/接收n字节 2串行通信驱动文件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方的串口相连* /-* /头文件 #include SCI.h /SCIinit:串行口初始化-* /功能:对串行口进行初始化,默认为允许SCI,正常码输出,8位数据,无校验,* /允许发送器,允许接收器.查询方式收发,波特率为9600(设fBUS= 2.4576MHz) * /参数:无* /返回:无* /说明:该函数与具体的芯片型号(MC68HC908GP32)有关* 第7章 串行通信接口(SCI) 14 /-* void SCIinit(void) /1.总线频率fBUS= 2.4576MHz,定义波特率Bt = 9600 SCBR = 0b00000010; /2.设置允许SCI,正常码输出,8位数据,无校验 SCC1 = 0b01000000; /3.设置允许发送,允许接收,查询方式收发 SCC2 = 0b00001100; /SCIsend1:串行发送1个字节-* /功能:串行发送1个字节* /参数:要发送的数据* /返回:无* /-* void SCIsend1(INT8U o) /判断ReSendStatusR的第SendTestBit位是否为1,是1可以发送 while (1) if (ReSendStatusR break; /SCIsendN:串行发送N个字节-* /功能:发送数组中的N个字节数据* /参数:待发送数据的字节数及存放这些数据的数组首地址* /返回:无* /内部调用函数:SCIsend1* /-* void SCIsendN(INT8U n, INT8U ch) int i; for(i=0; in; i+) SCIsend1(chi); /SCIre1:串行收一个字节数据-* /功能:从串行口接收1个字节的数据* /参数:标志指针p* /返回:接收到的数据(若接收失败,返回0 xff)* /说明:参数*p带回接收标志.*p = 0,收到数据;*p = 1,未收到数据* /-* INT8U SCIre1(INT8U *p) INT16U k; 第7章 串行通信接口(SCI) 15 INT8Ui; /ReSendStatusR第ReTestBit位为1表示可接收数据 for(k=0; k 0 xfbbb; k+) if (ReSendStatusR *p = 0 x01; return i; /SCIreN:HC08串行接收N个字节-* /功能:接收N个字节数据,并存放在ch数组中* /参数:待接收的数据字节数及其存放的数组首地址* /返回:接收标志 = 0 收到数据, = 1 未收到数据* /内部调用函数:SCIre1* /-* INT8U SCIreN(INT8U n, INT8U ch) int m; INT8U fp; m = 0; while (m n) chm = SCIre1( if (fp = 1) return 1; m+; return 0; 7.5.2查询方式工程文件 1查询方式工程(08C)文件列表 查询方式 08C 工程文件列表见表 7-4。PC 方以 7.5.4 节的串口调试器进行数据的收 发。 第7章 串行通信接口(SCI) 16 表 7-4 查询方式测试工程文件 工程文件名SCI_Pooling.prj 所在路径MC08Ex2007GP32GP32CC02_串行通信查询方式 文件类型文件名功能简述讲解章节 头文件 GP32C.h 芯片头
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 麻醉管理课件
- 二零二五年度净水器租赁与售后服务合同
- 二零二五年绿色建材市场商铺租赁管理标准合同
- 2025年度全国电子化考试中心设备升级服务合同
- 2025年水电安装工程合同违约个人简易合同范本
- 二零二五年度财务共享服务外包合同
- 二零二五年度搬家搬家服务全面保障合同下载
- 二零二五年度灭火器销售与消防安全培训合同
- 二零二五年度高效节能换热站设备采购安装合同
- 二零二五年度跨境电商进口合同范本
- 现代家庭教育方法
- 北京市朝阳区2024-2025学年高一下学期期末语文试题(含答案)
- 牙外伤护理配合课件
- 新高一家长会课件
- 腹部血管超声诊断
- 2025年公务员考试时事政治模拟题附答案详解(模拟题)
- 2025年江苏省事业单位招聘考试教师招聘语文专业知识试卷(中学语文教师)
- 化工工艺培训
- 医学美容技术专业教学标准(高等职业教育专科)2025修订
- 党课课件含讲稿:以作风建设新成效激发干事创业新作为
- 2025数学常考压轴题上册八年级(沪科版)专题13 全等三角形模型之半角模型和边边角模型-解析版
评论
0/150
提交评论