Harmony Ver 1.07.01で記述
前書き
HarmonyでDynamicタイプのドライバ関数が追加されたので,その使い方を解説する.
まだ頻繁にバージョンアップしているので,今後変更になる可能性が高い.
基本的なI2C通信の仕方は,以下の順序となる.
- DRV_I2C_Initialize関数で,I2Cモジュールの初期化を行う(system_init.c内にHarmonyが自動生成している)
- DRV_I2C_Open関数で,I2Cモジュールを開き,ハンドル取得
- DRV_I2C_Transmit関数で,I2Cデータ送信(バッファハンドル取得)
- DRV_I2C_Receive関数で,I2Cデータ受信(バッファハンドル取得)
-
DRV_I2C_TransferStatusGet関数で,上記バッファハンドルのステータス(通信完了など)を取得
必要に応じて通信完了まで待機
ここで,しっかりハマるポイントがある.
DRV_I2C_Transmit関数などは,引数に送受信先のアドレスを設定し,実際に送受信を行うわけだが,I2C通信はそのアドレスは7bitまたは10bitである.
7bitアドレスの場合,8bitアドレスの上位7bitがアドレスで,下位1bitは送受信先のデータの方向を指定する(’0’=Write,’1’=Read).
DRV_I2C_Transmit関数は送信するので,7bitアドレス+’0’の8bitとなることを期待するが,実際は引数に設定された8bitすべてを送信先のアドレスとして設定してしまう.
例えば,スレーブアドレス0x20の場合,送信データは0x40となるべきである.よって,スレーブアドレスには0x40を指定するが,誤って0x41を設定すると,送信の関数であるが命令としてはスレーブからの受信(Read)となってしまい,DRV_I2C_Transmit関数は来ないデータを待ち続けてハングアップしてしまう.
DRV_I2C_Transmit関数内部で7bitマスク+1bit左シフトしてくれたほうが,このようなミスがなくせるのに・・・.
DRV_I2C_Open関数
DRV_I2C_Transmit関数
DRV_I2C_Receive関数
DRV_I2C_TransferStatusGet関数
注意
ここで紹介したプログラム記述例は,HarmonyにおけるI2Cの設定で,Interrupts Modeに設定されていないと動作しない.
Interrupt Modeを使用しない場合は,サンプルでI2C通信完了を待つwhile文を削除し,コールバック関数かポーリングで送受信完了を確認し,ステートマシンを組んでI2C通信する必要がある.
コメント