基于8250的多机通信设计
实现串行通信的方法很多,例如可以根据通信协议的要求,用编写程序的方法完成串行通信中数据字符的接收和发送,但这种方法比较麻烦;为了快速、简便、有效的实现串行通信,PC系列及其兼容机都可以采用一个可编程异步串行通信接口芯片来执行异步串行通信协议。这种异步通信接口芯片的核心是一个大规模集成通信组件,称为通用异步接收/发送器,或简称UART(Universal Asynchronous Receiver/Transmitter)。
1﹒ 8051实现多机通信原理
8051串行通信相关的三个控制寄存器SCON(Serial Controller)、PCON(Power Controller)和IE(Interrupted Enhanced)分别用于设定四种不同的通信方式及定义波特率。它的串行口工作方式3是可变波特率的9位数据异步通信方式,发送或接收一帧数据为1l 位:1位起始位,8位数据位、1位附加的校验位和1位停止位。其中附加的第9位数据是可编程的,利用这一可控的第9位数据,可以实现多机通信。
2﹒ PC机与8051通信原理
PC机的串行通信适配器,其核心为可编程异步收发器UART8250芯片,8250有10个可寻址寄存器供CPU读/写,以实现与外界的通信,并制定通信协议和提供通信状态信息。
8051单片机的串行通道是一个全双工的串行通信口,既可以实现双机通信,也可以实现多机通信。当串行口工作在方式2或方式3时,若串行控制寄存器SCON的多机通信控制位SM2由软件设置为“1”,则为多机方式;若SM2为“0”,则为9位异步通信方式。
在多机通信时,8051发送的帧格式是11位,其中第9位是SCON中的发送数据位TB8,它是多机通信时发送地址(TB8=1)或发送数据(TB8=0)的标志。串行发送时自动装入串行帧格式的相应位。在接收端,一帧数据的第9位信息被装入SCON的接受数据位RB8中,接收机根据RB8以及SM2的状态确定是否产生串行中断标志,从而可以响应或不响应串行中断,这样就实现了串行中断。
PC机的串行通信由接口芯片8250完成。它是一种通用的异步接受/发送器,是专门为了适用于Intel公司的微处理机的数据通信而设计的。它接受来自CPU的并行数据,然后将其转换为连续的串行数据,通过发送器的移位寄存器发送出去。虽然8250不具备多机通信功能也不能产生TB8或RB8,但可以灵活地使用8250,用软件完成上述功能。8250可以发送多种字长,其中一帧最长为11位,与8250发送的帧格式相比,差别仅在第9位,即PC机的 8250发送的第9位是奇/偶校验位,而不是相应的地址/数据位标志,可以采用软件编程的方法使8250的奇/偶校验位形成正确的地址/数据标志。
3﹒ PC机与8051的多机通信控制
虽然8250本身并不具备8051系列单片机的多机通信功能,但通过软件的办法,可使得8250满足8051单片机通信的要求。
8250的端口地址范围为3F8H~3FEH或2F8H~2FEH。其内部寄存器的端口地址见表1。
表1 8250内部寄存器的端口地址
序号 | 名称 | 端口地址 | 输入/输出形式 |
1 | 数据发送保持寄存器 | 3F8H | 输出 |
2 | 数据接受寄存器 | 3F8H | 输入 |
3 | 波特率因子寄存器(低位) | 3F8H | 输出 |
4 | 波特率因子寄存器(高位) | 3F9H | 输出 |
5 | 中断控制寄存器 | 3F9H | 输出 |
6 | 中断识别寄存器 | 3FAH | 输入 |
7 | 通信线路控制寄存器 | 3FBH | 输出 |
8 | MODEM控制寄存器 | 3FCH | 输出 |
9 | 通信线路状态寄存器 | 3FDH | 输入 |
10 | MODEM状态寄存器 | 3FEH | 输入 |
8250可发送11位数据帧,这11位数据帧由1位起始位、8位数据位、1位奇偶校验位和1位停止位组成,其格式如下:
起始位 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | 奇偶位 | 停止位 |
而8051单片机通信的典型数据格式为:
起始位 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | TB8 | 停止位 |
其中TB8是可编程位,通过使其为0或1而将数据帧和地址帧区别开来。
比较上面两种数据格式可知:它们的数据位长度相同,不同仅在于奇偶校验位和TB8。如果通过软件的方法可以编程8250的奇偶校验位,使得在发送地址时为“1”,发送数据时为“0”,则8250的奇偶校验位完全模拟单片机多机通信的TB8位。方法是把8250的通信线控制寄存器写入特定的控制字。
仔细研究串行卡的通信线控制寄存器3FBH的DS位功能可发现,在串行口初始化时设定3FB的D5=1,D3=1,而在发送地址时设置D4=0,在发送数据时设置D4=1,这样实现了8051中TB8的功能,不必每次都进行调整。这种方法不仅节省了软件开支,而且提高了通信速度。
通过对8250的线路控制寄存器(LCR)的设置,可使8250具有很大的灵活性。要使8250与8051实现多机通信,关键在于控制它的线路状态,使它的数据传输格式与8051保持一致。根据8250线路控制寄存器的结构特点,可以在编程中作如下选择:
若要求8250发送帧的奇偶校验位为1,只需要执行
MOV DX,3FBH
MOV AL,2BH
OUT DX,AL
这三条语句,此时帧格式为:
起始位 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | 1 | 停止位 |
若要求8250的奇偶位为0,只需执行
MOV DX,3FBH
MOV AL,3BH
OUT DX,AL
这三条语句,此时帧格式为:
起始位 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | 0 | 停止位 |
显然,前者可作为多机通信中的地址帧,而后者作为数据帧。
4﹒ PC机非标准波特率的设置
8051单片机系统时钟绝大多数情况下都采用6MHz的石英晶体振荡器,其串行口的波特率是由其内部定时器TH1(8位)决定的,具体计算公式为:
Baud=(fosc﹡2SMOD)/(32﹡12﹡(256-TH1))=(15625﹡2SMOD)/(256-TH1)
式中SMOD可编程控制,TH1的不同值所确定的波特率不同。
如果用BASIC或直接调用ROM BIOS INT14(串行口中断),那么只能设置几种标准的波特率。在这种标准波特率下,8051很难实现,如4800的波特率,对使用6MHz晶振的单片机就无法实现。然而在实际应用中,不大可能只为满足标准波特率要求而选择晶振。另一方面,在保证可靠通信的前提下,总是希望通信速度尽可能的快。所以,可以通过直接对8250的除数锁存器编程,以取得非标准波特率。
假设多机通信波特率计算值为2400,由于单片机无法实现,因此可设计为1953,在单片机上令TH1=248且SMOD=0,而在PC机上令除数等于59,这样便可以实现多机通信。
5﹒ 对8250的编程
仅就8250而言,异步串行通信编程步骤如下:
step1:设定通信的规程,如波特率、奇偶校验方式、数据格式、数据字节长度等;
step2:读取通信线路(或MODEM)的状态,判断是否可以进行通信;
step3:送出(或接收)一个字节;
step4:重复step2和step3直到通信完毕。
当允许中断时,CPU送出(或接收)一个字节后,并不需要不断查询控制器的状态,而可转向执行其他任务。当有中断信号INT4发生并响应后,再按上述step2、step3第三步处理即可。
应用8250进行串行通信时,首先要对其初始化,即设置波特率、通信采用的数据格式、是否使用中断、是否自测试操作等。初始化后,则可采取程序查询方式或中断方式进行通信。
8250的初始化一般分三步:
step1:设置波特率(假设为1200)
MOV AL,80H
MOV DX,3FBH
OUT DX,,AL
MOV AL,60H
MOV DX,3FBH
OUT DX,AL
MOV AL,00H
MOV DX,3F9H
OUT DX,AL
step2:设置通信数据格式(假设7个数据位,1个停止位,偶校验)
MOV AL,1AH
MOV DX,3FBH
OUT DX,AL
step3:设置操作方式
MOV AL,03H
MOV DX,3FCH
OUT DX,AL;不允许中断输出
MOV DX,3FCH
MOV AL,OBH
OUT DX,AL;允许中断输出
MOV AL,13H
MOV DX,3FCH
OUT DX,AL;自测试工作方式
step4:设置中断允许寄存器
MOV AL,00H
MOV DX,3F9H
OUT DX,AL
6﹒ 本文的创新点
本文的创新点在于:第一,利用可编程异步串行通信接口芯片执行异步串行通信协议以实现通信;第二,通过直接对8250的除数锁存器编程的方法,以取得非标准波特率。
参考文献:
[1] 洪家平. WINDOWS环境下PC机与单片机的通信.北京:《微计算机信息》2005年第三期第70~73页
[2] 李朝青.PC机及单片机数据通信技术.北京:北京航空航天大学出版社,2002.12
[3] 姚志江等.一个8051MCU可综合VHDL模型的完整实现.北京:计算机应用,2000(20)
[4] 李广第.单片机基础.北京:北京航空航天大学出版社,2002.12
评论