Library for AE-KXSD9(3 axis accelerometer Module KXSD9-2050)
Dependents: BLE_Acceleration_Statejudging
Fork of AE_KXSD9 by
Revision 2:fd07558fbebb, committed 2014-05-22
- Comitter:
- Naoto_111
- Date:
- Thu May 22 13:53:53 2014 +0000
- Parent:
- 1:4dc1a0ac0cf1
- Commit message:
- rewrite overall; read_reg and write_reg are implemented
Changed in this revision
AE_KXSD9.cpp | Show annotated file Show diff for this revision Revisions of this file |
AE_KXSD9.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 4dc1a0ac0cf1 -r fd07558fbebb AE_KXSD9.cpp --- a/AE_KXSD9.cpp Fri May 16 14:17:37 2014 +0000 +++ b/AE_KXSD9.cpp Thu May 22 13:53:53 2014 +0000 @@ -19,22 +19,37 @@ //initialization(default setting) void AE_KXSD9::init() { - char cmd_c=0xE1;//Reset Value - char cmd_b=0x40;//Reset Value - i2c_k.write(CTRL_REGC, &cmd_c, 1); - i2c_k.write(CTRL_REGB, &cmd_b, 1); + i2c_k.start(); + i2c_k.write(addr_w); + i2c_k.write(0x0C);//register address:CTRL_REGC + i2c_k.write(0xE1);//data:Reset Value + i2c_k.stop(); + i2c_k.start(); + i2c_k.write(addr_w); + i2c_k.write(0x0D);//register address:CTRL_REGB + i2c_k.write(0x40);//data:Reset Value + i2c_k.stop(); } + //read each axial acceleration(unit:g) void AE_KXSD9::read_xyz(double *x, double *y, double *z) { const char addr_x_h = XOUT_H; char data[6] = {}; short int acc[3]={}; - i2c_k.write(addr_w, &addr_x_h, 1); - wait_us(500); - i2c_k.read(addr_r, data, 6); - for(int i=0;i<6;i+=2)acc[i/2]=((short int)data[i] << 4) + (short int)data[i+1] - 2048; + + i2c_k.start(); + i2c_k.write(addr_w); + i2c_k.write(addr_x_h); + wait_us(200); + i2c_k.start(); + i2c_k.write(addr_r); + for(int i=0;i<5;i++)data[i]=i2c_k.read(1);//acknowledge(ACK) + data[5]=i2c_k.read(0);//not acknowledge(NACK) + i2c_k.stop(); + + for(int i=0;i<6;i+=2)acc[i/2]=((short int)data[i] << 4) + ((short int)data[i] >> 4) - OFFSET; *x = ((double)acc[0])/SENSITIVITY; *y = ((double)acc[1])/SENSITIVITY; @@ -48,10 +63,16 @@ const char addr_x_h = XOUT_H; char data[2] = {}; short int acc; - i2c_k.write(addr_w, &addr_x_h, 1); - wait_us(500); - i2c_k.read(addr_r, data, 2); - acc=((short int)data[0] << 4) + (short int)data[1] - 2048; + i2c_k.start(); + i2c_k.write(addr_w); + i2c_k.write(addr_x_h); + wait_us(200); + i2c_k.start(); + i2c_k.write(addr_r); + data[0]=i2c_k.read(1);//acknowledge(ACK) + data[1]=i2c_k.read(0);//not acknowledge(NACK) + i2c_k.stop(); + acc=((short int)data[0] << 4) + ((short int)data[1] >> 4) - OFFSET; return (double)acc/SENSITIVITY; } @@ -62,10 +83,16 @@ const char addr_y_h = YOUT_H; char data[2] = {}; short int acc; - i2c_k.write(addr_w, &addr_y_h, 1); - wait_us(500); - i2c_k.read(addr_r, data, 2); - acc=((short int)data[0] << 4) + (short int)data[1] - 2048; + i2c_k.start(); + i2c_k.write(addr_w); + i2c_k.write(addr_y_h); + wait_us(200); + i2c_k.start(); + i2c_k.write(addr_r); + data[0]=i2c_k.read(1);//acknowledge(ACK) + data[1]=i2c_k.read(0);//not acknowledge(NACK) + i2c_k.stop(); + acc=((short int)data[0] << 4) + ((short int)data[1] >> 4) - OFFSET; return (double)acc/SENSITIVITY; } @@ -77,25 +104,41 @@ const char addr_z_h = ZOUT_H; char data[2] = {0,0}; short int acc; - i2c_k.write(addr_w, &addr_z_h, 1); - wait_us(500); - i2c_k.read(addr_r, data, 2); - acc=((short int)data[0] << 4) + (short int)data[1] - 2048; + i2c_k.start(); + i2c_k.write(addr_w); + i2c_k.write(addr_z_h); + wait_us(200); + i2c_k.start(); + i2c_k.write(addr_r); + data[0]=i2c_k.read(1);//acknowledge(ACK) + data[1]=i2c_k.read(0);//not acknowledge(NACK) + i2c_k.stop(); + acc=((short int)data[0] << 4) + ((short int)data[1] >> 4) - OFFSET; return (double)acc/SENSITIVITY; } -/* -//read from AE_KXSD9 register + +//read register char AE_KXSD9::read_reg(char addr) { - + char data; + i2c_k.start(); + i2c_k.write(addr_w); + i2c_k.write(addr); + i2c_k.start(); + i2c_k.write(addr_r); + data=i2c_k.read(0);//not acknowledge + i2c_k.stop(); + return data; } -*/ + //write register -/* void AE_KXSD9::write_reg(char addr, char data) { - + i2c_k.start(); + i2c_k.write(addr_w); + i2c_k.write(addr); + i2c_k.write(data); + i2c_k.stop(); } -*/ \ No newline at end of file
diff -r 4dc1a0ac0cf1 -r fd07558fbebb AE_KXSD9.h --- a/AE_KXSD9.h Fri May 16 14:17:37 2014 +0000 +++ b/AE_KXSD9.h Thu May 22 13:53:53 2014 +0000 @@ -8,13 +8,13 @@ public: AE_KXSD9(PinName sda, PinName scl, int addr1, int addr2);//constructor //~AE_KXSD9();//destructor(unimplemented) - void init();//initialization(required) + void init();//initialization(set to default settings) void read_xyz(double *x, double *y, double *z);//read each axial acceleration(unit:g) double read_x();//read the acceleration in x-axis(unit:g) double read_y();//read the acceleration in y-axis(unit:g) double read_z();//read the acceleration in z-axis(unit:g) - //char read_reg(char addr);//read from AE_KXSD9 register(unimplemented) - //void write_reg(char addr, char data); //write register(unimplemented) + char read_reg(char addr);//read register + void write_reg(char addr, char data); //write register enum{ XOUT_H=0x00, //the highest 8 bits of the acceleration in x-axis XOUT_L=0x01, //the lowest 4 bits of the acceleration in x-axis @@ -28,7 +28,8 @@ CTRL_REGC=0x0C, CTRL_REGB=0x0D, CTRL_REGA=0x0E, - SENSITIVITY=819 + SENSITIVITY=273, //tune it yourself(default:273(+-6g)) + OFFSET=2048//tune it yourself(default:2048) }; private: I2C i2c_k;