串行端口地址及寄存器功能详细资料
因为Linux在初始化时间以后就初始化了tty,tty的初始过程包含了串口设备(COM1和COM2)的初始化,为了理解其中内容,我从http://blog.csdn.net/flylonginsky/archive/2005/01/25/267386.aspx转来了相关的说明。关于Linux初始化这部分的分析,我应该在读完这部分内容后一段时间写出来,因为毕竟自己也是在边读代码边学习么。虽然发扬愚公
因为Linux在初始化时间以后就初始化了tty,tty的初始过程包含了串口设备(COM1和COM2)的初始化,为了理解其中内容,我从http://blog.csdn.net/flylonginsky/archive/2005/01/25/267386.aspx转来了相关的说明。关于Linux初始化这部分的分析,我应该在读完这部分内容后一段时间写出来,因为毕竟自己也是在边读代码边学习么。虽然发扬愚公移山的精神,但是什么时候才能写出自己的操作系统啊。唉~~~~~~~~,漫长啊。
下面是转载内容:
PC机上,COM1和COM2的地址是3F8~3FF 及2F8~2FF,在这个范围内的每个地址都有不同的功能,这些功能分别通过寄存器来实现,读写这些寄存器就可以执行与串行端口相关的功能。而所谓的寄存器就是暂时存放信息的地方,这些被存放在此的信息是以位的形式存储,通常以8个位(一个字节)作为一个单位。读写这些寄存器地址的同时,也就是读取这些代表的状态或控制某些功能。
COM1 | COM2 | 寄存器名称 | 简称 |
3F8 | 2F8 | 波特率分频器(低八位) | BDR |
3F9 | 2F9 | 波特率分频器(高八位) | BDR |
3F8 | 2F8 | 传送信息/接收信息寄存器 | DR |
3F9 | 2F9 | 中断启动寄存器 | IER |
3FA | 2FA | 中断辨识寄存器 | IIR |
3FB | 2FB | 传输线控制寄存器 | LCR |
3FC | 2FC | 调制解调器控制寄存器 | MCR |
3FD | 2FD | 传输线状态寄存器 | LSR |
3FE | 2FE | 调制解调器状态寄存器 | MSR |
上表中,3F8,3F9及2F8,2F9分别有两种功能,显然还需要其他寄存器的信号来加以区别。
在串行通信中,这一点是通过使用传输线控制寄存器(LCR)上的第7位来实现的。这个位被称为分频器锁存器存取位(Divistor Latch Access Bit,DLAB),当DLAB为0时,表示读写信息寄存器和中断启动寄存器;当DLAB为1时,表示读写波特率分频器的内容。
以下是各寄存器的说明:
l BDR:设置使用串行通信的传输速度。
串口波特率和数据格式的设置:
首先向LCR(传输线控制寄存器)的高位写入1(即DLAB为1),然后再设置波特率:在基地址和基地址+1的地方写入的数据为1843200/(16*波特率)。然后设置LCR,最后设置Modem控制寄存器和中断允许寄存器。波特率数值=1843200/(16*波特率)(十进制,可转化为十六进制)
outportb(0x3fb,0x80); 对LCR的最高位置‘1',是说明以下为输入波特率因子
outportb(0x3f8,0x0c); //outportb(0x3f8+0,0x0C)输入波特率因子的低8位/9600
outportb(0x3f9,0x00); //outportb(0x3f8+1,0x00) 输入波特率因子的高8位
l DR 先令DLAB为0,再读取3F8就等于读取被传送到COM1的信息。若将信息写入3F8,则信息会被放入传送寄存器中,并被芯片内的移位寄存器一位接着一位地送出去。
l IER 用来启动芯片中的4种中断,该位为1时表示该中断被启动。
Bit0:接收的信息有效中断启动。
Bit1:传送器保持寄存器已空中断启动
Bit2:接收器连接状态中断启动
Bit3:调制解调器状态中断启动
Bit4-Bit7:永远为0
outportb(0x3f9,0x01); //启动中断,接收数据有效
l IIR 通过读取此寄存器可以知道中断的产生是由谁所引发。
Bit0:为0时表示尚有中断未处理;为1时表示无中断。
Bit2 | Bit1 | 中断来源 |
0 | 0 | 调制解调器状态 |
0 | 1 | 传送器保存寄存器空着 |
1 | 0 | 接受信息为有效 |
1 | 1 | 连接控制状态 |
Bit3~Bit7 :永远为0
outportb(0x3fa,0x07); //表示处于连接控制状态
l LCR 此寄存器定义传输信息的格式。各位的意义如下:
Bit0 | Bit1 | 意义 |
0 | 0 | 字符长度为5个位 |
0 | 1 | 字符长度为6个位 |
1 | 0 | 字符长度为7个位 |
1 | 1 | 字符长度为8个位 |
Bit2:终止位。设为0表示使用1个终止位;设为1时有两种情况,字符长度为5时表示1.5个终止位,而字符长度不是5时则表示2个终止位。
Bit3:奇偶校验位启动。设为0时表示无奇偶校验位,设为1时表示使用奇偶校验位。
Bit4:奇偶校验方式选择。设为0时选择奇校验;设为1时选择偶校验。
Bit5:指定奇偶校验位的方式。设为0时表示不限制;设为1时,则选择奇校验时,奇偶校验位为1;选择偶校验时,奇偶校验位为0。
Bit6:终止控制位。设为0时表示正常输出;设为1时则强迫输出0。
Bit7:除法器轩锁位。设为0时表示存取信息寄存器;设为1时表示存取波特率分频器。
outportb(0x3fb,0x80); //对LCR的最高位置‘1',是说明以下代码为输入波特率因子
l MCR 用来控制调制解调器的接口信号。
Bit0:设为1时,DTR脚位为LOW;设为0时,DTR脚位为HIGH。
Bit1:设为1时,DTS脚位为LOW;设为0时,RTS脚位为HIGH
Bit2,Bit3:用于控制芯片上的输出,新型芯片现已不用。
Bit4::设为1时,芯片内部作自我诊断。
其他位永远为0
outportb(0x3fc,0x0b); //见上
l LSR 表示信息传送过程种的各种状态。各位为1时表示该状态成立,为0时不成立
Bit0:数据已接收完毕。(Data Ready)
Bit1:数据溢出错误。(Overrun Error)
Bit2:奇偶校验位错误。(Parity Error)
Bit3:信息框错误。(Framing Error)
Bit4:终止中断。(Break Interrupt)
Bit5:传送器保存寄存器空闲(Transmitter Holding Register Empty)。
Bit6:传送移位寄存器空闲(Transmitter Shift Register Empty)。
Bit7:永远为0
l MSR 此寄存器高4位为调制解调器控制线目前状态;低4位在调制解调器有信号时被设为1,在被读取后会恢复为0。
Bit0:1时表示CTS信号改变
Bit1:1时表示DSR信号改变
Bit2:1时表示RI信号改变
Bit3:1时表示DCD信号改变
Bit4:CTS信号的补码
Bit5:DSR的补码
Bit6:RI信号的补码
Bit7:DCD信号的补码。
更多推荐
所有评论(0)