L3GD20 Library using FIFO and Interrupt

Fork of L3GD20_SPI by Tatsuki Fukuda

Files at this revision

API Documentation at this revision

Comitter:
lelect
Date:
Tue May 13 09:56:43 2014 +0000
Parent:
2:be6daa938101
Commit message:
.....I had mistaken the mosi and miso.

Changed in this revision

L3GD20.cpp Show annotated file Show diff for this revision Revisions of this file
L3GD20.h Show annotated file Show diff for this revision Revisions of this file
diff -r be6daa938101 -r 6e935e7cec72 L3GD20.cpp
--- a/L3GD20.cpp	Mon May 12 11:47:43 2014 +0000
+++ b/L3GD20.cpp	Tue May 13 09:56:43 2014 +0000
@@ -1,8 +1,8 @@
 #include "mbed.h"
 #include "L3GD20.h"
 
-L3GD20::L3GD20(PinName miso, PinName mosi, PinName scl, PinName cs,PinName interrupt2)
-    :_spi(miso,mosi,scl)
+L3GD20::L3GD20(PinName mosi, PinName miso, PinName scl, PinName cs,PinName interrupt2)
+    :_spi(mosi,miso,scl)
     ,_cs(cs)
     ,_int2(interrupt2)
 {
@@ -37,33 +37,28 @@
     _config.CTRL_REG1.B.Enable=enable;
     _config.CTRL_REG1.b.PD=1;
     write(CtrlReg1,_config.CTRL_REG1.word);
+    allReadOut();
 }
 void L3GD20::resetFIFO()
 {
-    enableFIFO(BYPASSmode,none,20);
-    enableFIFO(STREAMmode,watermark,20);
+    enableFIFO(L3GD20::BYPASSmode,L3GD20::none,20);
+    enableFIFO(L3GD20::STREAMmode,L3GD20::none);
 }
 void L3GD20::start(DIRECTION enable,void (*func)(anglerrates*))
 {
+    reboot();
     userFunction=func;
     _int2.rise(this,(&L3GD20::interrupt));
+    start(enable);
     resetFIFO();
-    start(enable);
+    enableFIFO(L3GD20::BYPASSmode,L3GD20::none,20);
+    enableFIFO(L3GD20::STREAMmode,L3GD20::none);
 }
 void L3GD20::interrupt(void)
 {
-    updateFIFO();
-    if(FIFO.status==L3GD20::watermark) {
-        while(_status.FIFO_SRC_REG.B.FSS!=0) {
-            read(&value,XYZ);
-            if(NULL!=userFunction) {
-                userFunction(&value);
-            }
-            updateFIFO();
-            if(FIFO.level==31) {
-                resetFIFO();
-            }
-        }
+    read(&value,XYZ);
+    if(NULL!=userFunction) {
+        userFunction(&value);
     }
 }
 void L3GD20::stop()
@@ -123,21 +118,22 @@
 void L3GD20::enableFIFO(FIFO_mode mode,FIFOstatus interrupt,const int threshold)
 {
     _config.CTRL_REG5.b.FIFO_EN=1;
-    _config.CTRL_REG3.word=0;
-    if(interrupt&empty) {
+    if(interrupt==empty) {
         _config.CTRL_REG3.b.I2_Empty=1;
-    } else if(interrupt&watermark) {
+    } else if(interrupt==watermark) {
         _config.CTRL_REG3.b.I2_WTM=1;
-    } else if(interrupt&overrun) {
+    } else if(interrupt==overrun) {
         _config.CTRL_REG3.b.I2_ORun=1;
+    } else if(interrupt==none) {
+        _config.CTRL_REG3.b.I2_DRDY=1;
     }
     _config.FIFO_CTRL_REG.B.FM=mode;
-    if(threshold<=0) {
-        _config.FIFO_CTRL_REG.B.WTM=0;
-    } else if(threshold<30) {
-        _config.FIFO_CTRL_REG.B.WTM=31;
-    } else {
-        _config.FIFO_CTRL_REG.B.WTM=threshold;
+    if(threshold>0) {
+        if(threshold<30) {
+            _config.FIFO_CTRL_REG.B.WTM=31;
+        } else {
+            _config.FIFO_CTRL_REG.B.WTM=threshold;
+        }
     }
     write(CtrlReg3,_config.CTRL_REG3.word);
     write(CtrlReg5,_config.CTRL_REG5.word);
@@ -159,6 +155,11 @@
     FIFO.level=_status.FIFO_SRC_REG.B.FSS;
     return FIFO.level;
 }
+void L3GD20::allReadOut()
+{
+    configReadOut();
+    statusReadOut();
+}
 void L3GD20::configReadOut(void)
 {
     read(CtrlReg1,&_config.CTRL_REG1.word);
diff -r be6daa938101 -r 6e935e7cec72 L3GD20.h
--- a/L3GD20.h	Mon May 12 11:47:43 2014 +0000
+++ b/L3GD20.h	Tue May 13 09:56:43 2014 +0000
@@ -28,7 +28,7 @@
 class L3GD20
 {
 public:
-    L3GD20(PinName miso, PinName mosi, PinName scl, PinName cs,PinName interrupt2=NC);
+    L3GD20(PinName mosi, PinName miso, PinName scl, PinName cs,PinName interrupt2=NC);
     typedef enum {
         null=0x00,WhoAmI=0x0F,CtrlReg1=0x20,CtrlReg2=0x21,CtrlReg3=0x22,CtrlReg4=0x23,CtrlReg5=0x24,Reference=0x25,OutTemp=0x26,StatusReg=0x27,OutXL=0x28,OutXH=0x29,OutYL=0x2A,OutYH=0x2B,OutZL=0x2C,OutZH=0x2D,FIFOCtrlReg=0x2E,FIFOSrcReg=0x2F,INT1Cfg=0x30,INT1Src=0x31,INT1ThsXH=0x32,INT1ThsXL=0x33,INT1ThsYH=0x34,INT1ThsYL=0x35,INT1ThsZH=0x36,INT1ThsZL=0x37,INT1Duration=0x38,READ=0x80
     } RESISTER;
@@ -53,7 +53,7 @@
     typedef enum {
         BYPASSmode=0x0,FIFOmode,STREAMmode,STREAMtoFIFOmode,BYPASStoSTREAMmode
     } FIFO_mode;
-    /** @enum FIFOstatus
+    /**
     *   FIFO status for cause of interruption\n
     *   Example...L3GD20::watermark\n
     *   See Datasheet 7.4_CTRL_REG3(p.33/44)
@@ -61,9 +61,12 @@
     typedef enum {
         none=0,empty,watermark,overrun
     } FIFOstatus;
-    struct tagFIFO {
-        FIFOstatus status;
-        int level;
+    /** 
+    *   @brief  FIFO status info
+    */
+    struct {
+        FIFOstatus status;///< Type of status is enum "FIFOstatus". cause of interruption(none,empty,watermark,overrun)
+        int level;        ///< FIFO buffer level
     } FIFO;
     struct config {
 //read and write resister
@@ -123,17 +126,18 @@
     */
     int readTemperature();
     /** @fn void L3GD20::enableFIFO(FIFO_mode mode,FIFOstatus interrupt,const int threshold)
-    *   @bref   L3GD20mode need to reset(to bypass mode) when filled FIFObuffor
+    *   @brief   L3GD20mode need to reset(to bypass mode) when filled FIFObuffor
     *   @param mode        FIFOmode(L3GD20::BYPASSmode,FIFOmode,STREAMmode,STREAMtoFIFOmode,BYPASStoSTREAMmode)
     *   @param interrupt   cause of interrupt(L3GD20::none,empty,watermark,overrun)
     *   @param threshold   interruption threshold(1 to 30 vaild)
     */
-    void enableFIFO(FIFO_mode mode,FIFOstatus interrupt,const int threshold=30);
+    void enableFIFO(FIFO_mode mode,FIFOstatus interrupt,const int threshold=0);
     /** @fn int L3GD20::updateFIFO(void)
-    *   @bref   Update FIFO status
+    *   @brief   Update FIFO status
     *   @return FIFO buffer level
     */
     int updateFIFO(void);
+    void allReadOut();
     anglerrates value;///< @brief latest angler rates
 protected:
     //write command to resister