RX220でI2C通信
おなじみRX220でセンサからの信号を読み取りたかったのでI2C通信をしてみた. ソースコードはGitHubで公開してみる.
これのI2C通信の設定としては下の通り
マスタモード
クロック周波数 400 kHz
端子 P16,P17
https://github.com/kiriko-shokunin/robot-RX220/blob/master/sorce/RX-I2C.c https://github.com/kiriko-shokunin/robot-RX220/blob/master/sorce/RX-I2C.h
このの使い方は,プロジェクトにそれぞれのファイルを入れた状態でまず割り込み関数内で下のように関数を呼び出す.
そして初期化をする.
init_riic0();
これで初期化関数を呼び出すことで周辺機能の設定とピンの設定が完了する.
送信
送信するときは,
int iic0_send(char* 送信するデータ配列の先頭アドレス, int データ数,int スレーブアドレス);
のようにする. このとき送信データ数はアドレスを含めた値なので
アドレス値+R/W + 送信データ
となっている.また,この関数は送信のみをするときに使用するもので受信はできない. そして,データを送信中に別のデータを送信しようとすると「忙しいから無理」と断る仕様になっている.
つまり,先に送信している通信が優先される.そのため送信後は十分に時間を空けてから再度送信関数を呼び出す必要がある.
受信
受信をするときは,2回に分けて受信を完了する.まずスレーブに指示をだすために送信を行い,その後受信したデータを読み出す関数でデータを読み出す.
iic0_reqest_send(char* 送信データの先頭アドレス, int 受信データ数 , int スレーブアドレス);
この関数は送信データはスレーブアドレスと送信データの2バイトのみ送信する仕様としてある.送信してから受信が終わるまでの時間が経過した後に受信したデータを読み出す関数を呼び出す.
受信データは
iic0_receve(char* 受信データを代入する配列の先頭アドレス , int 読み出すデータ数);
とすることで読み出せる. ちなみに,受信データを読み出さないままで次のデータのリクエストを送信すると,データは破棄される.
そのうちソースコードの説明を追記できたら良いなぁと思ってます