Model |
FIFO Depth |
Max Kbps |
Made by |
DataSheet PDF |
Notes |
8250 |
0 |
19.2 |
National |
|
|
82C50A |
0 |
625 |
Harris |
|
|
PC16550D |
16 |
128 |
National |
|
|
NS16C552 |
16 |
128 |
National |
Dual UART |
|
TL16C450 |
0 |
50 |
Texas InStr |
|
|
TL16C550 |
16 |
1000 |
Texas Instr |
Autoflow modes |
|
TL16C750 |
64 |
1000 |
Texas InStr |
Autoflow modes |
|
TL16PC564A |
64 |
115.2 |
Texas InStr |
|
AutoFlow, PCMCIA Interface |
ST16C650 |
32 |
460.8 |
Startech (Exar) |
|
|
OX16C954 |
128 |
50,000 |
Oxford |
Quad UART |
|
OX16C950 Rev B |
128 |
15,000 |
Oxford |
Programmable 450…950 |
|
OX16C954B |
128 |
60,000 |
Oxford |
Quad, Multi-mode (incl. 650,750,850) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
About UART FIFOs and Greenleaf ViewComm Async II |
What is a UART? |
The Humble 8250 UART |
|
What is a FIFO? |
|
What good is a FIFO anyway? |
|
What does a UART look like to software? |
|
Enter ViewComm, Stage Left
|
|
ViewComm needs to see “Everything” every time any one or more of these events occurs. This is done by the replacement of the standard Microsoft Windows serial driver with a special driver that replaces the software logic that gets executed when any hardware interrupt occurs on a port–the Interruptand Service Routine (ISR) is executed. (Don’t confuse this ISR with the Interrupt Status Register, which is a hardware register in some UARTs that holds status of the FIFO. |
|
instead of attending only to the functionality represented by the reason for the IRQ, the ViewComm driver attends to ALL of the functions. If a received character is available, the driver grabs it; if there’s an empty transmit buffer (or FIFO), the driver asks the processor to transfer enough data to fill the transmitter pipeline. Modem and Line status bytes are grabbed, and a 64-bit timestamp is appended to the information transferred.
|
|
In this manner, we can be assured that every time anything that can ask the CPU for help (an IRQ is raised), everything is kept synchronized as closely in time as possible; the UART can, in fact, reach a full Receive buffer and an Empty transmit buffer, several kinds of errors, and some modem control or status lines may change–all at once. |
|
How Wide is the FIFO? |
Some UART devices have 11 bit wide FIFOs, so that you can store 8 data bits plus some status bits for each position in the FIFO. This argues against using “no FIFO” which is the way ViewComm worked a few years ago. But “no FIFO” (which means a depth of 1 including the receive data register) means more interrupts per unit time together with more processing done each UART interrupt, so in a sense, the situation becomes worse, not better. The strategy (using FIFOs) of reducing interrupts per unit time has boomeranged and the hoped for improvement is further counteracted by the loss of information stored with each interrupt occurence. |
Er…Loss of information… |
|
Notes about Baud Rate |
What is a baud? In 1870, Emile Baudot invented a 5-bit “folded” code for telegraphy. By “folded” I mean one “escape” code was reserved to switch between alphabetic and numeric / special characters. Greenleaf ViewComm II can interpret Baudot code set. For efficiency, it is usually sent at 5 data bits and 1 1/2 stop bits. Baud rate is an often ill-understood term, mistaken to mean number of characters per second. That is false. Baud rate means bits per second. 115 Kbaud means 115,000 bits per second, or as it is usually expressed, 115 Kbps. |
A good deal of async communications takes place at 8 bits per character (word length), no parity, 1 stop bit. To this you add one start bit and you end up with ten bits per character on the line. Although asynchronous truly means you can have an indeterminate / unspecified delay (space) between adjacent characters on the line, there is rarely a need for such space and so we can speak of actual data rate as being the same as baud rate divided by total bits per character. Note–often a “character” is called a symbol. |
|
In (all or very Close to all) UARTs, two 8-bit registers are linked together logically to form one 16-bit divisor. This divisor is written to the registers and is used to divide into the clock rate to get baud rate. Baud rate * divisor = clock rate. There is no logical restriction or rule about what 16-bit number you can use as divisor. |
|
For pragmatic reasons, certain baud rates became “standard” or “accepted” in the industry. As an example, an early UART that is in use in a great many computers today is the T.I. 16550C (revision C). An urban myth is that the upper limit of baud rate for the 16550 on your laptop is 115,200. Actually, whatever else, the baud rate * 16 is the required internal clock frequency (16 clocks per bit). The T.I. datasheet for the 16550C indicates a nominal clock rate of 1.8432 Mhz. If you divide this by 16 you get 115,200. Since the clock is divided internally by 16 in addition to being divided by the content of the divisor in the aforementioned registers, the divisor would be 1 to attain 115.2 Kbps. |
|
Another erstwhile myth is that you can “only get” the standard set of baud rates, e.g. 300,600,1200,…56000,115200. Earlier we noted that the divisor can be anything. Let’s say we want to use 48,216 baud. Divide 18432 / 48216 = 382279.7 then divide again by 16, we get 23892. The question now is: How close is this to a binary number represented by 16 bits? Try Hex 5d54 — that’s exact, and all you have to do is give up the silly idea about multiples of 600 or whatever. |
|
Another way (it depends upon how much you want to spend) is to use an external clock and adjust the frequency so that it is an exact multiple of 48216. To do your math for you, a clock at 6.17165 Mhz divided by 16 and then the baud rate gives you a divisor of 8. There are other combinations, and the point is that Greenleaf ViewComm uses Windows ComboBox elements for baud rate selection–meaning you can type in your desired rate (and the system will get as close as possible given the a-priori rule that the divisor nust be a 16-bit binary number. We’ve noted this twice so may as well say it: You could get better accuracy, get closer to your desired baud rate if you could use a larger divisor (say 24 or 32 bits). |
|
The actual numbers you will have to work with are dependent upon the clock frequency. Check with the manufacturer of add-on cards to find out the clock frequency. Or just experiment. But know that there are few absolutes in serial communications. And that you can work out “non-standard” baud rates in at least two manners. |
|
Summarizing…and what’s up next? |
The revision C 16550 UART can run at up to 1 Mbps, so there goes another myth. Thing is, nobody needs it to drive a modem anymore and you have to really watch the cable length. There is a tradeoff that is not a myth except in the negative sense that not everyone seems to recognize it. |