一般情况下,IBM PC兼容机的串口使用的异步串行通信芯片是INS 8250或NS16450兼容芯片,统称为UART(通用异步接收发送器)。对UART的编程实际上是对其内部寄存器执行读写操作。因此可将UART看作一组寄存器集合,包含发送、接收和控制三部分。UART内部有10个寄存器,供CPU通过IN/OUT指令对其进行访问。
这些寄存器的端口和用途见表10-1。其中端口0x3F8-0x3FE用于PC上COM1串行口,0x2F8-0x2FE对应COM2端口。DLAB(Divisor Latch Access Bit)是除数锁存访问位,是指线路控制寄存器的位7。
表10-1给出了PC上串行通信接口的访问端口地址,以及对应的寄存器bit位的含义。
表10-1 寄存器bit位的含义
下面简要介绍表中比较重要的几个寄存器比特。
(1)DLAB:除数锁存访问位,设置为1的时候,用于设置波特率因子。设置为0的时候,用于设置或读取其他寄存器的值。也可以理解为一个标志位,用于对前两个寄存器(0x3F8/0x2F8、0x3F9/0x2F9)的用途进行区别。若为1,则这两个寄存器为波特率因子,否则这两个寄存器被用于发送/接收保持(缓存)寄存器和中断控制寄存器。
(2)中断允许寄存器:用端口地址0x3F9/0x2F9进行访问,用于设置或读取COM端口的中断控制比特。该寄存器的0~3比特用于控制特定的中断源的状态,4~7比特保留(为0)。其中,0~3比特中,一个比特对应一个特定的中断源,若设置该比特为1,则对应的中断源会打开,这样一旦有对应的事件发生,COM接口的控制芯片就会通过IRQ4(对于COM1)或IRQ3(对于COM2)中断输入引脚,给CPU发出中断请求。相反,若设置为0,则对应的中断源会被屏蔽。这样即使对应的事件发生,串行通信控制器也不会引发中断请求。这个时候,就需要程序自行读取相应的寄存器,来判断发生的事件及其信息。
(3)中断标识寄存器(0x3FA/0x2FA地址):一旦发生中断,软件可通过读取这个寄存器的值,来判断中断的类型。需要注意的是,该寄存器的最后一个比特,说明是否有中断发生。因为在系统设计的时候,串行接口有可能与其他系统模块共用一个中断输入(比如,都采用IRQ4),这样在发生中断的时候,可通过该比特来判断中断是不是串行接口发生的。若是,则进行处理,否则把处理过程转让给其他设备的中断处理程序。Hello China的设计支持这种中断共用的模型。(www.xing528.com)
(4)线路控制寄存器:该寄存器用于控制串行接口的工作模式。比如,在Windows操作系统提供的超级终端(HYPERTRM.EXE程序)程序中,可通过图10-8所示对话框设置COM接口的工作属性,实际上内部就是通过修改线路控制寄存器来实现的(每秒位数除外,该属性是通过修改波特率因子寄存器实现的)。
图10-8 超级终端中串口通信参数的设置
(5)波特率因子:用于确定串口工作的波特率,该因子越大,实际的工作速率越小。一般情况下,按照表10-2来设置串口的波特率因子。
表10-2 波特率与波特率因子之间的对应关系
需要注意的是,波特率因子是16位的,通过设置3F9/2F9和3F8/2F8两个寄存器来完成。在设置前,首先应该设置DLAB比特为1,这样在访问上述地址的寄存器时,才会访问到波特率因子寄存器。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。