UARTの動作
なんだかずっとやってるネタなのだけれど...
UARTの受信について。
かなりノイズの乗ってくるシリアル信号を扱うのだけど。
送信側では、ノイズで失われる分を見越して、何度も同じデータパケットが送られてくるようになっている。
どれか一つでも上手く取れればokといった感じ。
これが、ソフトウエアで実装しているUARTで受ける分には、なんとか受信できていたのだけれど、ハードウエアUARTに切り替えると、さっぱり受信できなくなる。
ダミーの信号で受信動作をさせる分には、ソフトウエア実装でもハードウエア(ペリフェラル)実装でも、まったく問題ない。
なぜか、実際の信号を入れると、ペリフェラルではほとんど受信できなくなる。なぜだ?
UARTのRxに信号を入れるとダメだけれど、そのピンを入力ポートに設定して、インターバル割り込みでサンプリングして処理すると、ぽろぽろとデータが出てくる。
当然、ボーレートなどはそろえているんだけど...
物はいつものSTM32L151.
あれこれ調べても原因が良く分からない。
------
まあソフトウエアUARTならば、なんとか動くので、長らくほったらかしだったのだけれど。
あるときSTM32のリファレンスマニュアルを読んでいて気になる記述が。
USARTの受信は、16倍のオーバーサンプリングを行い、各ビットは8番目から10番目のクロックエッジでサンプリングされて、そのパターンが000か111でなければエラーとして処理されるとある。
エラー時には、受信割り込みは発生しない、とも。
しかもスタートビットのセンシングも、ただのエッジじゃなくて、結構厳しいビットパターンを使っているようだ。
...これっぽいなあ。
1パケットは20キャラクタくらいあるんだけれど、途中でエラーが出るとパケットごと破棄するから、ちょっとしたノイズで、全部ご破算になって、パケットが受信できないのかも。
ソフトウエアUARTは、スタートビットはただのエッジ検出だし、各ビットサンプリングも1回しかしないから、意外とうまくいっているのかな。
(実際の処理でのビットデータ化けは、もっと上位のレイヤーで処理するので、エラーが含まれていても受信できたことにはなる。)
------
そういえば、STM32でシステムを作る前には、LPC2000のCPUボードでテストしたんだけど、そのときは、普通にペリフェラルUARTで受信できていたような覚えが。
lpcは、STM32ほど、厳格なエラー検出をしてなかったんだろうなあ。
ちょっとこの方法で実装を試してみる。
となると、ソフトウエアUARTでも、複数サンプリングをして、エラーで弾くんじゃなくて多数決とかでレベルを決定するようにすれば、もっと受信できるパケットが増えるんじゃないかな。
------
STM32のUSARTなんて、分かってるつもりなので、いまさらちゃんとマニュアルを読むことも少ない。
目を通したとしても、各レジスタの説明くらいなので、すっかり見落としている。
高機能化する内蔵ペリフェラルだけれど、よくよく動作を検証しないと、思うとおりに動かせないなあ、と言う話。
| 固定リンク | 0

コメント