Uart基本工作原理
发送数据过程:空闲状态,线路处于高电位;当收到发送数据指令后,拉低线路一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位(停止位为高电位),一帧数据发送结束。
接收数据过程:空闲状态,线路处于高电位;当检测到线路的下降沿(线路电位由高电位变为低电位)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备准备接收数据或存入缓存。
由于UART是异步传输,没有传输同步时钟。为了能保证数据传输的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误码。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。
UART的接收数据时序为:当检测到数据的下降沿时,表明线路上有数据进行传输,这时计数器CNT开始计数,当计数器为24=16+8时,采样的值为第0位数据;当计数器的值为40时,采样的值为第1位数据,依此类推,进行后面6个数据的采样。如果需要进行奇偶校验,则当计数器的值为152时,采样的值即为奇偶位;当计数器的值为168时,采样的值为"1"表示停止位,一帧数据接收完成。
相关概念
串行通信:串行通信是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。
异步传输:异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。
波特率:每秒钟传送的二进制位数。
UART的接收和发送是按照相同的波特率进行收发的。波特率发生器产生的时钟频率不是波特率时钟频率,而是波特率时钟频率的16倍,目的是为在接收时进行精确地采样,以提取出异步的串行数据。根据给定的晶振时钟和要求的波特率,可以算出波特率分频计数值。
数据传输基本格式:
这里应该放一张uart的协议传输时序图片
1、 起始位:一个逻辑0信号,表示传输字符开始
2、 数据位:5~8位逻辑0或逻辑1信号,小端传输,也就是先传输最低有效位
3、 校验位:偶校验或奇校验
4、 停止位:一个字符数据结束的标志,可以是1位,1.5位,2位高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,
很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
5、 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
注:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)
奇校验和偶校验:
奇校验:就是让原有数据序列中(包括你要加上的一位)1的个数为奇数
1000110(0)你必须添0这样原来有3个1已经是奇数了所以你添上0之后1的个数还是奇数个。
偶校验:就是让原有数据序列中(包括你要加上的一位)1的个数为偶数
1000110(1)你就必须加1了这样原来有3个1要想1的个数为偶数就只能添1了。
Uart硬流控的RTS、CTS:
(现在做串口使用RTS/CTS必看内容,因为MTK/)
RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据。
CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。
此处有人将CTS翻译为发送允许,我感觉的确比翻译为清除发送好。因为CTS是对方的RTS控制己方的CTS是否允许发送的功能。
AP与MODEM的流控这样通信的:
AP串口可用时,将AP-RTS拉低,MODEM-CTS检测到AP-RTS为低,知道AP串口已准备好,可以发送数据;
AP串口不可用时,将AP-RTS拉高,MODEM-CTS检测到AP-RTS为高,知道AP串口还未准备好,就不会放数据。
MODEM串口可用与不可用时的交互是同样道理。
没有串口控制器,用中断和普通IO口即可实现RTS与CTS功能。RTS用GPIO实现,串口就绪拉低电平,串口忙拉高电平
CTS用中断实现,检测到低电平,将串口数据发送出去,检测到高电平则保留串口数据直到检测到低电平为止。
Uart底层通信协议详细解释见这三篇博客
参考文献:
https://blog.csdn.net/whxngb/article/details/50474603
uart串行通信详解
http://www.cnblogs.com/huanzxj/p/4522274.html
uart通信协议
https://blog.csdn.net/zqixiao_09/article/details/50994257
CortexM0开发 —— UART时序分析
https://blog.csdn.net/zeroboundary/article/details/8966586
UART中的硬件流控RTS与CTS
https://baike.baidu.com/item/%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C/8090811
奇校验和偶校验的详细说明