忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

RX220で簡易I2C(受信編)

送信編にて初期化に間違いがありました。
通信に使用する端子はオープンドレイン出力に設定してください。
また、送信・受信の許可/禁止は個別に行わず、一度に変更してください。

初期化ができたものとして、とりあえず割込み無しで受信動作を確認します。
引き続き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.cintSCI_rx220.h)を
使用しました。
シリアル通信を使うのにクロックの設定変更(hwsetup_rx220.chwsetup_rx220.h)と
タイマ設定(intCMT_rx220.cintCMT_rx220.h)も使いました。

次回は割込み対応を行います。
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性

最新コメント

[02/26 とし]
[02/25 ぼんどF博士]
[02/25 とし]
[10/25 ぼんどF博士]
[10/18 ss400]