概述
Communication Protocol
每个字符包括起始位(1位,低电平,下降沿捕获)、数据位(5~8位, LSB first)、校验位(奇偶校验,可无)、停止位(1位,1.5位,2位), 其中为了保证数据传输的准确性和可靠性,字符之间可以插入空闲位(高电平,GAURD register)
UART 是异步传输(asynchronous),在数据传输的过程中没有时钟用来同步, 接受者不知道何时一帧数据将会被发送,接受者通过下降沿来判定一帧数据的起始
CLK
对于UART来说,有两个clock, BUS clock和Source clk, 前者用于数据的访问,后者用于产生baudrate. 一般UART 所处的是APB BUS,而Source clk 所处的domain 需要看designer 的设计,一般有INFRA domain 和 TOP domain.
baudrate = CLK / 采样baud_pulses数 / divisor
依据HIGHSPEED 的不同, baud_pulse(采样脉冲) 的数量不同,显然采样数越多得到的baudrate 精度也就越高
HIGHSPEED 0: base on 16baud_pulses
1 : base on 8baud_pulses
2 : base on 4*baud_pulses
3 : base on Sample_count * baud_pulses
baudrate = CLK / (Sample_count +1) / divisor
Sample_point = (Sample_count -2)/2 (with out decimal)
以下仅讨论HIGHSPEED 为3的情形:
#define DIV_EXACTLY(x, div) ((x)/(div))
#define DIV_ROUND_CLOSET(x, div) (((x)+((div)/2))/(div))
#define DIV_ROUND_UP(x,div) (((x)+(div)-1)/(div))
对于8bit 的寄存器, Sample_count 最大为256
kernel-4.14
(1)quot = divisor = {DLM,DLL}= INT((CLK/Baud)/256)+1
(2)count = (Sample_count +1)= INT(CLK/Buad/quot)
(3)即Sample_count = INT(CLK/Baud/quot) -1
(4)Sample_point = Sample_count /2 -1
Fraction是对于buadrate的微调, DE会给出一组经验值:
fraction =( (clk*100)/baud/qout)%100;
fraction = DIV_ROUND_CLOSET(fraction, 10);
Fracdiv_L = fraction_L_mapping[fraction ];
Fracdiv_M = fraction_M_mapping[fraction];
cmm script for basic log print:
#12M , 921600bps
LCR : 0x3
HIGHSPEED: 0x3
LCR: 0x83
DLL: 0x1
DLM: 0x0
SAC: 0xc
SAP: 0x5
LCR: 0x3
最后
以上就是个性背包为你收集整理的UART Baudrate的全部内容,希望文章能够帮你解决UART Baudrate所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复