s5pv210——串口(UART)通信接口详解

以下内容源于朱友鹏《物联网大讲坛》课程的学习和整理,以及博客http://www.cnblogs.com/biaohc/p/6351253.html,如有侵权,请告知删除。

 

 

 

一、串行通信接口详解1

1、串口的名称

  • S5PV210的数据手册中串口控制器在section8.1;
  • 串口的官方名称叫:universal asynchronous reciver and transmitter,通用异步收发器;
  • 英文缩写是UART,中文简称串口。

2、S5PV210的串口控制器工作原理框图

s5pv210——串口(UART)通信接口详解(1)串口控制器包含transmitter和receiver,两部分功能彼此独立。

  • transmitter负责向外部发送信息,receiver负责从外部接收信息到210内部。

(2)总线角度来讲,串口控制器是接在APB总线上的。

  • 对我们编程有影响的是:将来计算串口控制器的源时钟时是以APB总线来计算的。

(3)transmitter由发送缓冲区和发送移位器构成。

  • 主板要发送信息时,首先将信息进行编码(一般用ASCII码)转换成二进制流,然后将一帧数据写入发送缓冲区,发送移位器会自动从发送缓冲区中读取一帧数据,然后自动移位(移位的目的是将一帧数据的各个位分别拿出来)将其发送到Tx通信线上。

(4)receiver由接收缓冲区和接收移位器构成。

  • 当通过串口线向主板发送信息时,信息通过Rx通信线进入接收移位器,然后接收移位器自动移位将该二进制位存入接收缓冲区,接收完一帧数据后receiver会产生一个中断给CPU,CPU收到中断后即可知道receiver接收满了一帧数据,就会来读取这帧数据。

(5)发送缓冲区和接收缓冲区是关键。

  • 发送移位器和接收移位器的工作都是自动的,不用编程控制。
  • 串口程序的编程:1、首先初始化(初始化的实质是读写寄存器)好串口控制器(包括发送控制器和接收控制器);2、然后要发送信息时直接写入发送缓冲区,要接收信息时直接去接收缓冲区读取。
  • 串口底层的工作(譬如怎么移位的、譬如起始位怎么定义的、譬如TTL电平还是RS232电平等)对程序员是隐藏的,软件工程师对串口操作的接口就是发送/接收缓冲区(实质就是寄存器,操作方式就是读写内存)。

(6)波特率发生器,作用是产生串口发送/接收的节拍时钟。

  • 波特率发生器是一个时钟分频器。它的工作需要源时钟(APB总线来),然后内部将源时钟进行分频(软件设置寄存器来配置)得到目标时钟,然后再用这个目标时钟产生波特率(硬件自动的)。

 

3、自动流控(AFC:Auto flow control)

(1)为什么需要流控?

  • 流控的目的是让串口通信非常可靠,在发送方速率比接收方快的时候流控可以保证发送和接收不会漏掉东西。

(2)现在为什么不用流控?

  • 现在计算机之间有更好更高级(usb、internet)的通讯方式,串口已经基本被废弃了。
  • 现在串口的用途更多是SoC用来输出调试信息的。由于调试信息不是关键性信息,而且由于硬件的发展,串口本身速度已经相对很慢,硬件本身可以协调发送和接收速率,因此流控已经失去意义。

 

二、串行通信接口详解2

 

串口的基本功能如上面所述,由于技术的发展,串口新添了一些高级功能,在高级SoC的串口控制器中,都有这类高级功能。

1、FIFO模式及其作用

(1)典型的串口设计,发送/接收缓冲区只有1字节,每次发送/接收只能处理1帧数据。

  • 这样在单片机中没什么问题,但是到复杂SoC中(一般有操作系统的)就会有问题,会导致效率低下,因为CPU需要不断切换上下文。

(2)解决方案

  • 扩展串口控制器的发送/接收缓冲区,譬如将发送/接收缓冲器设置为64字节,CPU一次过来直接给发送缓冲区64字节的待发送数据,然后transmitter慢慢发,发完再找CPU再要64字节。但是串口控制器本来的发送/接收缓冲区是固定的1字节长度的,所以做了个变相的扩展,就是FIFO。

(3)FIFO就是first in first out,先进先出。

  • fifo是一种数据结构。这个缓冲区叫FIFO,是因为这个缓冲区的工作方式类似于FIFO这种数据结构。

 

