失礼いたします。
MPU6050の慣性計測ICを用いるために簡易I2Cをコード生成にて使用できないかを実験中です。
データシートや他チップ用サンプルを覗いた限り下記に示すMain文で読めるものと考えたのですが上手くいきません。
データの行き来はE1エミュレータにて確認していますがR_IIC11_Master_Sendの各種割り込みは起動しています。
しかし、R_IIC11_Master_Receiveの完了割り込みは起動したりしなかったりするうえ、帰ってくるアドレスには何も入力されていません。
//起動txd[0] = 0x6B*2;txd[1] = 0x00;R_IIC11_Master_Send(DeviceID,txd,2);完了割り込み待ち while (1U) {//IC読み出しメモリ番地指定 txd[0] = 0x3B*2; R_IIC11_Master_Send(DeviceID,txd,1);完了割り込み待ち//IC読み出し要求 R_IIC11_Master_Receive(DeviceID,rxd,14);完了割り込み待ち50ms待機 }
大変恐縮ですが、ご回答よろしくお願いいたします。
チョコです。
「通信完了待ち」を「完了割り込み待ち」で行われているようですが、INTIIC11は1バイト転送完了で発生します。
R_IIC11_Master_SendやR_IIC11_Master_Receiveではスレーブアドレスの送信完了で発生するのですが、ここらは理解していますか。
これまでも何度も言っていますが、コード生成の通信関係の処理には大いに問題があります。
そこで、個人的にはコード生成は初期設定だけしか使いません。APIは全て自前でやっています。サンプルプログラム等の以下のプログラムが参考になるかと思います。
プロジェクトをzipにして添付してもらえれば、具体的なコメントができるのですが。
以上
チョコ様
お返事ありがとうございます。URL先を拝見いたしました。量が多いので理解するのに少々かかりそうです。
プロジェクトですが、多くは記述していないためこの場に記述いたします。投稿時から割り込み部分をディレイに変えております。
void main(void){ R_MAIN_UserInit(); /* Start user code. Do not edit comment generated here */
txd[0] = 0x6B*2;txd[1] = 0x00;IMU_IIC11_Send(DevicdID,txd,2);
while (1U) { IMU_IIC11_Receive(DevicdID,MPU6050_AX*2,rxd,14); tag += 1; } /* End user code. Do not edit comment generated here */}
void IMU_IIC11_Send(uint8_t adr, uint8_t * const tx_buf, uint16_t tx_num){ int i; SCR03 = 0xC000; R_IIC11_StartCondition(); SIO11 = adr & 0xFE; wait_5us(); for(i = 0; i < tx_num; i++) { SIO11 = tx_buf[i] & 0xFE; wait_5us(); } R_IIC11_StopCondition();}
void IMU_IIC11_Receive(uint8_t adr, uint8_t mem, uint8_t * const rx_buf, uint16_t rx_num){ int i; SCR03 = 0xC000; R_IIC11_StartCondition(); SIO11 = adr | 0x01; wait_5us(); R_IIC11_StopCondition(); R_IIC11_StartCondition(); for(i = 0; i < rx_num; i++) { SIO11 = (mem + 0x02 * i) | 0x01; wait_5us(); rx_buf[i] = SIO11 & 0xFF; } R_IIC11_StopCondition();}
取り急ぎ回答を致します。
チョコ said:なぜかRAが「0x6b」ではなく、「0x6B*2」と異なっています。
の部分につきましてデータシート内のシリアルデータレジスタを15-9までが分周、
7-1が受送信用データ、0がR/W判別と考えておりました。
チョコ said:データ受信でもSCR03を0xC000にしているのは間違いです
上記についても同様でシリアルデータレジスタのみでI2C制御可能と考えておりました。
そのため受送信をオンにしておけばよいものと…
現在は示して頂いたサンプルをIIC11に変えて試行中です。
割り込み(INTIIC11、INTTM0)がうまく起動しないためデータシートとにらめっこをしております。
>割り込み(INTIIC11、INTTM0)がうまく起動しないためデータシートとにらめっこをしております。
Ouraさん、その後どうなりましたでしょうか。わりこみは許可されているのでしょうか。また割り込みのマスクは解除されているでしょうか。もう少し詳しい情報があれば、コメント可能なのですが。
(INTTM0は存在しないので、INTTM00か何かでしょうか。)
MPU6050のレジスタ・マップで確認したら、0x6Bは、以下に示すように、"PWR_MGMT_1"で初期値は0x40になっていて、SLEEPになっているようです。最初に行うのは、これをクリアしてスリープをする処理のようです。
RL78/G13のSDRレジスタとは無関係です。
もしかしたら、MPU6050は下の写真のボードではないですか。
回路図は見つけられませんでしたが、右端の5PINはレギュレータだと思います。VCCには5V電源を接続し、レギュレータで3.3VをMPU6050のVDD(およびVLOGIC)に供給しているようです。MPU6050は以下のような動作条件になっています。
気になったのが、簡易IIC11のSCL11はオープンドレインではなく、通常のCMOS出力です。RL78/G13の簡易IIC11と接続するなら、RL78/G13は3.3Vで動作させて、MPU6050のボードは5Vを供給する必要がありそうです。RL78/G13のSCL端子を調べてみると、簡易IICでのSCL01、SCL11、SCL21にはオープンドレインに設定するレジスタがなく、SCL00、SCL10、SCL20はオープンドレインに設定するレジスタがありました。
ここらは、大丈夫でしょうか。
返信が遅れてしまいました。
時間関係の割り込み周りは起動するようになりましたが、ACKが返ってこないためその後の処理に進まないといった状況です。
7bitと8bitの違いによるものかと睨んで試行錯誤していますが頂いたプログラムから作成しても状況に変わりは殆どないです。
ボードは以下のものを使用しております。3.3V系で問題ないと考えております。
www.digikey.jp/.../6588492
3.3Vのレギュレータが内蔵されているようなので、信号レベルは3.3V系ですが、ボードのVINは5Vを供給する必要があるはずですが、どうなっていますか。VINに3.3Vを供給した場合にはMPU6050が何Vになるのか不明です。ここらがACKが戻らない理由かもしれませんね。
CSI11では、SCLはCMOS出力なので、RL78/G13の電源電圧で出力されます。これは、ハードウェアの問題で、ソフトの設定では何も対応できません。
時間を見て、部品の調達をして、ちょっと動作確認をチェックしてみます。
QB-R55F100LEのIIC11にMPU6050を接続して動作確認を行ってみました。3.3Vできちんと動作しているようです。
プロジェクトはできるだけ、コード生成された内容を使いました。IIC11関係では、IIC11の割り込み処理(r_cg_serial_user.c)に通信完了フラグ(g_iic11_status)を追加し、r_iic11_interruptのcallback処理でg_iic11_statusに通信結果を設定しています。
このフラグに関して、クリアする関数(R_IIC11_Clear_status)、読み出す関数(R_IIC11_Get_status)、通信完了を待つ関数(R_IIC11_Wait_finish)も追加しています。
このフラグを使った通信完了まで待つような簡易IICの読み書き関数をr_cg_serial.cの後ろのuser codeに準備しました。
これを用いて、MPU6050を制御する関数を(MPU6050_LIB.c)に初期化関数と測定結果の読み出し関数を準備しています。
main処理としては、初期化でMPU6050のスリープを解除し、1秒ごとに読み出すだけでの簡単な処理です。読み出した結果を以下に示します。
データの妥当性等は検証していません。とにかく、IIC11を使って、MPU6050から計測結果を読み出せることを示しています。
通信でエラーが検出されたら、エラーLEDを点灯するようにしていますが、いまのところエラーは検出されていません。
コード生成されたAPIのR_IIC11_StartConditionに問題があったためにリスタートできなかったので、読み出し処理でレジスタアドレスを指定した後でいったんストップコンディションを発行するようにして対応はしました。
動作確認したプロジェクトのzipファイルを添付しておきます。参考にしてください。
MPU6050_IIC11.zip
ファイルありがとうございます。
動作を確認できました。
コメントが丁寧に差し込まれていて何をすべきかの助けになりました。
工作の対象にするには難易度が高くて諦めてしまうところでしたので本当に感謝いたします。
重ね重ね失礼いたします。
本機におけるI2Cの動作を理解しようと試行錯誤しておりIICA0にも手を出しているところです。
以下画像はIICA0(SCLA0、SDAA0)にて別個体のMPU6050を接続し、頂いたプログラムに追加したものを動かした結果です。(ブレッドボードの都合上Z軸まわりに180°回転しております。)
ひとまずマスターモードでの動きは同様のアルゴリズムで問題ないように感じました。
これを試しにスレーブモードへ変更し、別個体のRL78/G13をマスターモードで動かして接続したところ
またもやマスター側でACKが返ってきませんでした。
ここでは画像にて得られた結果からマスター側には問題ないとし、スレーブ側にはMPU6050の生データをそのままIICA0のメモリに書き込むといった中継処理の実現を目指しています。
この件でお聞きしたいのは、生成されるR_IICA0_Slave_SendもしくはR_IICA0_Slave_receiveにも何らかの問題もしくは同様の問題を抱えているのでしょうか。
スレーブ動作時のアドレスとIICA0エラー時については処理済みです。
>生成されるR_IICA0_Slave_SendもしくはR_IICA0_Slave_receiveにも何らかの問題もしくは同様の問題を抱えているのでしょうか。
最近のバージョンアップしたものは使ったことはありません。
しかしながら、簡易IICのAPIから判断すると、通信完了はサポートしていないと思われるので、そのための処理は簡易IIC と同様に追加する必要はあるかと思います。
なお、IICA0については、シリアル・インタフェースIICAのマスタ送受信とスレーブ送受信のアプリケーションノートがあります。R01AN2759JJ0201がマスタで、R01AN2760JJ0201がスレーブです。単純な送受信ではなく、普通のセンサのように内部にレジスタをもち、コマンドも持つようになっているようです。こちらを参照してみてください。
提示された情報からはコメントできるのはこの程度です。
回答ありがとうございます。
アプリケーションノートの方を参考に挑戦しようと思います。