お世話になります。以前にもこちらで質問させていただいたのですが、再び別の内容について投稿させて頂きます。
https://japan.renesasrulz.com/cafe_rene/f/forum18/5233/rl78-g1d-i2c/29519#29519 以前の投稿はこちらです。
BT-RL-01 RL78/G1Dと6軸センサLSM6DS3の通信を簡易I2Cで実現させたいのですが、I2c no ACK のエラーが返ってきて上手くできません。
使用している環境はCS+ for CCです。
試しにセンサーを外した状態で、マイコンの出力信号をオシロでとってみたところ図の様になりました。
CH1がSDA,CH2がSCLです。電源は3.3Vの安定化電源を使用しています。
どうもSDAの波形が可笑しいようでhighは3.3Vに達しておらず、パルスとのこぎり波が合わさっているように見えます。
原因としてなにが考えられるでしょうか?よろしくお願いいたします。
また、I2C通信で使用しているスレーブのレジスタの値を読み取る関数を以下に載せます。そのほかはコード生成機能を使用しています。
uint8_t readRegister(uint8_t slave_addr,uint8_t r_addr, uint8_t * const buf_data,uint8_t buf_size){ /*flag RESET*/ error_status = MD_OK;
iic_flag_send = FALSE;
iic_flag_receive= FALSE;
/*address field send and waiting for completing*/ R_IIC00_Master_Send(slave_addr,r_addr,1); do{
if(error_status!=MD_OK){ R_IIC00_Stop(); break; } }while(iic_flag_send==FALSE);
/*receive data from slave and waiting for completing*/ R_IIC00_Master_Receive(slave_addr,(uint8_t *__near)buf_data,buf_size); do{ if(error_status!=MD_OK){ R_IIC00_Stop(); break; } }while(iic_flag_receive==FALSE); if(iic_flag_send==TRUE&&iic_flag_receive==TRUE&&error_status==MD_OK){ return 0; //success }else{ return 1; //error }}
チョコです。
波形を見ていて気付いたのですが,スレーブ・アドレスを間違えていませんか。
LSM6DS3のアドレス(110101xb)は7bitなので,RL78のIIC00では110101xybになります。
(ここで,xはLSM6DS3のSAD端子で設定した値,yはR/Wを指定する。)
波形を見ていると,7bitの値をそのまま送信しているように見えます。
スレーブ・アドレスとしては,LSM6DS3のデータシートのTable 11. SAD+Read/Write patternsの
右端の欄に書かれている値にしてください。
以上