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