KV58 Note 08 有关UART

UART "Universal Asynchronous Receiver/Transmitter" 通用异步收发器

关注

'KV5x Sub-Family Reference Manual'

"Chapter 53 Universal Asynchronous Receiver/Transmitter (UART) / FlexSCI"

LIN(Local Interconnect Network)总线是针对汽车分布式电子系统而定义的一种低成本的串行通讯网络,是对控制器区域网络(CAN)等其它汽车多路网络的一种补充,适用于对网络的带宽、性能或容错功能没有过高要求的应用。
LIN总线是基于SCI(UART)数据格式,采用单主控制器/多从设备的模式,是UART中的一种特殊情况。
LIN 的目标是为现有汽车网络(例如CAN 总线)提供辅助功能,因此LIN总线是一种辅助的总线网络。在不需要CAN 总线的带宽和多功能的场合,比如智能传感器和制动装置之间的通讯使用LIN 总线可大大节省成本

KV58共有6个UART通道UART0~UART5
所有UART支持RS485,硬件流量控制,9位UART支持带奇偶的地址标志,数据高位与低位设置,IrDA制式(红外通信编码)
UART0~UART1支持ISO7816(SIM卡及其他智能卡通信),和8位宽FIFO(先进先出储存器)
其余UART均有1位宽FIFO

总线位宽决定输入/输出设备之间一次数据传输的信息量,用位(bit)表示
Buffer往往就是一段累积的存储空间,而FIFO有时候还可以帮助系统解决时钟域不同步或者数据宽度不一样的情况

*IDLE相关应当译为超时,而非空行,比如应当理解为超时判断/中断/标志...

如果没有FIFO或者说缓冲区的长度只有1字节,那么使用接收中断,就意味着每次收到一个字节的数据就要进一次中断,这样频繁进中断会占用CPU资源。
另外如果没有及时读走数据,那么下一个字节数据就会覆盖之前的数据,导致数据丢失,这在通讯速率高的场合很有可能出现。
使用FIFO,可以在连续接收若干个数据后才产生一次中断,然后一起进行处理。这样可以提高接收效率,避免频繁进中断,适用于大数据传输。
但是使用FIFO接收多字节数据进中断不好的地方是实时性会受到一定的影响,对某些实时性要求高的场合,比如说要求UART收到某个特定字符就立刻停止发送数据这样一个场合,使用FIFO每多个字节进一次中断就不合适了。

硬件流量控制RTS、CTS:通常用于RS485
RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据。
CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。

UART波特率寄存器:高UART Baud Rate Registers: High (UARTx_BDH)[8bits]
与BDL共同控制了一个13位波特率设置
[7]LBKDIE(LIN Break Detect Interrupt or DMA Request Enable)LIN间隔侦测中断与DMA请求使能:启用LIN间隔侦测标志,基于LBKDDMAS的状态或DMA传输请求生成中断请求
[6]RXEDGIE(RxD Input Active Edge Interrupt Enable)输入信号活动沿中断使能:启用输入信号活动沿标志RXEDGIF来产生中断请求
[6]SBNS(Stop Bit Number Select)停止位位数选择:0单个停止位,1两个停止位(在传输8-10位格式数据时该寄存器有效,用ISO7816时无效)
[5-0]SBR(UART Baud Rate Bits)UART波特率位

UART波特率寄存器:低UART Baud Rate Registers: Low (UARTx_BDL)[8bits]
[7-0]SBR(UART Baud Rate Bits)UART波特率位

先在BDH中配置SBR的高半值,再在BDL里配置SBR的低半值,当完成BDH配置时值只会被存入一个缓存区,直到BDL被写入后才会正式写入BDH

UART控制寄存器1 UART Control Register 1 (UARTx_C1)[8bits]
[7]LOOPS(Loop Mode Select)循环模式选择:当1起用过循环模式时,接受管脚将从UART中分离,而发射器输出将在内部连接到接收器输入。接收器和发射器必须能够使用循环模式工作。另外接收器输入取决于RSRC
[6]UARTSWAI(UART Stops in Wait Mode)UART在等待模式时停止:0UART时钟继续工作即使CPU在等待模式,1则在待机时停止
[5]RSRC(Receiver Source Select)接收器源选择:当循环模式被打开时该寄存器才有意义,0时内部循环连接,接收器输入内部与接收器输出连接,1时单总线UART模式当接收器输入与发射器输入信号连接
[4]M(9-bit or 8-bit Mode Select)9位/8位模式选择:当使用ISO7816时必须配置该寄存器,0为8位,1为9位
[3]WAKE(Receiver Wakeup Method Select)接收器唤醒方式选择:0空行唤醒,1地址位唤醒
[2]ILT(Idle Line Type Select)空行类型选择:决定何时接收器开始计数逻辑1作为空字符位。0从开始位后开始计数(那么停止位前的一连串逻辑1将会导致空字符辨认错误),1从停止位后开始计数(可以防止空字符辨认错误,但需要正确适当的同步传输)
[1]PE(Parity Enable)奇偶校验使能:1启用,在停止位前插入一位奇偶位,使用ISO7816时必须配置
[0]PT(Parity Type)奇偶校验形式:0为偶(偶数个逻辑1串清空奇偶位,并奇数个逻辑1置于奇偶位),1为奇(与前者相反),使用ISO7816时必须使用

