UART传输
UART架构

波特率发生器
- 波特率生成器包含若干自由运行计数器,用于生成内部 x16 时钟信号 Baud16 及 IrLPBaud16 信号。Baud16 为 UART 的发送与接收控制提供时序信息;该信号由一系列脉冲构成,每个脉冲的宽度为一个 uartclk 时钟周期,频率为波特率的 16 倍。IrLPBaud16 则在低功耗模式下,为生成 IrDA 编码发送比特流的脉冲宽度提供时序信息。
AMBA总线
- AMBA APB接口可生成读写解码信号,用于对状态/控制寄存器以及发送/接收FIFO存储器进行访问。详细信号的意义参考:https://www.cnblogs.com/tuck0603/p/22610648
中断发生器
- UART 生成独立的可屏蔽高电平(ACTIVE HIGH)中断;同时,还会根据这些独立中断请求进行或运算,生成一个组合中断输出。
- 可以使用单个组合中断与系统中断控制器配合,该控制器支持基于每个外设进行额外的屏蔽操作。这使得您能够采用模块化设备驱动程序,而这些驱动程序始终清楚应从何处获取中断源控制寄存器中的相关位。
- 可以利用独立的中断请求,配合一个为每个外设的输出端口提供屏蔽功能的系统中断控制器。通过这种方式,全局中断服务例程可从系统中断控制器中的一个宽寄存器中读取全部中断源信息。在实时系统中,当从外设寄存器读取数据所需的时间远大于 CPU 的时钟频率时,这种方案尤为适用。
发送与接收
- 发送FIFO:发送端FIFO是一个宽度为8位、深度为16个存储单元的FIFO存储器缓冲区。通过APB接口写入的CPU数据将暂存于该FIFO中,直至被发送逻辑电路读取。您可以禁用该发送端FIFO,使其充当一个单字节保持寄存器。
- 接收FIFO:接收 FIFO 是一个 12 位宽、16 位深度的 FIFO 内存缓冲区。接收逻辑会将接收到的数据及相应的错误位暂存于该接收 FIFO 中,直至由 CPU 通过 APB 接口读取。接收 FIFO 还可被禁用,此时它可充当一个单字节暂存寄存器。
- 发送逻辑:对从传输FIFO读取的数据进行并行到串行的转换。控制逻辑根据控制寄存器中编程的配置,输出以起始位开头的串行比特流,其中数据位以最低有效位(LSB)为首(先发低位),随后是奇偶校验位,最后是停止位。
- 接收逻辑:接收逻辑在检测到有效起始脉冲后,对接收到的比特流执行串并转换。此外,系统还会执行越界检测、奇偶校验、帧错误检测及行中断检测,并将这些检测状态与写入接收 FIFO 的数据一同记录。所以接收的FIFO宽度比发送FIFO宽度多4bit,就是用于记录越界检测(溢出bit)、奇偶校验、帧错误检测及行中断检测状态。
发送端发送逻辑
- 在传输过程中,数据会被写入发送端 FIFO。若 UART 已启用,则系统将根据 UARTLCR_H 中指定的参数启动数据帧的传输。数据传输将持续进行,直至发送端 FIFO 中无数据残留。
- 一旦数据被写入发送端 FIFO(即 FIFO 非空),BUSY 信号立即置为高电平,并在数据传输期间持续保持高电平状态。仅当发送端 FIFO 为空,且移位寄存器中最后一个字符(含停止位)已完全传输完毕后,BUSY 信号才会复位。即使 UART 已不再启用,BUSY 信号仍可能置为高电平。
接收端接收逻辑
- 当接收端处于空闲状态(即 UARTRx 持续为 1,处于标记状态)且在数据输入端检测到低电平(表明已接收到起始位)时,由 Baud16 使能的接收计数器开始运行;在正常 UART 模式下,数据于该计数器的第 8 个时钟周期进行采样;而在 SIR 模式下,数据于该计数器的第 4 个时钟周期进行采样,以适应较短的逻辑 0 电平脉冲(位于比特周期的中点)。
- 若 uartrxd 在 Baud16 的第 8 个时钟周期内仍为低电平,则该起始位有效;否则,系统将检测到一个错误的起始位并忽略该信号。
- 若起始位有效,则根据数据字符的预设长度,在每 16 个 Baud16 周期(即一个比特周期后)对后续数据位进行采样。随后,若启用了奇偶校验模式,则对奇偶校验位进行校验。
- 最后,若 uartrxd 为 HIGH,则确认存在有效停止位;否则则判定发生了帧格式错误。当接收到一个完整字时,该数据将被存入接收 FIFO 中,并附带与该字相关的所有错误位
接收端的错误bit位和溢出bit位
- 三个错误位存储在接收 FIFO 的 [10:8] 位中,并与特定字符相关联。此外,还有一个指示溢出错误的额外错误位,该位存储在接收 FIFO 的第 11 位中。
- 溢出位与接收 FIFO 中的字符无关。当 FIFO 已满,且下一个字符已完全被移位寄存器接收到时,即置位溢出标志。此时移位寄存器中的数据会被覆盖,但不会被写入 FIFO。当接收 FIFO 中出现可用空位,且接收到另一个字符时,溢出标志的状态将与接收到的字符一同复制到接收 FIFO 中,随后溢出状态被清零。(移位寄存器是8位都完整才会写入FIFO,因此不存在两个字节都存在情况)
浙公网安备 33010602011771号