8250互換USARTのプリスプリッターパラメーターの計算

今夜、プリスプリッターのパラメーターを効率的に計算する方法についてのおとぎ話をお話します。これは通常、USARTポート、特にIntel SoCで使用される8250互換ポートのクロック周波数を設定するために使用されます。





現時点では、分数プリディバイダーを備えたUSARTを使用するIntel SoCのラインが少なくとも2つあります

  1. メドフィールド、クローバートレイル、タンジール
  2. BayTrail、ブラスウェル


それらの違いは何ですか、少し後で説明します。



以下は、 Fusart -USARTクロック周波数とボー - ボーレートの計算に使用される式です。













残り

Frefはプリセパレーターの前の周波数、 mは分子、 nはプリセパレーターの有理数の分母、プリスケーラーフザートを除算た整数、 DLABは8250互換チップで表される16ビット除算器です。



セット全体から、2つの量、つまりFrefbaudのみがわかります。 プリスケーラーの値は通常16に等しく、一部のチップではそれを変更する可能性がありません(これがIntel SoCラインを互いに区別するものです)



プリスケーラーの計算





本格的なPLLではなく、フラクショナルプリスケーラを使用しているため、 (1)













したがって、すでにプリスケーラ値を計算できます

prescaler = 16 fusart = baud * prescaler if fref < fusart: if fref >= baud: prescaler = fref / baud else: prescaler = 1 fusart = baud * prescaler
      
      







フザート計算





前の部分は、満たされていない場合にのみ機能します(3) 。 そうしないと、 Fusartは、要求されたかなり低いビットレート(110ボーなど)でFrefに比べて非常に低くなることがあります。



また、通常、分周器の分子と分母は同じ幅(ビット単位)であるため、それらの不一致を制限するとよいでしょう。 これを行うには、 Fusartを可能な限りFrefに持ち込みます。

 fusart <<= int(math.log(fref / fusart, 2))
      
      





なぜこの近似が選択されるのですか? 問題は、 DLABオーバーフローがあり、それが16ビットしかない場合、2のべき乗を使用すれば、最も単純なビット操作でこれを追跡できるということです。



分母キュー





明らかに、今(1,2)から、単純な割合が続きます











したがって、前除数の有理数の分子と分母を簡単に計算できます。

 divisor = gcd(fref, fusart) n = fref / divisor while n > (2 ** width - 1): divisor <<= 1 n >>= 1 m = fusart / divisor
      
      







ここで、 は分子と分母のビットです。



それだけです。 Pythonのソースコードは、GitHub Gistで入手できます(既に何度か更新されており、将来更新される可能性があります)。



Fref = 50MHz、幅= 24ビットの計算例
1) m 、2) n 、3) プリ スケーラー 、4) Fusart 、5)謎の数字、6)伝送速度のリスト、括弧内の値DLABの形式出力します。



24 25 12 48000000 64000000 4000000(1)

49 50 14 49000000 56000000 3500000(1)

4 5 16 40,000,000 40,000,000 2,500,000(1)

16 25 16 32,000,000 32,000,000 500,000(4)、1,000,000(2)、2,000,000(1)

24 25 16 48000000 48000000 1500000(2)、3000000(1)

2304 3125 16 36864000 36864000 576000(4)、1152000(2)

8192 15625 16 26214400 26214400 50(32768)、200(8192)

9216 15625 16 29491200 29491200 1800(1024)、57600(32)、115200(16)、230400(8)、460800(4)、921600(2)、1843200(1)

12288 15625 16 39321600 39321600 75(32768)、150(16384)、300(8192)、600(4096)、1200(2048)、2400(1024)、4800(512)、9600(256)、19200(128)、 38,400(64)

45056 78125 16 28835840 28835840 110(16384)

274432 390625 16 35127296 351229296 134(16384)





上記のアルゴリズムは単純で高速ですが、それほど正確ではありませんが、目標を満たしていることに注意してください。



All Articles