UART控制寄存器2 UART Control Register 2 (UARTx_C2)[8bits]
[7]TIE(Transmitter Interrupt or DMA Transfer Enable)发射器中断与DMA传输使能:基于C5[TDMAS]的状态产生中断请求或DMA传输请求S1[TDRE]
[6]TCIE(Transmission Complete Interrupt Enable)传输完成中断使能:启用传输完成标志S1[TC]以产生中断请求
[5]RIE(Receiver Full Interrupt or DMA Transfer Enable)接收器饱和中断与DMA传输请求:基于C5[RDMAS]的状态产生中断请求或DMA传输请求S1[RDRF]
[4]ILIE(Idle Line Interrupt Enable)空行中断使能:启用空行标志S1[IDLE]以产生中断请求
[3]TE(Transmitter Enable)发射器使能:使能UART发射器
[2]RE(Receiver Enable)接收器使能:使能UART接收器
[1]RWU(Receiver Wakeup Control)接收器唤醒设置:1时启用唤醒模式并抑制更多接收器中断请求,通常硬件唤醒接收器将自动清除RWU
[0]SBK(Send Break)发送间隔符:0时正常发射机运行模式,1则启用队列间隔符发送,间隔符数量取决于S2[BRK13]

UART状态寄存器1 UART Status Register 1 (UARTx_S1)[8bits]
[7]TDRE(Transmit Data Register Empty Flag):1发射器缓冲区数据量小于等于TWFIFO[TXWATER]
[6]TC(Transmit Complete Flag):1发射器空闲,0发射器正在工作(发送数据、序文或间隔)
[5]RDRF(Receive Data Register Full Flag):1接收器缓冲区数据量大于等于RWFIFO[RXWATER]
[4]IDLE(Idle Line Flag):0接收器在工作或者在上次IDLE被清除后还没开始工作,1接收器空闲或者在上次标志后一直未被清除
[3]OR(Receiver Overrun Flag):OR将在程序无法保护输入寄存器溢出时标志
[2]NF(Noise Flag):接收器输入侦测到噪声
[1]FE(Framing Error Flag):数据包结构错误,当逻辑0被认为是停止位时标志(UART的停止位是逻辑1)
[0]PF(Parity Error Flag):奇偶校验错误,当数据的奇偶性与奇偶位不符

UART状态寄存器2 UART Status Register 2 (UARTx_S2)[8bits]
[7]LBKDIF(LIN Break Detect Interrupt Flag):1侦测到LIN总线间隔
[6]RXEDGIF(RxD Pin Active Edge Interrupt Flag):1在接收管脚上出现了一个触发沿
[5]MSBF(Most Significant Bit First):在不改变数据极性的情况下颠倒数据位的次序
[4]RXINV(Receive Data Inversion):颠倒接收数据的极性
[3]RWUID(Receive Wakeup Idle Detect):设置了S1[IDLE]并侦测到了空闲字符
[2]BRK13(Break Transmit Character Length):发射间隔字符长度,0为10-12bits长,1为13-14bits长
[1]LBKDE(LIN Break Detection Enable):使能LIN总线间隔侦测
[0]RAF(Receiver Active Flag):1UART接收器活动且输入非空闲,0UART接收器空闲/非活动等待开始位

UART控制寄存器3 UART Control Register 3 (UARTx_C3)[8bits]
[7]R8:接收9位格式数据包的第9位,先读R8再读D寄存器
[6]T8:发送9位格式数据包的第9位
[5]TXDIR:1发射管脚在单总线模式中为输出,0在单总线模式中位输入
[4]TXINV:1将发射数据极性倒转
[3]ORIE:启用溢出错误标志,与S1[OR]相关
[2]NEIE:启用噪声标志,与S1[NF]相关
[1]FEIE:启用数据结构错误标志,与S1[FE]相关
[0]PEIE:启用奇偶校验错误标志,与S1[PF]相关

UART数据寄存器UART Data Register (UARTx_D)[8bits]
实际上被分为两为了两个寄存器,读取时返回的是只读的接收数据寄存器,写入时写到只写的发射数据寄存器里
[7-0]RT

