■ PIC18F4520でAE-KXP84(3軸加速度センサ)とシリアル通信

概要

AE-KXP84とのシリアル通信に関する情報が少なかった為、 なんとなく公開してみました。

MSSP機能のあるPICと、C18コンパイラならある程度動くと思います。

他の環境でも、ある程度の参考になるはず。


動作環境

  • PIC18F4520[40MHz(10x4)動作]
  • AE-KXP84
  • C18コンパイラ

こんな感じでシリアル通信ができました。

kxp84 動作サンプル
(表示用LCDは、SD1602HULB-XAを使用しました)


ソースコード

なるべくシンプルに、ただ関数呼び出すだけで、
SPI、I2Cを同時に使えるようなものにしてみました。

ポートの繋ぎ方は、ソースコード初めのコメント文(Port Connecting〜)を参照してください。

ポート入出力設定や、I2Cの初期化等は関数内で済ませてあるので必要ありません。
ただし"i2c.h"と"spi.h"はインクルードしておいてください。

使い方としては、
unsigned char x, y, z;
kxp84ReadI2C(&x, &y, &z);
printf("%d %d %d", (int)x, (int)y, (int)z);
といった流れで加速度を取得(表示)できます。


/*----------------------------------------
Port Connecting
[AE-KXP84 - PIC18f4520]
Vcc(1) - Vdd
GND(2) - Vss
SCL/SCLK(5) - RC3/SCK/SCL(p18) [pull up(10k)]
IO_Vdd(6) - Vdd
SDA/SDO(7) - RC4/SDI/SDA(p23) [pull up(10k)]
ADDRO/SDI(9) - RC5/SDO(p24)
nCS(10) - RC6(p25)
Another - Do Not Connect
-------------------------------------------*/

//======kxp84 I2C test======//
void kxp84ReadI2C(unsigned char *x, unsigned char *y, unsigned char *z) {
    unsigned char data[6];
    
    //---Port Initialize---//
    TRISCbits.TRISC6 = 0;   //nCS Output mode
    PORTCbits.RC6 = 1;      //i2c mode [1]
    TRISCbits.TRISC5 = 0;   //ADDRO Output mode
    PORTCbits.RC5 = 0;      //programmable address bit [0]
    
    //---I2C Initialize---//
    OpenI2C(MASTER, SLEW_ON);
    SSPADD = 24;      //Clock = Fosc/(4*(SSPAD+1))  [400kHz]
    
    //---Register Address Set---//
    StartI2C();
    WriteI2C(0x30);   //kxp84 Write mode 0x30+0
    WriteI2C(0x00);   //Register Addless Set XOUT_H(0x00)
    
    //---Get XYZ Data---//
    RestartI2C();
    WriteI2C(0x31);   //kxp84 Read mode 0x30+1
    getsI2C(data, 6);
    NotAckI2C();
    StopI2C();
    
    //---Data Return---//
    *x = data[0];
    *y = data[2];
    *z = data[4];
    
    //---I2C End---//
    CloseI2C();
}

//======kxp84 SPI test======//
void kxp84ReadSPI(unsigned char *x, unsigned char *y, unsigned char *z) {
    unsigned char data[6];

    //---Port Initialize---//
    TRISCbits.TRISC6 = 0;   //nCS Output mode
    PORTCbits.RC6 = 1;      //nCS = 1
    
    //---SPI Initialize---//
    OpenSPI(SPI_FOSC_16, MODE_00, SMPMID);
    
    //---Get XYZ Data---//
    PORTCbits.RC6 = 0;
    WriteSPI(0x80);   //Register Addless Set XOUT_H(0x80)
    getsSPI(data, 6);
    PORTCbits.RC6 = 1;
    
    //---Data Return---//
    *x = data[0];
    *y = data[2];
    *z = data[4];
    
    //---SPI End---//
    CloseSPI();
}


備考

今回PIC18F4520使ったのは、とある制御ボード上で動かしたかった為なのですが、 なぜかその制御ボード上では動作せず…orz

なので、制御ボード等でこのプログラムを使う場合は、 一度ブレッドボードなどでテストしてから使うことをおすすめします。


このページのトップへ戻る

inserted by FC2 system