UART

結局、カメラ側はPICがあるからいいけど、FG(FrameGrabber)側はFPGAしかついていないので、何にしても、FPGAでUARTを送受信する必要がある。

それが分かった私は、UARTについて調べました。

元々、モデムなどを使った事があるので、聞き覚えのある言葉も多かった。(bpsとか)

TTLRS232Cみたいなものだと言う事が分かりました。

 

次のような物だと言う事でした

⭕️ 信号が送られていない時は、信号はHighをキープ

⭕️ 信号が送られたら信号は必ず一度Lowに落ちる

  信号がLowになったら、そこからは受信処理を行う 

⭕️ 送受信で以下の項目を決めておく

 ≫ ビットレート:9600bpsと決める

 ≫ ビット数:8bitと決める

 ≫ パリティ:なし

 ≫ ストップビット:1

 この後何度もUARTを設定しましたが、ビットレート以外は、ほとんどこの設定でした。ビットレートも迷ったら9600bpsにしてました。

⭕️ データはスタートビット(Low),データ x8bit, ストップビットの並びになる

⭕️ LSB(下位ビット)からMSB(上位ビット)の順番に並ぶ

⭕️ 1ビットの長さは104.2usec(9600bps)

⭕️ データはスタートビット(Low),データ x8bit, ストップビットの並びになる 

 

例えば、0x0F(00001111)と言うデータを送りたければ最初に0(スタートビット)を送り、その後11110000、そして最後に1を送る

 

今はIPコアがある事を知っているので、自分で記述する必要もないですが

当時の私はHDLで手書きしました

送信の時は一方的にデータを順番に送るだけなので、悩むことも特にありませんでした。

受信はちょっと厄介でした、しっかりやっていたらもう少し厄介だったと思います。

🔷 待ち受け状態で待つ

🔷 LOWになった瞬間にカウンタをスタートする

🔷 5.2usecでもう一度LOWであることを確認する

🔷 10.4usec毎に信号のレベルをチェックしてBit0からBit7へ順に格納

🔷 109.2usecがLowなら、データを破棄、Bit0がHighならFIFOへ格納

実はこの手順は、いろいろと問題があります

UARTは5%まで誤差を許します。

逆に言えば、5%の誤差が出ていないかを確認する必要があるので

各ビットの前後500nsec程度の間、同じ値をキープしているかを確認する必要があり

エラーを返さないといけません

ただ、今回はカメラとFGはセットで私が作っていますので、エラーは特に起きませんし

エラーが起きた場合も、ソフトウェアでリカバリできるので、簡潔に作りました

UARTを作ったと言うよりも、UARTのルールを利用させてもらったような感じでした。

 

f:id:info-akiron-com:20200927124823g:plain

UART