UART匹配地址寄存器1 UART Match Address Registers 1 (UARTx_MA1)[8bits]
[7-0]MA

UART匹配地址寄存器2 UART Match Address Registers 2 (UARTx_MA2)[8bits]
[7-0]MA

UART控制寄存器4 UART Control Register 4 (UARTx_C4)[8bits]
[7]MAEN1(Match Address Mode Enable 1):启用地址匹配模式1
[6]MAEN2(Match Address Mode Enable 2):启用地址匹配模式2
[5]M10(10-bit Mode select):0奇偶校验位为第9位,1奇偶校验位为第10位
[4-0]BRFA(Baud Rate Fine Adjust):对平均波特频率增加定时分辨率,增值为1/32

UART控制寄存器5 UART Control Register 5 (UARTx_C5)[8bits]
[7]TDMAS(Transmitter DMA Select):若C2[TIE]被设置S1[TDRE]标志被触发,0为请求中断,1为请求DMA传输
[5]RDMAS(Receiver Full DMA Select):若C2[RIE]被设置S1[RDRF]标志被触发,0为请求中断,1为请求DMA传输
[3]LBKDDMAS(LIN Break Detect DMA Select Bit):若BDH[LBKDIE]被设置S2[TLBKDIF]标志被触发,0为请求中断,1为请求DMA传输

UART扩展数据寄存器 UART Extended Data Register (UARTx_ED)[8bits]
反映了D的情况,在读D前应当先读ED
[7]NOISY:是否接收到噪声
[6]PARITYE:是否有奇偶校验错误

UART调制解调器寄存器 UART Modem Register (UARTx_MODEM)[8bits]
Do not set both RXRTSE and TXRTSE
[3]RXRTSE:接收器对RTS的控制权
[2]TXRTSPOL:RTS信号极性
[1]TXRTSE:发射器对RTS控制权
[0]TXCTSE:CTS对发射机的控制权

UART FIFO参数 UART FIFO Parameters (UARTx_PFIFO)[8bits]
改变此寄存器前先关闭发射器和接收器,修改后立刻执行TXFLUSH和RXFLUSH
[7]TXFE:启用发射器FIFO
[6-4]TXFIFOSIZE:发射器FIFO深度,000为1,001为4,010为8,011为16,100为32,101为64,110为128,单位为dataword
[3]RXFE:启用接收器FIFO
[2-0]RXFIFOSIZE:接收器FIFO深度,000为1,001为4,010为8,011为16,100为32,101为64,110为128,单位为dataword

*FIFO深度为只读,UART0-UART1的FIFO深度为8字节,其余为1字节

UART FIFO控制寄存器 UART FIFO Control Register (UARTx_CFIFO)[8bits]
[7]TXFLUSH:清除TX的FIFO或缓存
[6]RXFLUSH:清除RX的FIFO或缓存
[2]RXOFE:启用接收器FIFO上溢出中断标志(塞入过多数据)
[1]TXOFE:启用发射器FIFO上溢出中断标志(塞入过多数据)
[0]RXUFE:启用接收器FIFO下溢出中断标志(读取数据超过现有数据)

UART FIFO状态寄存器 UART FIFO Status Register (UARTx_SFIFO)[8bits]
[7]TXEMPT:指示TX的FIFO或缓存是否为空
[6]RXEMPT:指示RX的FIFO或缓存是否为空
[2]RXOF:接收器缓存上溢出标志
[1]TXOF:发射器缓存上溢出标志
[0]RXUF:接收器缓存下溢出标志

UART FIFO发射器水位 UART FIFO Transmit Watermark (UARTx_TWFIFO)[8bits]
用于设定一个可编程的阈值用于提示需要添加发射数据
[7-0]TXWATER

UART FIFO发射器计数 UART FIFO Transmit Count (UARTx_TCFIFO)[8bits]
指出当前发射器缓存或FIFO内的dataword数
[7-0]TXCOUNT

UART FIFO接收器水位 UART FIFO Receive Watermark (UARTx_RWFIFO)[8bits]
用于设定一个可编程的阈值用于提示需要从接收器FIFO或缓存中读取数据
[7-0]RXWATER

UART FIFO接收器计数 UART FIFO Receive Count (UARTx_RCFIFO)[8bits]
指出当前接收器缓存或FIFO内的dataword数
[7-0]RXCOUNT

当写入大量数据而不处理。若数据量超出水位设置,则会标志RDRF,若使缓冲区溢出,则标志OR与RXOFE
当OR被标志时,RDRF与IDLE的中断请求将被忽略

利用IDLE(UART空闲标志),实现在总线空闲时配置DMA,当数据帧来临时,将传输委托DMA执行,而不占用CPU资源
同样也可以委托DMA执行UART发送