UART的一点总结

 
串口即通用异步收发器(UARTUniversal Asynchronous Receiver Transmitter)。
UART很早以前做的一个协议,做的细节有的记的不太清了,最近又用到它了,不过当时做完就做成模块了直接用的!做个总结可能以后还要再改!
发送部分:
1:数据线空闲时呈现为高或“1”状态。
2:发送起始位的逻辑位“0”
3:发送8个数据位,先发送数据的最低位,最后发送最高位(发送顺序是与IIC相反的)。每位持续的时间是固定的,由发送器本地时钟控制,每秒发送的数据位个数(不是字节数),即为“波特率”。
4:发送1个、1+1/2个或2个停止位逻辑“1”位。
接受部分( 5倍速采样为例 ):
1:检测起始位,最早检测到起始位低电平的时刻必将落在S0阴影区,每次具体的采样点会在S0阴影区随机变化。我想有两种检测的方法:1)因为空闲和结束位都为1,所以一旦到检测到下降沿,间隔两个采样周期在数据位的中间采样(因为中间采样数据最可靠),如果为0则起始位有效,否则无效返回空闲状态继续等待。2)在每个采样时钟检测输入数据是否为低电平,若检测到低电平,则开始计数,如果连续2个时钟内输入数据均为低电平,则认为起始信号有效,其中若有一次采样得到的为高电平则认为起始信号无效,返回初始状态重新等待起始信号的到来。
2: 采样数据位,一旦检测到起始位有效时 (正好在起始位数据中间) ,每隔5个采样周期(即一个数据周期)采样数据位 (即正好在数据位中间位置采样) ,连续采样8次分别把最低位到最高位存入移位寄存器。
3: 检测结束位,跟采样数据位一样采样一位结束位, 当停止位采样值为高电平时,认为同步和数据正确,装人数据寄存器,否则认为同步或传输错误,此次采样的字符作废,将其舍弃。 不管正不正确接受状态机都要回到空闲状态。
总的来讲:
起始位和停止位起着很重要的作用。显然,他们标志每个字符的开始和结束,但更重要的是他们使接收器能把他的局部时钟与每个新开始接收的字符再同步。异步通信没有可参照的时钟信号,发送器随时都可能发送数据,任何时沿的出现时间,从而正确地采样紧接着的10~11位(包括开始位、数据位和停止位)。由于串行数据帧与接收时钟是异步的,所以接收器功能实现中的关键是接收器时钟与每个接收字符的同步。一个有效的方法是接收器采用高速率时钟对串行数据进行采样,通常采样频率是位时钟频率的整数倍。理论上倍数越高接收数据各位的分辨率越高,实际中,一般最大选择16倍。
接收器应该尽可能地在靠近位周期的中心处对每位采样 如果接收器能很好地预测起始位的开始,那么他可在起始位的下降沿到来之后,等待半个位周期再采样数据位。此后,接收器每等待一个位周期采样一个数据位,直至收到最后一位为止。倘若接收时钟的频率足够接近发送时钟,使得最后位能在离该位的精确中心位置半个周期内对他采样,以上方案就能正确地工作。这意味着接收时钟相对于发送时钟在10~11个时钟周期内,其增加和减少应小于半个位的时间间隔。因此,要求收发双方2个时钟的误差容限在5%以内。接收器的时钟与发送器的时钟不是同一个(即采样时钟为数据时钟的16倍(最大)),因此,接收器采样点的间隔跟由发送器时钟所确定的位间隔时间不同,接收器一定不能让他的相对时钟速度导致采样错误。
波特率的设置:因为时每秒发送的数据位个数,上位机的发送的波特率是9600,假如采样频率以发送频率的16倍进行采样,那么采样频率为9600×16;8位数据加上起始位和结束位(暂不考虑校验)共10位数据,所以发送一个完整的数据串的频率为9600/10=960,也就是说要想把以一个完整的8位数据存到RAM/FIFO里,写时钟应该是波特率的1/10;
总的来讲,就时为了采样到最可靠的数据,接收器应该尽可能地在靠近位周期的中心处对每位采样,采样频率时数据频率的整数倍( 一般最大选择16倍 ),协议本身的难点就在于波特率发生器的设置和采样位置的处理!
 

你可能感兴趣的:(嵌入式)