動作環境
MSP430
Tektronix TDS 2024C (200 MHz, 2GS/s)
とあるI2Cセンサ
とあるI2Cセンサからデータを読み出すコードを実装中。
I2Cの処理はソフトウェアで実装する。
プロトコルは以下。
- start conditionを生成する
- 7bitのslave addressを送信
- ACKを受信
- 8bitのデータを受信
- ACKを送信 (続きのデータ読取があるという意味)
- 8bitのデータを受信
- NAKを送信 (続きのデータ読取がないという意味)
- stop conditionを生成する
本来、Low/Highが0または3.3Vとなるはずであるが、中途半端な電圧(2Vなど)が出る状況が続いた。
Raspberry Piで同じI2Cセンサを扱ってSCK, SDAの波形を確認し、それを再現するMSP430での動作を実装し、ほぼ動くようになった。
そこで分かったことは、SDAの入出力方向の切替タイミングをあやまると、中途半端な電圧になるということ。
intermediate levelで検索して以下を見つけた。
It's a familiar problem when the master drives pins hi and lo instead of Hiz and lo.
センサとマスター(MSP430)とで電圧のhigh,lowの引っ張り合いになり、中途半端なレベルになっていたという感じがする。
それは、適切なタイミングで入出力方向を切り替えることで、回避することができた。