全部博文(354)
分类: 嵌入式
2010-06-24 07:30:30
U0RBR:接收器缓存寄存器
访问时,先要设定 U0LCR 的除数锁存访问位(DLAB)为 0。因为,U0DLL 与U0RBR/U0THR 在同一地址上。
DLAB = 1 时,选择 U0DLL 和 U0DLM (U0DLM 和 U0IER 在同一个地址上);
DLAB = 0 时,选择 U0RBR/U0THR 和 U0IER。
U0DLL 和 U0DLM:
构成一个 16 位的除数。
VPB时钟(pclk) 是产生波特率的时钟源,波特率时钟源必须是波特率的16倍,于是有:
baud_rate = pclk/(16*设定的除数)
UART0 的中断:
有 4 个中断,分别是:
RBR 中断; THRE 中断; Rx 线中断;
其中 RBR 中断里面包含有2个中断:数据可用RDA中断 和 接收超时 CTI 中断。
FAQ一:
1、什么是 RDA 中断?
当接收的有效数据到达 接收FIFO设置寄存器(U0FCR) 中设置的触发点时,RDA中断被激活。
U0FCR[7:6]=00 触发点 0(1字节); U0FCR[7:6]=01 触发点 1(4字节);
U0FCR[7:6]=01 触发点 2(8字节);U0FCR[7:6]=01 触发点 1(14字节);
发生中断后,U0IIR[3:0] 内容为:0100。
如果发生中断后,读一下 U0RAR 寄存器,那么就会得到最早到达的数据。这时,FIFO 中的有效数据小于预定触发点,清零 RDA 中断。
该中断的优先级为 2 。
2、什么是 CTI 中断?
在接收 FIFO 中,有效的数据少于触发个数时,但至少有一个时,如果长时间没有数据到达,将触发 CTI 中断。这里所说的“长时间”是指在 接收 3.5~4.5 个字节所需要的时间。发生中断,则U0IIR[3:0] 内容为:1100。在中断后,若从 U0RBR 中读取接收FIFO中的数据,或者有新的数据送入接收FIFO中,这都将清零 CTI 中断。
该中断的优先级为 2。
3、什么是 THRE 中断?
THRE中断是发送中断。发生 THRE 中断的前提条件是FIFO 必须为空。
假设刚刚发生了一次 THRE 中断,也就是说这时 FIFO 中为空。那么现在往 FIFO 中写入 1 个字节的数据,因为FIFO本来是空的,那这个字节的数据就会被直接写到移位寄存器 U0TSR中,这时 FIFO 肯定又是空的。此后,如果在发送完之前那个字节和停止位后,若还没有数据进来,就会触发 THRE 中断了。那为什么要等这段时间呢?因为如果立即产生中断,而同时又有数据要进来,则中断就会打断数据的传送。
假设,原本 FIFO 中已经有2个或2个以上的数据,那么FIFO送出这两个数据后就空掉了,那就会立即触发中断。
当 THRE 中断为当前有效的最高优先级中断时,往 U0THR 写数据,或者对 U0IIR 的读操作,将使 HTRE中断复位。
在U0IIR 中,THRE的中断代码为:0110。
该中断的优先级为 3 。
4、什么是 RLS 中断。
RLS中断优先级最高。它发生在 UART0 产生了四个错误中的任何一个时。这四个错误是:
溢出错误(OE)、 奇偶错误(PE)、 帧错误(FE)、间隔中断(BI)
发生RLS中断时,通过查看 线状态寄存器 U0LSR[4:1] 就可以知道是由于那个错误触发了 RLS 中断。读取 U0LSR 时清除该中断。
FAQ二:
1、什么是 OE 溢出?
接收时,在 U0RBR 寄存器中已经有新的字符就绪,而此时接收 FIFO 正好满了,就产生了溢出。这时 U0LSR[1]
= 1,另触发 RLS 中断。
2、什么是奇偶错误?
奇偶校验错误是在使能奇偶校验之后,对所有接收的数据都进行奇偶校验,如果与 线状态控制器U0LCR 中的设置不符,将引起奇偶校验错误。(数据位+校验位)
U0LCR[3] = 1 使能奇偶产生和校验;0,则禁止。
U0LCR[5:4] = 00 奇数校验; U0LCR[5:4] = 01 偶数校验; U0LCR[5:4] = 10 强制为 1;
U0LCR[5:4] = 11 强制为0。
强制为1或强制为0的意思就是强制校验必为奇或必为偶。
3、什么是帧错误?
当接收字符的停止位为 0 时,产生帧错误
4、什么是间隔错误?
在发送数据时,如果RXD0引脚保持低电平,将产生间隔中断。发生间隔中断后,接收模块停止数据接收。