忍者ブログ

Fグループ電子工作講座

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

RX220で簡易I2C(割込編)

なんとか通信できるようになったので割込み対応します。
詳細はアップしたファイルを見てください。(intI2C_rx220.cintI2C_rx220.h)
SH7125版と同じ関数で動くようにします。

関連:
I2Cとは
送信編
受信編

主な関数

簡易I2C初期化関数
void init_I2C();

I2Cへの書込み/読出し設定関数
void write_i2c(short* buff_address,char* data);
*buff_addressは受信データ格納先のポインタです。
受信する場合はshort型配列を指定してください。
受信しない場合はダミーのバッファまたはNULLを指定してください。

*dataSH7125版と同じ指令文字を格納します。

I2C処理完了確認関数
int check_i2c_fin();

割込みは以下の3つを使います。
intprg.cの該当箇所に登録してください。

エラー割込み(エラーが出たらクリアするだけ)
void SCI9_INT_ERI9();

受信割込み(受信完了したらデータをバッファにコピー)
void SCI9_INT_RXI9();

送信割込み(送信完了したら次のステップに進む)
void SCI9_INT_TXI9();


intprg.c内登録先

// SCI9_ERI9
void Excep_SCI9_ERI9(void){ SCI9_INT_ERI9(); }

// SCI9_RXI9
void Excep_SCI9_RXI9(void){ SCI9_INT_RXI9(); }

// SCI9_TXI9
void Excep_SCI9_TXI9(void){ SCI9_INT_TXI9(); }

コンディション発行完了割り込みは反応が早すぎて使い方が分からなかったので
今回使っていません。

その他説明

ウェイト機能を作成するのにタイマ割り込みを利用しています。
タイマ割り込み機能も有効にしてください。(intCMT_rx220.cintCMT_rx220.h)

裏で勝手に動く関数が幾つかあります。

init_I2C内にRX220内蔵のプルアップ機能を利用するために処理を作っておきました。
必要な場合は有効にしてください。


使ってみる

によってBMX055使用9軸センサーモジュールを動かしてみます。
I2Cで受信したデータをSCI1(ベースボードのRS232Cポート)から出力します。
メインプログラム

#include "iodefine.h"
#include "hwsetup_rx220.h"
#include "intCMT_rx220.h"
#include "intSCI_rx220.h"
#include "intI2C_rx220.h"

#include <stdio.h>


void main(void){
    char trans_buf_sci[255];
    static short recive_data[10];
    short acc;
    unsigned long timer;

    HardwareSetup();
    init_CMT0(1);
    init_SCI1();
    init_I2C();

    write_i2c(recive_data,"ST320F03SP");    //加速度レンジ初期化
    while(check_i2c_fin()==0);    //通信完了待ち(無くてもOK)
    write_i2c(recive_data,"ST321008SP");    //加速度帯域幅初期化(ローパスの事?)
    while(check_i2c_fin()==0);    //通信完了待ち(無くてもOK)
    write_i2c(recive_data,"ST321100SP");    //低電力スリープ周期?初期化
    while(check_i2c_fin()==0);    //通信完了待ち(無くてもOK)

    timer=getsystime()+50;
    while(1){
        if(    timer<getsystime()){
            timer=getsystime()+50;

            set_LED_R((getsystime()/500)%2);
            set_LED_G((getsystime()/500+1)%2);

            //加速度受信
            write_i2c(recive_data,"ST3202RS33RDSPST3203RS33RDSP");    //加速度X軸下位→上位を取得
            while(check_i2c_fin()==0);    //通信完了待ち
            acc =recive_data[1]*0x100;    //8bit桁上げ
            acc+=recive_data[0]&0xF0;    //下位4bitは不要
            acc/=0x10;                    //4bit桁下げ

            sprintf(trans_buf_sci,"%04X %04X acc:%d\n",recive_data[1],recive_data[0],acc);
            write_sci1(trans_buf_sci);
        }//50ms
    }//end while
}//end main

一時期、一定時間経過後の初回データ受信が失敗してFFしか戻ってこない謎の現象に
悩まされていましたが、今は落ち着いています。
相変わらずi2Cへの書込み後に空ループで待機しているので、割り込みの意味がない気が
しますが気にしない。
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性
自己紹介:

最新コメント