« TTL ICのソース電流 | トップページ | stm32f373 »

2013年5月12日 (日)

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なんて、分かってるつもりなので、いまさらちゃんとマニュアルを読むことも少ない。
目を通したとしても、各レジスタの説明くらいなので、すっかり見落としている。

高機能化する内蔵ペリフェラルだけれど、よくよく動作を検証しないと、思うとおりに動かせないなあ、と言う話。

|

« TTL ICのソース電流 | トップページ | stm32f373 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: UARTの動作:

« TTL ICのソース電流 | トップページ | stm32f373 »