sme 发表于 2015-3-19 09:29:34

讨论一下UART波特率分频的问题,非16倍整数时怎么做?

UART的波特率为一个数据位的时间(或频率),一般是由一高频分频得到。
设UART模块的输入频率为fCK,分频系数为N,则波特率为:
    Tx/Rx baudrate = fCK/N

对于数据的发送,N只要是整数,都很容易实现。
但对于接收,由于一般要采用16倍过采样,因此N为任意整数的话,很难实现。

因此,大部分对UART的波特率要求如下:
   Tx/Rx baudrate = fCK/n/16

即先将fck/n得到波特率的16倍频,再用此频率来作16分频,分别在计数值为7、8、9时刻连续采样rxd的数据。


现在看到一份规格书,其波特率计算按如下公式:
    Tx/Rx baudrate = fCK/N (N>=16)

请问对于N>=16的任意值,例如17、18、19。。。怎么实现16倍过采样?

huangqi412 发表于 2015-3-19 09:44:26

计数可变就行吧。原来是固定计数16个时钟为一个循环,现在计数(16+X)个时钟为一个循环,判断高低电平也同样

sme 发表于 2015-3-19 10:26:36

huangqi412 发表于 2015-3-19 09:44
计数可变就行吧。原来是固定计数16个时钟为一个循环,现在计数(16+X)个时钟为一个循环,判断高低电平也同 ...

你没明白我的意思。

接收时需要连续采样3个电平,如果是计数16个的话,需要在7、8、9时刻连续采样3次。

假设现在N为17,你说的(16+x)是指一个位的循环计数时间,即(16+1),问题是连续的3个采样点取在哪里?是7、8、9还是8、9、10?

假设计数循环为19呢?或者21、23、250、1993这样的值呢?N固定为一常数或许还好处理,但如果是16~65535这个范围呢(N为16位宽)?

redroof 发表于 2015-3-19 10:47:46

分两步,第一步得到一个比你需要高16倍的频率,第二步永远是16分频在789点采样

sme 发表于 2015-3-19 12:38:07

redroof 发表于 2015-3-19 10:47
分两步,第一步得到一个比你需要高16倍的频率,第二步永远是16分频在789点采样 ...

说得没错,只是这种方法需要一个16倍频电路,或是16倍PLL电路。FPGA无所谓,ASIC的话比较浪费,不知道还有没有其它取巧的方法?

redroof 发表于 2015-3-19 13:35:00

sme 发表于 2015-3-19 12:38
说得没错,只是这种方法需要一个16倍频电路,或是16倍PLL电路。FPGA无所谓,ASIC的话比较浪费,不知道还 ...

不用的。
有小数分频
页: [1]
查看完整版本: 讨论一下UART波特率分频的问题,非16倍整数时怎么做?