UART Baudrate
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_linux
- tty初探-uart驱动框架分析
- ARM:UART串口异步通信驱动编程
- RK3399之UART
- 基于HAL库处理UART中断并接收串口传入的数据
- UART、SPI、I2C的基础总结
- 新路程------imx6的uart小结(1)
- 新路程------uart驱动和tty(2)
- STM8S_004_UART基本收发数据
- UART串口简介
- CC3220学习笔记---UART的使用(翻译)
- UART通信协议
- SJXXX串口扩展芯片 UART(1) to UART(4)
- [置顶] ARM开发(5)基于STM32的UART串口通信实验
- I2C,SPI,UART,USART,USB 的区别及串行总线的选择
- 基于FPGA Uart串口通信实验
- 【iCore4 双核心板_FPGA】例程十二:基于UART的ARM与FPGA通信实验
- 【iCore4 双核心板_ARM】例程三十二:UART_IAP_ARM实验——更新升级STM32
- Uart 架构之美 -- Linux Kernel 实现浅析
- UART 和 USART 有区别