📄 interfacing the serial - rs-232 port part1-2.htm
字号:
printf("Address assigned to COM%d is %Xh\n",a+1,address);
*ptraddr++;
}
}
</PRE></UL>
<P><A name=13><FONT size=+1>Table of Registers</FONT><BR>
<HR>
</A>
<P></P>
<P>
<CENTER>
<TABLE border=1>
<TBODY>
<TR>
<TD>
<CENTER><B>Base Address</B></CENTER></TD>
<TD>
<CENTER><B>DLAB</B></CENTER></TD>
<TD>
<CENTER><B>Read/Write</B></CENTER></TD>
<TD>
<CENTER><B>Abr. </B></CENTER></TD>
<TD>
<CENTER><B>Register Name </B></CENTER></TD></TR>
<TR>
<TD rowSpan=3>
<CENTER>+ 0</CENTER></TD>
<TD>
<CENTER>=0</CENTER></TD>
<TD>
<CENTER>Write</CENTER></TD>
<TD>
<CENTER>- </CENTER></TD>
<TD>
<CENTER>Transmitter Holding Buffer </CENTER></TD></TR>
<TR>
<TD>
<CENTER>=0</CENTER></TD>
<TD>
<CENTER>Read</CENTER></TD>
<TD>
<CENTER>- </CENTER></TD>
<TD>
<CENTER>Receiver Buffer </CENTER></TD></TR>
<TR>
<TD>
<CENTER>=1</CENTER></TD>
<TD>
<CENTER>Read/Write</CENTER></TD>
<TD>
<CENTER>- </CENTER></TD>
<TD>
<CENTER>Divisor Latch Low Byte </CENTER></TD></TR>
<TR>
<TD rowSpan=2>
<CENTER>+ 1</CENTER></TD>
<TD>
<CENTER>=0</CENTER></TD>
<TD>
<CENTER>Read/Write</CENTER></TD>
<TD>
<CENTER>IER </CENTER></TD>
<TD>
<CENTER>Interrupt Enable Register </CENTER></TD></TR>
<TR>
<TD>
<CENTER>=1</CENTER></TD>
<TD>
<CENTER>Read/Write</CENTER></TD>
<TD>
<CENTER>- </CENTER></TD>
<TD>
<CENTER>Divisor Latch High Byte </CENTER></TD></TR>
<TR>
<TD rowSpan=2>
<CENTER>+ 2</CENTER></TD>
<TD>
<CENTER>-</CENTER></TD>
<TD>
<CENTER>Read</CENTER></TD>
<TD>
<CENTER>IIR </CENTER></TD>
<TD>
<CENTER>Interrupt Identification Register</CENTER></TD></TR>
<TR>
<TD>
<CENTER>-</CENTER></TD>
<TD>
<CENTER>Write</CENTER></TD>
<TD>
<CENTER>FCR </CENTER></TD>
<TD>
<CENTER>FIFO Control Register </CENTER></TD></TR>
<TR>
<TD>
<CENTER>+ 3</CENTER></TD>
<TD>
<CENTER>-</CENTER></TD>
<TD>
<CENTER>Read/Write</CENTER></TD>
<TD>
<CENTER>LCR </CENTER></TD>
<TD>
<CENTER>Line Control Register </CENTER></TD></TR>
<TR>
<TD>
<CENTER>+ 4</CENTER></TD>
<TD>
<CENTER>-</CENTER></TD>
<TD>
<CENTER>Read/Write</CENTER></TD>
<TD>
<CENTER>MCR </CENTER></TD>
<TD>
<CENTER>Modem Control Register </CENTER></TD></TR>
<TR>
<TD>
<CENTER>+ 5</CENTER></TD>
<TD>
<CENTER>-</CENTER></TD>
<TD>
<CENTER>Read</CENTER></TD>
<TD>
<CENTER>LSR </CENTER></TD>
<TD>
<CENTER>Line Status Register </CENTER></TD></TR>
<TR>
<TD>
<CENTER>+ 6</CENTER></TD>
<TD>
<CENTER>-</CENTER></TD>
<TD>
<CENTER>Read</CENTER></TD>
<TD>
<CENTER>MSR </CENTER></TD>
<TD>
<CENTER>Modem Status Register </CENTER></TD></TR>
<TR>
<TD>
<CENTER>+ 7</CENTER></TD>
<TD>
<CENTER>-</CENTER></TD>
<TD>
<CENTER>Read/Write</CENTER></TD>
<TD>
<CENTER>- </CENTER></TD>
<TD>
<CENTER>Scratch Register </CENTER></TD></TR></TBODY></TABLE><FONT
size=-1>
<CENTER>Table 5 : Table of Registers</CENTER></FONT></CENTER>
<P></P>
<P><A name=14><FONT size=+1>DLAB ?</FONT><BR>
<HR>
</A>
<P></P>
<P>You will have noticed in the table of registers that there is a DLAB
column. When DLAB is set to '0' or '1' some of the registers change.
This is how the UART is able to have 12 registers (including the scratch
register) through only 8 port addresses. DLAB stands for Divisor Latch
Access Bit. When DLAB is set to '1' via the line control register, two
registers become available from which you can set your speed of
communications measured in bits per second.</P>
<P>The UART will have a crystal which should oscillate around 1.8432
MHZ. The UART incorporates a divide by 16 counter which simply divides
the incoming clock signal by 16. Assuming we had the 1.8432 MHZ clock
signal, that would leave us with a maximum, 115,200 hertz signal making
the UART capable of transmitting and receiving at 115,200 Bits Per
Second (BPS). That would be fine for some of the faster modems and
devices which can handle that speed, but others just wouldn't
communicate at all. Therefore the UART is fitted with a Programmable
Baud Rate Generator which is controlled by two registers.</P>
<P>Lets say for example we only wanted to communicate at 2400 BPS. We
worked out that we would have to divide 115,200 by 48 to get a workable
2400 Hertz Clock. The "Divisor", in this case 48, is stored in the two
registers controlled by the "Divisor Latch Access Bit". This divisor can
be any number which can be stored in 16 bits (ie 0 to 65535). The UART
only has a 8 bit data bus, thus this is where the two registers are
used. The first register (Base + 0) when DLAB = 1 stores the "Divisor
latch low byte" where as the second register (base + 1 when DLAB = 1)
stores the "Divisor latch high byte."</P>
<P>Below is a table of some more common speeds and their divisor latch
high bytes & low bytes. Note that all the divisors are shown in
Hexadecimal.</P>
<P>
<CENTER>
<TABLE border=1>
<TBODY>
<TR>
<TD>
<CENTER><B>Speed (BPS) </B></CENTER></TD>
<TD>
<CENTER><B>Divisor (Dec) </B></CENTER></TD>
<TD>
<CENTER><B>Divisor Latch High Byte </B></CENTER></TD>
<TD>
<CENTER><B>Divisor Latch Low Byte </B></CENTER></TD></TR>
<TR>
<TD>
<CENTER>50 </CENTER></TD>
<TD>
<CENTER>2304 </CENTER></TD>
<TD>
<CENTER>09h </CENTER></TD>
<TD>
<CENTER>00h </CENTER></TD></TR>
<TR>
<TD>
<CENTER>300 </CENTER></TD>
<TD>
<CENTER>384 </CENTER></TD>
<TD>
<CENTER>01h </CENTER></TD>
<TD>
<CENTER>80h </CENTER></TD></TR>
<TR>
<TD>
<CENTER>600 </CENTER></TD>
<TD>
<CENTER>192 </CENTER></TD>
<TD>
<CENTER>00h </CENTER></TD>
<TD>
<CENTER>C0h </CENTER></TD></TR>
<TR>
<TD>
<CENTER>2400 </CENTER></TD>
<TD>
<CENTER>48 </CENTER></TD>
<TD>
<CENTER>00h </CENTER></TD>
<TD>
<CENTER>30h </CENTER></TD></TR>
<TR>
<TD>
<CENTER>4800 </CENTER></TD>
<TD>
<CENTER>24 </CENTER></TD>
<TD>
<CENTER>00h </CENTER></TD>
<TD>
<CENTER>18h </CENTER></TD></TR>
<TR>
<TD>
<CENTER>9600 </CENTER></TD>
<TD>
<CENTER>12 </CENTER></TD>
<TD>
<CENTER>00h </CENTER></TD>
<TD>
<CENTER>0Ch </CENTER></TD></TR>
<TR>
<TD>
<CENTER>19200 </CENTER></TD>
<TD>
<CENTER>6 </CENTER></TD>
<TD>
<CENTER>00h </CENTER></TD>
<TD>
<CENTER>06h </CENTER></TD></TR>
<TR>
<TD>
<CENTER>38400 </CENTER></TD>
<TD>
<CENTER>3 </CENTER></TD>
<TD>
<CENTER>00h </CENTER></TD>
<TD>
<CENTER>03h </CENTER></TD></TR>
<TR>
<TD>
<CENTER>57600 </CENTER></TD>
<TD>
<CENTER>2 </CENTER></TD>
<TD>
<CENTER>00h </CENTER></TD>
<TD>
<CENTER>02h </CENTER></TD></TR>
<TR>
<TD>
<CENTER>115200 </CENTER></TD>
<TD>
<CENTER>1 </CENTER></TD>
<TD>
<CENTER>00h </CENTER></TD>
<TD>
<CENTER>01h </CENTER></TD></TR></TBODY></TABLE><FONT size=-1>Table 6 :
Table of Commonly Used Baudrate Divisors</FONT> </CENTER>
<P></P>
<P><A name=15></A><FONT size=+1>Interrupt Enable Register
(IER)</FONT></I><BR>
<HR>
<P></P>
<P>
<CENTER>
<TABLE border=1 width="80%">
<TBODY>
<TR>
<TD>
<CENTER><B>Bit</B></CENTER></TD>
<TD>
<CENTER><B>Notes</B></CENTER></TD></TR>
<TR>
<TD>
<CENTER>Bit 7</CENTER></TD>
<TD>Reserved</TD></TR>
<TR>
<TD>
<CENTER>Bit 6</CENTER></TD>
<TD>Reserved</TD></TR>
<TR>
<TD>
<CENTER>Bit 5</CENTER></TD>
<TD>Enables Low Power Mode (16750)</TD></TR>
<TR>
<TD>
<CENTER>Bit 4</CENTER></TD>
<TD>Enables Sleep Mode (16750)</TD></TR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -