本帖最后由 L-MCU 于 2024-7-18 15:51 编辑
1、USART介绍 关于CH32L103 USART的主要特征以及相关概述,具体可见CH32L103应用手册介绍,在此不再赘述。 USART,全称Universal Synchronous/Asynchronous Receiver/Transmitter,即通用同步异步收发器,支持全双工或半双工的同步或异步通信,一般使用异步通信方式多一些,作为UART使用。USART一般用于MCU与外部设备或模块之间的通信以及MCU开发过程中的打印调试等。
2、USART通信协议 UART通信 USART一般作为UART使用,UART通信仅需两根线:发送数据线(Tx)以及接收数据线(Rx)。 通信过程中,数据以数据包的形式进行发送和接收,数据包中包含起始位、数据位和停止位。如下图,是对串口通信过程数据的抓包。 通过上位机与MCU通信进行数据的收发,其中通道1抓取的是MCU RX引脚的数据,通道0抓取的是MCU TX引脚的数据。 由串口调试助手可知,此次串口通信波特率为115200,8位数据位,1个停止位,无奇偶校验位。 串口数据传输以数据包的形式传输,包含起始位、数据位、停止位,下图为1个数据包的波形: 由图可知: 起始位是1个位周期(每一位占用的时间)的低电平,此处串口通讯波特率为115200,因此1个位周期大约是8.7us; 数据位配置是8位,数据为0x61,根据低位在前(LSB)标准,因此这8位数据是1000 0110,即0x61; 停止位配置的是1个停止位,因此此处停止位就是1个位周期的高电平。
LIN通信 CH32L103的USART是支持LIN的。关于LIN,即Local Interconnect Network,局部互联网络总线,是一种针对汽车分布式电子系统而定义的低成本的串行通讯网络。LIN总线采用的是单线传输形式,总线电平一般为12V,传输速率最高限制为20kbps。由于物理层的限制,一个LIN网络最多可以连接16个节点,无需仲裁。LIN总线逻辑电平分为显性电平和隐性电平,其中显性电平为逻辑0,隐性电平为逻辑1. 下图是抓取LIN通信的波形,根据该波形对LIN通信协议进行介绍 LIN总线报文帧由报文头(Header)和报文响应(Response)两部分组成。 报文头(Header)由间隔段、同步段以及受保护段组成; 报文响应(Response)由数据段(1-8个字节)、校验段组成。
报文头: (1)同步间隔段: 在上图中,Header Break表示同步间隔段,同步间隔段由同步间隔和同步间隔段间隔符组成,表示一帧报文的起始,由主节点发出。同步间隔段是唯一一个不符合USART通信的段。 同步间隔:由至少13位显性电平(逻辑0)组成; 同步间隔段间隔符:由至少持续1位隐性电平(逻辑1)组成; 同步间隔段具体如下: 其中,同步间隔13位显性电平,同步间隔段间隔符1位隐性电平。 由图中注意到,在同步间隔段最后还有2位的隐性电平,为Inter Byte Space。Inter Byte Space为字节间隔。在每一段后面都会跟一个字节间隔。 (2)同步段 在上图中,Header Sync表示同步段。同步段由1位起始位+8位数据位+1位停止位组成,用于确保所有从节点使用与主节点使用相同的波特率发送接收数据。具体如下图: 其中,8位数据位固定为0x55,且LSB在前,因此0x55二进制即为 1010 1010. (3)受保护段 在上图中,Protected ID表示受保护段。其中,前6位表示帧ID(Frame ID),加上2位奇偶校验位后表示受保护段。具体如下图: 图中,最开始(绿点部分)为1位起始位,显性电平;接下来是受保护段,包含6位帧ID和2位奇偶校验,奇偶校验公式如下: P0 = ID0 ⊕ ID1 ⊕ ID2 ⊕ ID4 P1 = ¬ (ID1 ⊕ ID3 ⊕ ID4 ⊕ ID5) 其中“⊕”代表“异或”运算,“¬”代表“取非”运算。 以0x21(1000 01)为例: P0=1 ⊕ 0⊕ 0 ⊕ 0=1; P1= ¬ (0 ⊕ 0 ⊕ 0 ⊕ 1)=0; 其中,帧ID范围为0x00到0x3F,共64个,其中ID:60-61为诊断ID,ID:62-63为预留ID。此处为0x21,由于LSB在前,二进制表示为1000 01。
报文响应 (1)数据段 在上图中,Data1-7均属于数据段。数据段具体如下图: 图中,数据段包含1位起始位+8位数据位+1位停止位。数据位LSB在前,0x12则表示为0100 1000。 (2)校验和段 校验和段用于校验接收到的数据是否正确,分为经典校验(Classic Checksum)和增强校验(Enhance Checksum)。经典校验仅校验数据场,适用于诊断帧和与 LIN1.x 从机节点通信;增强校验校验标识符场和数据场,适用于与 LIN2.x 从机节点通信(诊断帧除外)。采用标准型校验和还是增强型校验和由主机节点管理,发布节点和各收听节点根据帧ID来判断采用哪种校验和。 本次LIN通信传输的数据为0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,PID为0x61(注意此处PID要加上奇偶校验位,6位帧ID 1000 01,2位奇偶校验10,加在一起就是1000 0110,即0x61),校验和采用增强校验,8个数据加上PID为: 0x11+0x12+0x13+0x14+0x15+0x16+0x17+0x18+0x61=0x105,即十进制为261,261超过255,再减去255,即为6,换算成二进制即为0000 0110,取反之后为1111 1001,换算成十六进制即为0xF9.
3、USART应用 CH32L103 EVT提供了USART基本应用例程,如下图。附件例程包含了串口常用的收发例程以及LIN通信例程,可以参考一下。
4、USART应用注意事项 (1)关于串口波特率的计算 波特率计算公式如下: TX/RX波特率=FCLK/(16*USARTDIV) USARTDIV=DIV_Mantissa+(DIVFraction/16) 以USART1波特率115200为例,FCLK为72M,则USARTDIV值为39.0625,即 39.0625=DIV_Mantissa+(DIVFraction/16) 其中,DIV_Mantissa表示整数部分,为36,DIVFraction/16表示小数部分,为0.0625,则DIVFraction的值为1. (2)关于串口硬件流控制RTS、CTS引脚意义 对于MCU本身来说,当开启硬件流控时,RTS、CTS初始化配置时: RTS建议配置为复用推挽输出,CTS建议配置配置为浮空输入或带上拉输入,如下图 如上图, 对于MCU来说: RTS为输出信号,用于表示MCU串口是否准备好接收数据,若输出信号为低电平,则说明MCU串口可以接收数据,请求发送数据。当接收寄存器已满时,RTS将被设置为高电平 CTS为输入信号,用于判断MCU串口是否可以向对方发送数据,若接收信号为低电平,则说明MCU串口可以向对方发送数据。若为高电平则在发送当前数据帧之后停止发送 (3)关于串口空闲中断触发机制及时间 串口空闲中断是在监测到数据接收后(即串口的RXNE位被置位)开始检测,当总线上在一个字节对应的周期内未再有新的数据接收时,触发空闲中断IDLE位被硬件置1。这个时间跟串口的波特率设置有关。
|