UART 通用串行通信整理
基本概念
uart 是一种常用的低速串行通信外设接口,一般进行一次5bit~8bit的数据传输,记为一帧数据。通信只需要GND,RXD,TXD三根线,简单而高效。
下图为5bit LSB为第一位的全双工通信例子
数据帧的结构
通信线常以高电平待机,起始位(D0)低电平,接着就是5bit到8bit数据位,一位的校验位(通常为奇偶校验位或者高低位,也可以缺省),最后是结束位(可以是0.5,1,1.5倍位宽的高电平)。起始位和结束位通常是接受机用来校准传输的标志位,可用来生成error信号。
数据位长度
与设定的波特率相关,并且采用超量采样来削弱噪声干扰,业界常用16倍超采样,即16个工作时钟为一个数据位,并在第8个时钟(N/2)处读取数据。
波特率
波特率是串口的通讯速率,常见的比特率为1200bps、4800bps、9600bps、38400bps、115200bps、256000bps、500000bps,这里bps的意思是bit/s,因此波特率实际上是每秒可以传输的bit的个数,通常波特率与时钟是直接挂钩的,比如波特率位9600bps,那么时钟就是9600hz,即每秒内产生9600个时钟,每个时钟周期发送1bit的数据。在一些地方譬如加密模块中,波特率的计时是从进入到输出为止。(这里并未采用超采样)
基本结构
接口设计可以分单工、半双工和全双工。区别在于通道数和能否同时接受、传出,这取决于设计场景和资源。(不过一般这里无关紧要,个人觉得)
核心是 RX 、TX 模块以及一个波特率控制模块。
代码后续补上
系统设计
由于项目需要的是SoC上的全双工uart模块,所以需要可以实现总线配置内部参数和可跨时域等功能。
整体系统架构如下:
AMBA总线接口:
通过软件(CPU,DSP的输出)设置需要的数据以及其传输格式,并用总线传递给uart模块。
寄存器配置模块
在配置寄存器模块寻址,并通过生成控制使能信号进而控制其他
模块。(将寻址的代码独立出来有利于后期的维护和更新功能)
通常还会配置fifo模块,用于缓存内部数据,以防止数据丢失。
跨时钟数据传递模块
设计成跨时钟是因为总线时钟可能需要配合其他低速模块,而uart的波特率需要跟业界标准适配,因此,需要一个额外的参考时钟,且最好是系统所支持的最高波特率的整数倍频率。
波特工作时钟生成模块
根据参考时钟生成采样使能信号
传出和传入模块
传出模块使用计数器,当采样使能信号数量足够时(超量采样)传出(pop)下一位数据;
传入模块则是在N/2处采样。
复位模块
uart系统总复位。