■ PIC18F4520でAE-KXP84(3軸加速度センサ)とシリアル通信
概要
AE-KXP84とのシリアル通信に関する情報が少なかった為、 なんとなく公開してみました。
MSSP機能のあるPICと、C18コンパイラならある程度動くと思います。
他の環境でも、ある程度の参考になるはず。
動作環境
- PIC18F4520[40MHz(10x4)動作]
- AE-KXP84
- C18コンパイラ
こんな感じでシリアル通信ができました。
(表示用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
なので、制御ボード等でこのプログラムを使う場合は、 一度ブレッドボードなどでテストしてから使うことをおすすめします。