侵权投诉
搜索
更多>> 热门搜索:
订阅
纠错
加入自媒体

UART的原理以及驱动程序如何编写?

2020-12-30 15:21
一口Linux
关注

每个UART包含一个波特率产生器,发送器,接收器和一个控制单元,如上图所示:

发送数据CPU 先将数据写入发送FIFO 中,然后 UART 会自动将FIFO 中的数据复制到“发送移位器” (Transmit Shifter )中,发送移位器将数据一位一位地发送到 TxDn 数据线上 (根据设定的格式,插入开始位 、校验和停止)。接收数据“移位器” (Receive Shifter )将 RxDn 数据线上的数据一位一位的接收进来,然后复制到FIFO 中, CPU即可从中读取数据。

UART是以异步方式实现通信的,其采样速度由波特率决定,波特率产生器的工作频率可以由PCLK(外围设备频率),FCLK/n(CPU工作频率的分频),UEXTCLK(外部输入时钟)三个时钟作为输入频率,波特率设置寄存器是可编程的,用户可以设置其波特率决定发送和接收的频率。

发送器和接收器包含了64Byte的FIFO和数据移位器。UART通信是面向字节流的,待发送数据写到FIFO之后,被拷贝到数据移位器(1字节大小)里,数据通过发送数据管脚TXDn发出。

同样道理,接收数据通过RXDn管脚来接收数据(1字节大小)到接收移位器,然后将其拷贝到FIFO接收缓冲区里。

(1)数据发送发送的数据帧可编程的,它的一个帧长度是用户指定的,它包括一个开始位,5~8个数据位,一个可选的奇偶校验位和1~2个停止位,数据帧格式可以通过设置ULCONn寄存器来设置。发送器也可以产生一个终止信号,它是由一个全部为0的数据帧组成。在当前发送数据被完全传输完以后,该模块发送一个终止信号。在终止信号发送后,它可以继续通过FIFO(FIFO)或发送保持寄存器(NON-FIFO)发送数据。

(2)数据接收同样接收端的数据也是可编程的,接收器可以侦测到溢出错误奇偶校验错误,帧错误和终止条件,每个错误都可以设置一个错误标志。? 溢出错误    :在旧数据被读取到之前,新数据覆盖了旧数据? 奇偶校验错误:接收器侦测到了接收数据校验结果失败,接收数据无效? 帧错误      :接收到的数据没有一个有效的停止位,无法判定数据帧结束?  终止条件    :RxDn接收到保持逻辑0状态持续长于一个数据帧的传输时间

(3)自动流控AFC(Auto Float Control)UART0和UART1支持有nRTS和nCTS的自动流控。在AFC情况下,通信双方nRTS和nCTS管脚分别连接对方的nCTS和nRTS管脚。通过软件控制数据帧的发送和接收。在开启AFC时,发送端接收发送前要判断nCTS信号状态,当接收到nCTS激活信号时,发送数据帧。该nCTS管脚连接对方nRTS管脚。接收端在准备接收数据帧前,其接收器FIFO有大于32个字节的空闲空间,nRTS管脚会发送激活信号,当其接收FIFO小于32个字节的空闲空间,nRTS必须置非激活状态。

3)选择时钟源

Exynos4412 UART的时钟源有八种选择:XXTI 、XusbXTI 、SCLK_HDMI24M 、SCLK_USBPHY0 、 SCLK_HDMIPHY 、SCLKMPLL_USER_T 、SCLKEPLL 、SCLKVPLL ,由 CLK_SRC_PERIL0 寄存器控制。

选择好时钟源后,还可以通过 DIVUART0 ~4设置分频系数,由 CLK_DIV_PERIL0 寄存器控制。从分频器得到的时钟被称为SCLK UART 。

SCLK UART 经过上图中的“ UCLK Generator”后,得到UCLK ,它的频率就是UART 的波特率。“ Generator UCLK Generator ”通过这 2个寄存器来设置:UBRDIVn(UART BAUD RATE DIVISOR) 、UFRACVALn 。

4)UART配置寄存器

ULCONn

bite [6]  红外模式选择串口0是否使用红外模式:0 = 正常通信模式1 = 红外通信模式

bite [5:3]  校验模式设置串口0在数据接收和发送时采用的校验方式:0xx = 无校验100 = 奇校验101 = 偶校验110 = 强制校验/检测是否为1111 = 强制校验/检测是否为0

[2] 停止位设置串口0停止位数:0 = 每个数据帧一个停止位1 = 每个数据帧二个停止位

[1:0] 数据位设置串口0数据位数:00 = 5个数据位  01 = 6个数据位10 = 7个数据位  11 = 8个数据位

该寄存器我们通用的配置是:

ULCON2 = 0x3; //Normal mode, No parity,One stop bit,8 data bits
UCONn

[15:12] FCLK分频因子 当UART0选择FCLK作为时钟源时,设置其FCLK的分频因子UART0 工作时钟频率 = FCLK/ FCLK分频因子 + 6

[11:10] UART时钟源选择选择UART0的工作时钟PCLK,UEXTCLK,FCLK/n:00,10 = PCLK01 = UEXTCLK11 = FCLK/n当选择FCLK/n作为UART0工作时钟时还要做其它设置,具体请读者自行查看硬件手册

[9] 发送数据中断产生类型设置UART0中断请求类型,在非FIFO传输模式下,一旦发送数据缓冲区为空,立即产生中断信号,在FIFO传输模式下达到发送数据触发条件时立即产生中断信号:0 = 脉冲触发1 = 电平触发

[8] 接收数据中断产生类型设置UART0中断请求类型,在非FIFO传输模式下,一旦接收到数据,立即产生中断信号,在FIFO传输模式下达到接收数据触发条件时立即产生中断信号:0 = 脉冲触发1 = 电平触发

[7] 接收数据超时设置当接收数据时,如果数据超时,是否产生接收中断:0 = 不开启超时中断  1 = 开启超时中断10 = 7个数据位  11 = 8个数据位

[6] 接收数据错误中断设置当接收数据时,如果产生异常,如传输中止,帧错误,校验错误时,是否产生接收状态中断信号:0 = 不产生错误状态中断  1 = 产生错误状态中断

[5] 回送模式设置该位时UART会进入回送模式,该模式仅用于测试0 = 正常模式  1 = 回送模式

[4] 发送终止信号设置该位时,UART会发送一个帧长度的终止信号,发送完毕后,该位自动恢复为00 = 正常传输  1 = 发送终止信号

[3:2] 发送模式设置采用哪个方式执行数据写入发送缓冲区00 = 无效01 = 中断请求或查询模式10 = DMA0请求

[1:0] 接收模式设置采用哪个方式执行数据写入接收缓冲区00 = 无效01 = 中断请求或查询模式10 = DMA0请求

<上一页  1  2  3  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

工控 猎头职位 更多
文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号