您的位置:首页 > 其它

UART Baudrate

2020-04-06 07:18 375 查看

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

  • 点赞
  • 收藏
  • 分享
  • 文章举报
东溯 发布了5 篇原创文章 · 获赞 0 · 访问量 169 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: