文章目录
- 通信协议是通信协议在组织设备之间的通信时扮演着重要角色。它基于系统要求而以不同方式进行设计。此类协议具有特定的规则,为实现成功通信,不同设备都遵循该规则。
- SPEC:是与某个公司挂钩的,例如UART的design spec,在设计时可能会需要与APB进行交互,所以它可以作为一个APB slave进行工作。协议是通用标准,spec是产品手册,会与某个公司挂钩,
一、UART协议
1.1 UART协议
UART:中文名通用异步收发器,(universal asynchronous receive/transmitter)协议,是一种通用串行数据(单线进行,不管是多少数据,都是按照顺序来进行传输通信。总线,用于异步通信(在传输过程中,传输数据的单位是字符,因为通信的发生是不定时的,所以两个数据单元之间的时间间隔就是不确定的额,基本上不存在时间间隔相同的可能性。而单个数据单元内,两个二进制之间的时间间隔是一样的)。该总线双向通信,可以实现全工传输和接收。全双工
工作原理:发送UART连接到以并行形式发送数据的控制数据总线。然后,数据将在传输线路(导线)上一位一位地串行传输到接收UART。反过来,对于接收设备,串行数据会被转换为并行数据。
特征 | 数据 |
---|---|
波特率 | 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600, 1000000, 1500000 |
线数量 | 2 |
传输方式 | 异步 |
最大Master数 | 1 |
最大slave数 | 1 |
1.2 UART协议硬件连接
- 每个UART设备都有两个信号分别命名为发送器(TX)和接收器(RX)
- UART1发送从data BUS获取并行数据后,添加起始位、奇偶校验位和停止位,以创建数据包。接着,数据包在TX引脚上逐位串行输出。
- UART2接受从其RX引脚上逐位读取的数据包。然后将串行数据转换成并行数据,并删除起始位、奇偶效验位和停止位。最后将并行数据包拆送到接收端的数据总线。
1.3 UART协议传输格式
- 波特率(baud rate):数据传输速率用波特率来表示。单位bps(bit per second),每秒传输的二进制位数。常见的波特率:9600bps、115200bps等,在采样时通过波特率因子的参数决定在1/9600 bps这段时间内采样次数,如果是16次采样,然后采样过程中有15次都是1,那么认为采到数据是1。配置的时候如果波特率与其他不符合就无法进行通信。
- 数据帧:可以是5~9位;LSB是最低有效位,MSB是最高数据位。
- 起始位(start bit):开始发起传输的标志。进行数据传输时发送方要先发出一个低电平’0’来表示传输字符的开始。
- 停止位(stop bit):为了表示数据包结束,发送UART将数据传输线从低电压驱动到高电压并保持1到2位时间。可以是1位,1.5位,2位的高电平。
- 校验位(parity check):奇偶性描述数字是偶数还是奇数。通过奇偶校验位,接收UART判断传输期间是否有数据发生改变。电磁辐射、不一致的波特率或长距离数据传输都可能改变数据位。接收UART读取数据帧后,将计数值为1的位,检查总数是偶数还是奇数。如果奇偶校验位为0(偶数奇偶校验),则数据帧中的1或逻辑高位总计应为偶数。如果奇偶校验位为1(奇数奇偶校验),则数据帧中的1或逻辑高位总计应为奇数。当奇偶校验位与数据匹配时,UART认为传输未出错。但是,如果奇偶校验位为0,而总和为奇数,或者奇偶校验位为1,而总和为偶数,则UART认为数据帧中的位已改变。
注意事项,
- 必须先约定好传输速率(波特率),发送和接收UART之间的波特率只能相差约10%
- 必须将发送和接收UART配置为相同的数据包结构。
1.4 UART协议传输步骤
- 发送UART从数据总线并行接收数据。
- 发送UART将起始位、奇偶校验位和停止位添加到数据帧。
- 从起始位到结束位,整个数据包以串行方式从发送UART送至接收UART。接收UART以预配置的波特率对数据线进行采样。
- 接收UART丢弃数据帧中的起始位、奇偶校验位和停止位。
- 接收UART将串行数据转换回并行数据,并将其传输到接收端的数据总线。
二、UART design spec
2.1 UART design spec概述
例如CPU想要与UART的进行传输,但是这里我们使用apb模拟cpu的行为去与UART进行交互。这里用了APB_UVC与uart_UVC的数据传输是并行执行,并且通过TX和RX进行传递数据能够实现串并转换,实现了收发器的作用。异步转换,是因为apb发送经过FIFO的数据,这个时钟是异步的,读写过程中会涉及波特率的问题。波特率实现收发的频率。UART的模块中还有一个波特率generator模块,然后uart_clk决定发送数据的频率。还会进行分频,产生所需的波特率的,所以波特率不能太慢,以避免无法生成我们所需的波特率在几MHz。
- 对从外围设备接收到的数据进行串行到并行转换;
- 对传输到外围设备的数据进行并行到串行转换。
- CPU 通过 AMBA APB 接口读写数据和控制/状态信息。 发送和接收路径由内部 FIFO 存储器缓冲,在发送和接收模式下最多可以独立存储 16 个字节。
- 包括可编程波特率生成器,该生成器从UART内部参考时钟输入生成公共发送和接收内部时钟UARTCLK
- 支持高达460.8Kbits/s的波特率,以UARTCLK参考时钟频率为准。
- UART操作和波特率值由线路控制寄存器控制(UARTLCR_H)和波特率除数寄存器(UARTIBRD和UARTFBRD)。
- 从接收(包括超时),发送,调制解调器状态和错误条件单独屏蔽中断
- 如果接收过程中发生帧、奇偶校验或中断错误,则设置适当的错误位,并存储在FIFO中。如果发生超限情况,超限寄存器位立即设置,FIFO数据被阻止被覆盖。
2.2 UART接口信号
信号名 | 方向 | 位宽 | 说明 |
---|---|---|---|
PCLK | input | 1 | APB工作时钟,用于记录bus上的所有传输 |
PRESETn | input | 1 | 总线(bus)复位信号 |
PENABLE | input | 1 | APB使能信号 |
PSEL | input | 1 | UART选择信号,置1表示APB桥选择从设备,需要进行数据传输 |
PWRITE | input | 1 | APB传输方向信号,置1为写,置0为读 |
PADDR[11:2] | input | 10 | APB总线地址 |
PWDATA[15:0] | input | 16 | APB写到数据总线上的数据 |
PRDATA[15:0] | input | 16 | APB读取数据总线上的数据 |
UARTCLK | input | 1 | UART参考时钟,生成波特率 |
nUARTRST | input | 1 | UART复位信号 |
UARTRXD | input | 1 | UART串行输入数据 |
UARTTXD | output | 1 | UART串行输出数据 |
UARTINTR | output | 1 | UART中断,这是由下面4个单独可屏蔽中断和1个UART调制解调状态中断组合而成的一个中断信号 |
UARTRXINTR | output | 1 | UART接收FIFO中断 |
UARTTXINTR | output | 1 | UART发送FIFO中断 |
UARTRTINTR | output | 1 | UART接收超时中断 |
UARTEINTR | output | 1 | UART错误中断 |
- 这里的APB的信号中有16位的数据,而UART是1位。它需要实现并行转串行拆成两个8才能才可以进行传输
2.3 Baud rate generator
波特率生成器包含自由运行计数器,它生成内部的x16时钟、波特16和IrLPBaud16信号。 bau16为UART发送和接收控制提供了timing information。 波特16是一个脉冲流,其宽度为一个UARTCLK时钟周期,频率为波特率的16倍。 在低功耗模式下,IrLPBaud16提供了生成IrDA编码传输比特流脉冲宽度的时序信息。
2.3.1 波特率寄存器
波特率寄存器是由22-bits组成,一部分是整数部分(16-bits,[15:0])UARTIBRD,另一部分是小数部分(6bits[5:0])UARTFBRD。
当FUARTCLK是UART参考时钟频率时,波特率除数计算方法
Baud rate divisor BAUDDIV = (FUARTCLK/ {16 * Baud rate})
这里有一个计算的例子:
例如Baud rate=230400然后UARTCLK=4MHz,则
Baud rate divisor BAUDDIV = (4*10e6/ {16 * 230400})=1.085
因此BRDI =1 ,BRDF = 0.085.
分数部分m = integer((0.08564)+0.5) = 5
生成波特率分频器 = 1+ 5/64 = 1.078
生成波特率 = (410e6)/(161.078) = 231911
error = (231911-230400)/230400100 = 0.656%
2.4 UART 发送逻辑
- UARTCLK reference clock来控制Baud rate generator从而控制Transmitter的发送速度,还需要注意PCLK与UARTCLK是不同步的;
- UART发送FIFO是一个8位宽,16位深度的内存缓冲区。CPU通过APB总线接口写入的数据存储在FIFO中,UART发送逻辑读取发送FIFO中的数据,执行并行到串行转换,控制逻辑输出串行数据流,该串行数据流格式为:起始位、数据位(以LSB开始传输)、奇偶校验位、停止位。
- 发送FIFO可以被禁用,仅当作一个单字节的保持寄存器。
- 发送逻辑对从发送FIFO读取的数据执行并行到串行转换。控制逻辑根据控制寄存器中的程序配置输出从开始位开始的串行位流,首先是最低有效位(LSB)的数据位,接着是奇偶校验位,然后是停止位。
2.5 UART接收逻辑
- UART接收FIFO是一个12位宽,16位深度的内存缓冲区。当UART控制逻辑检测到有效启动脉冲后,接收逻辑将RX端口的串行比特流转换成并行数据,也执行奇偶校验位和帧错误检查,并将数据和它们的状态一起写入到接收FIFO中,直到被CPU通过APB接口读出。
- 接收FIFO也可以被禁用,仅当作一个单字节保持寄存器。
- 在检测到有效的启动脉冲后,接收逻辑对接收到的位流执行串行到并行转换。溢出、奇偶校验、帧错误检查和断行检测也会被执行,它们的状态伴随着写入接收FIFO的数据。
2.6 UART同步寄存器和逻辑
UART同时支持时钟的异步和同步操作,PCLK UARTCLK。同步寄存器和握手逻辑已经实现,并且在任何时候都是活动的。这对性能或区域的影响很小。控制信号同步是在数据流的两个方向上进行的,即从PCLK到UARTCLK,从UARTCLK到PCLK。
2.7 UART operation
2.7.1 interface reset
UART 和 IrDA SIR ENDEC 由全局复位信号 PRESETn 和块特定复位信号 nUARTRST 复位。 外部复位控制器必须使用 PRESETn 异步置位 nUARTRST 并将其与 UARTCLK 同步取反。 PRESETn 必须置为低电平足够长的时间以复位片上系统中最慢的模块,然后再次置为高电平。 UART 要求 PRESETn 在至少一个 PCLK 周期内被断言为低电平。
2.7.2 clock 信号
UARTCLK必须与波特率的选择相符合
- UARTCLK (min)频率 >= 16 x baud_rate (max),要不然无法进行分频,这是由于在进行发送或者接收数据的时候,按照一定的波特率发送时,时钟的长度不够长就无法采样16次。
- UARTCLK(max) 频率<= 16 x 65535 x baud_rate (min),65535是2e16,寄存器一共就16位,如果超过就无法进行分频。
UARTCLK的频率也必须在所使用的所有波特率所需的错误限制内。
对于PCLK和UARTCLK的时钟频率比率也有一个约束。UARTCLK的频率必须不超过PCLK频率的5/3倍:
这允许有足够的时间将接收到的数据写入接收FIFO。