以下内容源于 朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
参考博客
s5pv210——串口通信 - biaohc - 博客园
一、S5PV210的串口控制器
S5PV210的串口控制器的相关内容,在用户手册的section8.1章节。
(1)串口控制器包含transmitter模块和receiver模块,两部分功能彼此独立。transmitter模块负责向外部发送信息,receiver模块负责从外部接收信息到210内部。
(2)串口控制器是接在APB总线上的。
(3)transmitter模块由发送缓冲区和发送移位器构成。主板需要发送信息时,首先将信息进行编码形成二进制流,然后将一帧数据写入发送缓冲区,发送移位器会自动从发送缓冲区中读取一帧数据,然后自动移位(移位的目的是将一帧数据的各个位分别拿出来)将其发送到Tx通信线上。我们编程的时候,初始化串口之后,只需要将数据写入缓冲区即可,硬件会自动完成发送过程。
(4)receiver模块由接收缓冲区和接收移位器构成。当通过串口线向主板发送信息时,信息通过Rx通信线进入接收移位器,然后接收移位器自动移位将该二进制位存入接收缓冲区。当接收完一帧数据,receiver模块会产生一个中断 给CPU,CPU接收到中断后得知receiver模块已经接收一帧数据,于是去读取这帧数据。
(5)串口底层的工作(比如怎么移位的、怎么定义起始位的、TTL电平还是RS232电平等)对程序员是隐藏的,软件工程师对串口的操作接口就是(输入与输出)缓冲区,而缓冲区的实质就是寄存器,因此对串口的操作最后还是表现为对寄存器的读写。
(6)波特率发生器,作用是产生串口发送/接收的节拍时钟。波特率发生器本质是一个时钟分频器。它的工作需要源时钟(因为串口控制器是接在APB总线上的,所以源时钟由APB总线提供),然后它的内部将源时钟进行分频(软件设置寄存器来配置)得到目标时钟,然后再用这个目标时钟产生波特率(硬件自动的)。
(7)自动流控(AFC,Auto Flow Control)的设计目的,是让串口通信变得更可靠,在发送方速率比接收方快的时候,流控可以保证发送和接收不会漏掉东西。但是现在有更好更高级的通讯方式(比如usb、internet),串口基本被废弃了。现在串口的主要用途,是SoC通过串口来输出调试信息。由于调试信息不是关键性信息,而且由于硬件的发展,串口本身速度已经相对很慢,硬件本身可以协调发送和接收速率,因此流控已经失去意义。
二、串口的高级功能
串口的基本功能如一所述,由于技术的发展,串口新添了一些高级功能,在像210这类的高级SoC的串口控制器中,都有下面这些高级功能。
1、FIFO模式及其作用
典型的串口设计,发送/接收缓冲区只有1字节,每次发送/接收只能处理1帧数据。这样在单片机中没什么问题,但是到复杂SoC中(一般有操作系统的)就会出现问题,会导致效率低下,因为CPU需要不断切换上下文。
解决方案就是扩展(串口控制器的)发送/接收缓冲区,比如将发送/接收缓冲器设置为64字节,CPU一次性给发送缓冲区64字节的待发送数据,然后transmitter慢慢发送,发送完再找CPU要64字节数据。但是串口控制器本来的发送/接收缓冲区是1字节长度,所以做了一个变相的扩展,即FIFO。这个缓冲区之所以叫FIFO,是因为该缓冲区的工作方式类似于FIFO这种数据结构。
2、DMA模式及其作用
DMA是英文direct memory access的缩写,中文名是“直接内存访问”。DMA模式要解决的问题与上面的FIFO模式要解决的问题一致,就是串口发送/接收要频繁地折腾CPU,造成CPU反复切换上下文,导致系统效率低下。DMA技术的核心就是在交换数据时不需要CPU参与,模块自己完成。
传统的串口工作方式(无FIFO无DMA)效率是最低的,适合低端单片机。高端单片机上CPU事务繁忙,所以都需要串口能够自己完成大量数据发送/接收。FIFO模式是一种轻量级的解决方案,DMA模式适合大量数据迸发式的发送/接收时。
3、IrDA模式及其用法
IrDA即红外线通信(电视机、空调遥控器就是红外通信的)。发送方(固定间隔时间)向接收方发送红外信号或者不发送红外信号,接收方通过判断有无红外线信号来接收1和0。
红外通信和串口通信非常像,都是每隔固定时间发送1或者0给接收方,因此S5PV210就利用串口通信来实现红外发送和接收。S5PV210的某个串口支持IrDA模式,开启红外模式后,只需要向串口写数据,这些数据就会以红外光的方式向外发射出去(当然是需要一些外部硬件支持的),然后接收方接收这些红外数据即可解码得到所发送的信息。
三、串行通信与中断的关系
串口通信分为发送/接收2部分,其中发送方一般不需要(但也可以使用)中断,来完成数据的发送,接收方必须(其实也可以轮询方式接收)使用中断来接收。
(1)发送方使用中断
发送方先设置好中断并绑定一个中断处理程序,然后发送方丢一帧数据给transmitter模块,transmitter模块需要耗费一段时间来发送这一帧数据,这段时间内发送方CPU可以切换到别的任务,等transmitter模块发送完成后会产生一个TXD中断,通知CPU去执行事先绑定的中断处理程序,在中断处理程序中CPU给transmitter模块放一帧数据,然后CPU切换离开。
(2)发送方不使用中断
发送方事先禁止TXD中断,发送方CPU给一帧数据到transmitter模块,然后transmitter模块耗费一段时间来发送这帧数据,这段时间CPU没有切换去做别的事情,一直在等待数据发送完成,发送完成后CPU再给它一帧数据继续发送,直到所有数据发完。
CPU是怎么知道transmitter模块已经发送完了?有一个状态寄存器,状态寄存器中有一个位叫发送缓冲区空标志,transmitter模块发送完成(发送缓冲区空了)就会给这个标志位置位,CPU通过不断查询这个标志位为1还是0,得知发送是否已经完成。
(3)接收方必须使用中断
因为串口通信是异步的,异步的意思就是说发送方占主导权。发送方随时想发就能发,而接收方只有时刻等待才不会丢失数据。这个差异使得发送方可以不用中断来发送数据,而接收方不得不使用中断模式来接收数据。
四、S5PV210串口的时钟信号
(1)串口通信为什么需要时钟?
因为串口通信需要一个固定的波特率,所以transmitter模块和receiver模块都需要一个时钟信号。
(2)S5PV210的时钟信号从哪里来?
外部APB总线(PCLK_PSYS,66MHz)提供源时钟信号,然后串口控制器里的波特率发生器进行分频,得到一个低频时钟,这个时钟就是给transmitter模块和receiver模块使用的。
(3)如何设置串口的时钟信号?
第一,为串口控制器选择源时钟,一般选择为PCLK_PSYS,也可以是SCLK_UART。
第二,设置波特率发生器的2个寄存器UBRDIVn、UDIVSLOTn。UBRDIVn寄存器用来设置波特率,UDIVSLOTn用来辅助设置(目的是为了校准波特率)。