SPI、IIC 和 UART 是最常用的三种串行总线,这三种总线在 s3c2440 中都被集成了。在这
里我们主要介绍 UART,另两个总线在后面的文章中给出。
UART(Universal Asynchronous Receiver/Transmitter,通用异步接收/发送装置)用于异
步通信,可以实现全双工发送和接收。它不仅可以实现不同嵌入式系统之间的通信,还可
以实现与 PC 之间的通信。
s3c2440 提供了三个 UART 端口,它们都可以通过查询、中断和 DMA 方式传输数据,
而且每个 UART 都分别有一个 64 个字节的接收 FIFO 和一个 64 个字节的发送 FIFO。在这
里,我们只给出非 FIFO 模式,即传输数据不利用 FIFO 缓存,一个字节一个字节地传输。
下面我们就给出如何用 s3c2440 来实现非 FIFO 的 UART 通信。要实现某种通信,就必
须遵循该通信协议。UART 的协议包括传输数据的位数,停止位的位数,以及是否进行奇
偶校验,这些设置是利用 ULCONn 寄存器完成的。另一个很重要的地方就是设置波特率。
s3c2440 波特率的 时 钟 源有三个 : PCLK 、 FCLK/n 和 UEXTCLK 。 时钟源的 选 择 是由
UCONn 的第 10 位和第 11 位来完成的。波特率的具体计算公式为:
时钟源频率÷(波特率×16)-1
这个计算结果很可能是小数,把该小数取最接近的整数,放入寄存器 UBRDIVn 中就完成
了波特率的设置。如我们选择波特率的时钟源为 PCLK,它为 50MHz,我们设置的波特率
为 115.2kHz , 通 过 上 式 计 算 的 结 果 为 26.13 , 取 整 后 得 到 26 , 那 么 我 们 把 26 放 入
UBRDIVn 中即可。由于我们没有使用 FIFO 和 MODEM,所以可以不用设置 FIFO 控制寄
存器 UFCONn 和 MODEM 控制寄存器 UMCONn。通过以上寄存器的设置,UART 就可以
正常传输数据。
接收到的数据是放到接收缓存器 URXHn 中,要发送数据时,是把数据放入发送缓存器
UTXHn 中。由于 UART 是通过字节方式传输数据的,因此要区分是大端模式还是小端模式,
也就是说这两个寄存器在这两种模式下,所在的地址是不同。为了了解当前数据传输的各
种状态,还需要一些状态寄存器。传输状态寄存器 UTRSTATn 非常有用,它的第 0 位可以
用来判断接受缓存器内是否有可接收的数据,第 1 位和第 2 位可以用来判断发送缓存器中
是否为空,为空时可以发送数据。由于在这里我们不进行传输数据时错误的判断,因此错
误状态寄存器 UERSTATn 不需要,FIFO 状态寄存器 UFSTATn 和 MODEM 状态寄存器
UMSTATn 在这里也不需要。