2017年2月25日土曜日

STM32F1のI2C ~NVICを添えて~


割り込み駆動のI2Cがやっとそれなりに動くようになりました。オレンジがFreeRTOSのIdle Hookでトグルしているピンで、I2Cの転送中にもIdleタスクが動いていることがわかります。
 STM32F1はStdPeriphLibという、メモリマップドのコンフィグを簡単に確認・設定できる関数群が用意されていて、ハードウェアの制御は基本的にこれらを使って操作するわけですが、ペリフェラルによって簡単に設定できるものもあれば、なかなかに難しいものもあります。いままで使ったペリフェラルの中でも、I2CとNVICの組み合わせはダントツに難しいと思います。
 特に一部のフラグは通常のC言語処理とまったく違う動きがあり、「特定のレジスタを読むとクリアされる(≒1回フラグチェックをするだけで情報が破壊される)」というのがあり、他にも「Aはaに対してtrueだが、Bはbとaに対してtrue」という戻り値をとる関数もあります。しかもBのチェックを行うと情報が破壊されるためAのチェックが行えない(逆も同様)、といった組み合わせになっています。
 このあたりが非常に面倒で、StdPeriphLibを使わずに、直接ビットを叩いたほうが楽だと思います。

 まだ最低限必用な割り込み処理しか行っていないのですが、しばらくはI2C+NVICは触りたくありません。「1回読むと情報が破壊される」ってデバッグが非常にやりずらい。量子力学とかもこんな苦労なのかなぁみたいな思いが浮かんできます。

 それにこれほどの苦労をしてなおまだ足りないのですから、I2Cセンサを使うよりSPIで叩けるセンサを探すほうが遥かに簡単だと思います。特にSTMのセンサは大抵がSPI/I2Cを1つのセンサで兼用していますし。もしかしたら自分のところのマイコンでI2Cが使いづらいからSPI/I2Cが兼用なのでは…と疑ってしまうほどです。

 SPIはあんまり厳密にチェックされていないので、バスにノイズが乗っても無理やり続行できちゃいますが、I2Cはノイズなどでバスがビジーとなると以降復帰できなくなります。そのあたりの動作を確認しておかないと怖くて使えないのですが、どーやったらいいんだろう。業務用だとI2Cにノイズ入れる専用の機材とか売ってるのかな。
 以前にそのあたりでかなり苦労してるので、ちょっと疑心暗鬼気味です。

0 件のコメント:

コメントを投稿