組み込み開発

Embedded development

I2C通信のアドレス表記にはご注意を!

2021/11/24 発行

私が新人研修時に躓いた出来事について述べたいと思います。
新人の方から若手の方に読んで頂き、I2C通信設定の参考になれば幸いです。

問題発生

それは、新人研修の課題の1つであるI2CのDriver開発で統合試験を実施していた時の出来事でした。
統合試験を実施していると・・・

私「I2CのDriverが想定通りの動作をしてない?!」


これまで多少の問題はあったものの開発は順調に進んでいたため、「ここにきて、 なぜ ?!」という気持ちでしたが、原因の切り分けに取り掛かることにしました。

原因調査

まず、I2Cの通信波形を確認すると、受信側からの応答が来ていないことがわかりました。
正常に通信が行われている場合は、 相手側からACKという応答が返ってくるのですが、波形ではNACKが返されていることが確認できたのです。

NACKが返ってきているということは、スレーブアドレスやビットレート、レジスタ設定値等が間違っているものだと考え、見直しましたが、特に問題は見つかりませんでした。

原因がわからず困り果てたところに、先輩から

「通信相手のデバイスのマニュアル、確認した?」


とのアドバイスを頂くことができました。

私は、通信に必要なスレーブアドレスやビットレートは事前に提示されていたため、マニュアルを確認していませんでした。

事前に提示されていたスレーブアドレス(0x40)

そのため、もらったアドバイス通りにマニュアルを確認したところ、スレーブアドレス 0x40 の横に気になる記載を見つけました。
その記載というのは 「7bit」 です。
今回提示されていたスレーブアドレスは 0x40 のため、8bit表記であると考えて 0bit目 をRead(1)/Write(0)と変更していました。

当初想定していたスレーブアドレス0x40にRead/Write情報を加えたもの

しかし、誤りであることがわかり 7bit のスレーブアドレス(0x40)を左に 1bit シフトし、 0bit目 にRead(1)/Write(0) を加えて再度通信を行いました。

スレーブアドレス0x40を左に1bitシフトさせRead(1)/Write(0)情報を加えたもの

すると、ACKが返ってくるではないですか!
その後の通信も正常に行われている事が確認でき、無事に問題を解決することが出来ました。

今回の失敗から他のデバイスマニュアルを確認したところ、I2Cのアドレスの表記方法は統一されておらず、7bit 表記と 8bit 表記と様々あることがわかりました。
また、16進数で表記されているものから2進数、10進数とバリエーションも豊富なため、勘違いが発生しやすく注意が必要です。

まとめ

研修とはいえ、仕様の分析が甘く、憶測で判断していたために周辺デバイスのマニュアル確認を怠ってしまいました。その結果、マイコン側の動作に影響がでてしまい「原因調査」と「修正作業」という無駄な時間を要してしまいました。
周辺デバイスのマニュアルを確認せずに進めてしまうと、結果的に作業の手戻りが発生してしまいます。

本研修を通して、周辺デバイスのマニュアル確認の必要性を理解することが出来ました。
この件以来、設計に入る前には必ず、仕様と合わせて周辺デバイスのマニュアルを確認することを心掛けています。

技術本部に関するお問い合わせはこちら

フォームでのお問い合わせはこちらから