您的位置:首页 > 其它

UART 调用流程分析小结

2014-11-26 17:51 337 查看
1, serial_in ------ 用于读取UART的寄存器值;

2,serial_out ------ 用于写入UART的寄存器值

serial_out(struct uart_rk_port *up, int offset, unsigned char value)

2.serial_rk_tx_empty ---------- 用于判断发送缓冲区是否为空

RK---Serial 的串口驱动流程:
发送一个字符的函数调用流程:

serial_rk_pm ------------ enable: 使能串口 pclk clk等时钟
|
|
serial_rk_startup --------- 启动串口做一些初始化设置:申请中断,再次使能时钟,清空FIFO buffer; 初始化UART;设置DMA传输的tx_buffer
|
|

serial_rk_set_termios ------- 设置 波特率和 应用设置的参数 同时设置了 serial_rk_start_rx_dma中设置收数据的DMA
|
|
serial_rk_start_tx -------------开始发送数据
|
|
serial_rk_enable_ier_thri -------- 使能UART_IER寄存器中的:Enable Transmitter holding register int 使能传输

|
|
serial_rk_handle_port --------- 处理 port 中断,在中断处理函数中 //iir = 0xC2 ---- fifo enable && 0010-- THR empry,一旦THR Empty检测到该中断时,启用中断处理函数
|
|
判断up->iir 是否 THR empty 也就是 ,然后再调用transmit_chars

|
|
判断 __stop_tx ------------ 判断传输结束
|
|
中断处理结束
-------------- serial_rk_tx_empty ------判断是否传输为空:serial_rk_tx_empty

UART寄存器分析:
1, UART_THR : Transmit Holding Register ---------- 这个就是串口控制器的发送数据寄存器,从CPU搬运到UART控制器,一旦数据运送到这里,数据就会通过TX发送出去
注意1): 由于UART_THR 的寄存器,数据必须在其为空时才能写进去,不然之前存在的数据就会被覆盖掉,造成数据丢失;
而判断的标记就是 The THR Empty(THRE) (LSR[5])bit
2): 则是UART寄存器的数据寄存器的长度,一次能发送的数据长度:在FIFO没有满之前,都可以写入X个字,如果满了,再写入也会导致数据丢失

2, UART_IER : Interrupt Enable Register ----- UART 中断使能寄存器:其中第二位为 使能THR也就是发送寄存器为空时会发一个中断产生;

3, UART_IIR : Interrupt Identification Register ------ UART 中断识别寄存器,也可以叫做UART中断状态寄存器,可以通过读取该寄存器的值,判断是哪个产生的中断:
0010 ----- THR empty 寄存器;

4, UART_FCR : FIFO Control Register ----- UART FIFO 控制寄存器:有字段TX empty Trigger 用于设置产生TX empty的条件: 00 ---- FIFO empty;11 ---- 一半 FIFO 满的情况为中断产生条件;

5,UART_LSR : Line Status Register ----- 传输线状态寄存器:获取transmit的一些数据为空的状态;

结合上述寄存器,我们可以得到下面的一些流程:
发送数据的过程: apk 调用OutputStream write() 函数 ----- > 会调用到启动串口传输 serial_rk_pm 打开串口传输的时钟-----> serial_rk_startup
设置串口的参数,申请中断等-----> serial_rk_set_termios 设置双方通讯需要的参数 ------> serial_rk_start_tx 准备启动,然后就打开UART_IER寄存器,在使能了该寄存器后;---->等到串口发送寄存器是否为空的中断,若该中断来临,则进一步判断是否为THR
empty产生的,如果是,就准备搬运数据到 UART_THR 。 ------ 而串口控制器在等待UART_THR发到串口线上后,若为空,再次产生中断,继续上述的搬运。----------- 判断是否数据缓冲区为空或者------ 则停止传输_stop_tx -----> 中断处理结束后,再恢复serial_rk_tx_empty
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: