Library for AE-KXSD9(3 axis accelerometer Module KXSD9-2050)

Dependents:   BLE_Acceleration_Statejudging

Fork of AE_KXSD9 by 尚人 永井

Files at this revision

API Documentation at this revision

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;