送信編にて初期化に間違いがありました。
通信に使用する端子はオープンドレイン出力に設定してください。
また、送信・受信の許可/禁止は個別に行わず、一度に変更してください。
関連:
I2Cとは送信編割込編送信編で初期化ができたものとして、とりあえず割込み無しで受信動作を確認します。
RX220ハードウェアマニュアルの「」
を参考にプログラムを作成します。
※2023/02/25 資料の参照先を明記引き続き
DRV8830に指令を送ります。
DRV8830の取説に従って、通信の順は
・スタートコンディション
・スレーブアドレス(0xC8)
・サブアドレス(0x00)
・リスタートコンディション
・スレーブアドレス(0xC9)
・データ受信
・ストップコンディション
となります。
<設定>char recv_i2c(){
int i;
char recv_data;
//スタートコンディションの発行 SCI9.SIMR3.BIT.IICSTIF=0;
//フラグクリア SCI9.SIMR3.BIT.IICSTAREQ=1;
//スタートコンディション生成指令 SCI9.SIMR3.BIT.IICSDAS=0x1;
//SSDAn端子は開始条件、再開始条件、停止条件 SCI9.SIMR3.BIT.IICSCLS=0x1;
//SSCLn端子は開始条件、再開始条件、停止条件 while(SCI9.SIMR3.BIT.IICSTIF==0);
//開始/再開始/停止条件生成が完了するまで待機 //データ送信準備 SCI9.SIMR3.BIT.IICSTIF=0;
//フラグクリア SCI9.SIMR3.BIT.IICSDAS=0x0;
//SSDAn端子はデータ出力 SCI9.SIMR3.BIT.IICSCLS=0x0;
//SSCLn端子はクロック出力 //データ0(アドレス)送信 SCI9.TDR=0xC8;
//宛先アドレス for(i=0;i<100;i++);
//ちょっとだけ空ループ while(SCI9.SSR.BIT.TEND==0);
//送信完了まで待機 //データ1(サブアドレス)送信 SCI9.TDR=0x00;
//サブアドレス for(i=0;i<100;i++);
//ちょっとだけ空ループ while(SCI9.SSR.BIT.TEND==0);
//送信完了まで待機 //リスタートコンディションの発行 SCI9.SIMR3.BIT.IICSTIF=0;
//フラグクリア SCI9.SIMR3.BIT.IICRSTAREQ=1;
//リスタートコンディション生成指令 SCI9.SIMR3.BIT.IICSDAS=0x1;
//SSDAn端子は開始条件、再開始条件、停止条件 SCI9.SIMR3.BIT.IICSCLS=0x1;
//SSCLn端子は開始条件、再開始条件、停止条件 while(SCI9.SIMR3.BIT.IICSTIF==0);
//開始/再開始/停止条件生成が完了するまで待機 //データ送信準備 SCI9.SIMR3.BIT.IICSTIF=0;
//フラグクリア SCI9.SIMR3.BIT.IICSDAS=0x0;
//SSDAn端子はデータ出力 SCI9.SIMR3.BIT.IICSCLS=0x0;
//SSCLn端子はクロック出力 //データ2(アドレス)送信 SCI9.TDR=0xC9;
//宛先アドレス for(i=0;i<100;i++);
//ちょっとだけ空ループ while(SCI9.SSR.BIT.TEND==0);
//送信完了まで待機 SCI9.SIMR2.BIT.IICACKT=1;
//NACK送信(送信/最終データ受信用設定) //データ3 受信 SCI9.TDR=0xFF;
//受信用 for(i=0;i<100;i++);
//ちょっとだけ空ループ while(SCI9.SSR.BIT.TEND==0);
//送信完了まで待機 recv_data=SCI9.RDR;
//受信データを読み取り //ストップコンディションの発行 SCI9.SIMR3.BIT.IICSTPREQ=1;
//ストップコンディション SCI9.SIMR3.BIT.IICSDAS=0x1;
//SSDAn端子は開始条件、再開始条件、停止条件 SCI9.SIMR3.BIT.IICSCLS=0x1;
//SSCLn端子は開始条件、再開始条件、停止条件 while(SCI9.SIMR3.BIT.IICSTIF==0);
//開始/再開始/停止条件生成か完了するまで待機 //送信終了の後処理 SCI9.SIMR3.BIT.IICSTIF=0;
//フラグクリア SCI9.SIMR3.BIT.IICSDAS=0x3;
//SSDAn端子はハイインピーダンス状態 SCI9.SIMR3.BIT.IICSCLS=0x3;
//SSCLn端子はハイインピーダンス状態 return recv_data;
}
送信編で作った関数と併用して、「初期化→送信→受信」の順に実行して
設定した値(73:0x49)が戻ってくれば成功です。
受信許可が正しく実行できていない(送信許可と受信許可を個別に設定している)と受信データが0になります。
オープンドレイン設定ができてないと受信データが255になります。
受信データの確認には
設定プログラムからシリアル通信(
intSCI_rx220.c、
intSCI_rx220.h)を
使用しました。
シリアル通信を使うのにクロックの設定変更(
hwsetup_rx220.c、
hwsetup_rx220.h)と
タイマ設定(
intCMT_rx220.c、
intCMT_rx220.h)も使いました。
次回は割込み対応を行います。
1. 教えて下さい。
以下の部分、受信するのに送信しているのはどういう意図でしょうか。
よろしくお願いします。
//データ3 受信
SCI9.TDR=0xFF; //受信用
for(i=0;i<100;i++); //ちょっとだけ空ループ
while(SCI9.SSR.BIT.TEND==0); //送信完了まで待機