2、DMA模式及其作用

(1)DMA direct memory access,直接内存访问。

  • DMA本来是DSP中的一种技术,DMA技术的核心就是在交换数据时不需要CPU参与,模块可以自己完成

(2)DMA模式要解决的问题和上面FIFO模式是同一个问题,就是串口发送/接收要频繁的折腾CPU,造成CPU反复切换上下文导致系统效率低下。

  • 传统的串口工作方式(无FIFO无DMA)效率是最低的,适合低端单片机;
  • 高端单片机上CPU事务繁忙,所以都需要串口能够自己完成大量数据发送/接收。
  • FIFO模式是一种轻量级的解决方案,DMA模式适合大量数据迸发式的发送/接收时。

 

3、IrDA模式及其用法

(1)IrDA其实就是红外,红外就是红外线通信(电视机、空调遥控器就是红外通信的)。

(2)红外通信的原理

  • 发送方固定间隔时间向接收方发送红外信号(表示1或0)或者不发送红外信号(表示0或者1),接收方每隔固定时间去判断有无红外线信号来接收1和0。
  • 红外通信和串口通信非常像,都是每隔固定时间发送1或者0(判断1或0的物理方式不同)给接收方来通信。因此210就利用串口通信来实现了红外发送和接收。
  • 210的某个串口支持IrDA模式。开启红外模式后,只需要向串口写数据,这些数据就会以红外光的方式向外发射出去(当然是需要一些外部硬件支持的),然后接收方接收这些红外数据即可解码得到所发送的信息。

 

三、串行通信接口详解3

1、串行通信与中断的关系

(1)串口通信分为发送/接收2部分。发送方一般不需要(也可以使用)中断即可完成发送,接收方必须(也可以轮询方式接收)使用中断来接收。

(2)发送方可以选择使用中断,也可以选择不使用中断。

  • 使用中断:发送方先设置好中断并绑定一个中断处理程序,然后发送方丢一帧数据给transmitter,transmitter发送耗费一段时间来发送这一帧数据,这段时间内发送方CPU可以去做别的事情,等transmitter发送完成后会产生一个TXD中断,该中断会导致事先绑定的中断处理程序执行,在中断处理程序中CPU会切换回来继续给transmitter放一帧数据,然后CPU切换离开;
  • 不使用中断:发送方事先禁止TXD中断(当然也不需要给相应的中断处理程序了),发送方CPU给一帧数据到transmitter,然后transmitter耗费一段时间来发送这帧数据,这段时间CPU在这等着(CPU没有切换去做别的事情),待发送方发送完成后CPU再给它一帧数据继续发送直到所有数据发完。CPU是怎么知道transmitter已经发送完了?有一个状态寄存器,状态寄存器中有一个位叫发送缓冲区空标志,transmitter发送完成(发送缓冲区空了)就会给这个标志位置位,CPU就是通过不断查询这个标志位为1还是0来指导发送是否已经完成的。

(3)因为串口通信是异步的,异步的意思就是说发送方占主导权。也就是说发送方随时想发就能发,但是接收方只有时刻等待才不会丢失数据。所以这个差异就导致发送方可以不用中断,而接收方不得不使用中断模式。

2、210串行通信接口的时钟设计

(1)串口通信为什么需要时钟?

  • 因为串口通信需要一个固定的波特率,所以transmitter和receiver都需要一个时钟信号。

(2)时钟信号从哪里来?

  • 源时钟信号是外部APB总线(PCLK_PSYS,66MHz)提供给串口模块的(这就是为什么我们说串口是挂在APB总线上的),然后进到串口控制器内部后给波特率发生器(实质上是一个分频器),在波特率发生器中进行分频,分频后得到一个低频时钟,这个时钟就是给transmitter和receiver使用的。

(3)串口通信中时钟的设置主要看寄存器设置。

  • 寄存器源设置(为串口控制器选择源时钟,一般选择为PCLK_PSYS,也可以是SCLK_UART);
  • 波特率发生器的2个寄存器:UBRDIVn和UDIVSLOTn。UBRDIVn是主要的设置波特率的寄存器,UDIVSLOTn用来辅助设置,目的是为了校准波特率。