L3GD20 Library using FIFO and Interrupt

Fork of L3GD20_SPI by Tatsuki Fukuda

Committer:
lelect
Date:
Mon May 12 11:47:43 2014 +0000
Revision:
2:be6daa938101
Parent:
1:2ebc045424af
Child:
3:6e935e7cec72
interrupt setting change

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lelect 0:175bf093daa8 1 #ifndef MBED_SPI
lelect 0:175bf093daa8 2 #define MBED_SPI
lelect 0:175bf093daa8 3 #include "mbed.h"
lelect 0:175bf093daa8 4 #include "L3GD20_Resister.h"
lelect 1:2ebc045424af 5 /** L3GD20(SPI) class
lelect 1:2ebc045424af 6 *
lelect 1:2ebc045424af 7 * This is the L3GD20 class.
lelect 1:2ebc045424af 8 * @code
lelect 1:2ebc045424af 9 #include "mbed.h"
lelect 1:2ebc045424af 10 #include "L3GD20.h"
lelect 1:2ebc045424af 11
lelect 1:2ebc045424af 12 Serial pc(USBTX,USBRX);//tx,rx
lelect 1:2ebc045424af 13 L3GD20 L3GD20(p11,p12,p13,p14,p15);//miso,mosi,sck,cs,interrupt
lelect 1:2ebc045424af 14
lelect 1:2ebc045424af 15 void interruption(anglerrates *val)
lelect 1:2ebc045424af 16 {
lelect 1:2ebc045424af 17 printf("X:%+05d\tY:%+05d\tZ:%+05d level:%02d\r\n",(val->X),(val->Y),(val->Z),(L3GD20.FIFO.level));
lelect 1:2ebc045424af 18 }
lelect 1:2ebc045424af 19 int main()
lelect 1:2ebc045424af 20 {
lelect 1:2ebc045424af 21 L3GD20.start(L3GD20::XYZ,&interruption);
lelect 1:2ebc045424af 22 while(1) {
lelect 1:2ebc045424af 23 sleep();
lelect 1:2ebc045424af 24 }
lelect 1:2ebc045424af 25 }
lelect 1:2ebc045424af 26 * @endcode
lelect 1:2ebc045424af 27 */
lelect 0:175bf093daa8 28 class L3GD20
lelect 0:175bf093daa8 29 {
lelect 0:175bf093daa8 30 public:
lelect 0:175bf093daa8 31 L3GD20(PinName miso, PinName mosi, PinName scl, PinName cs,PinName interrupt2=NC);
lelect 0:175bf093daa8 32 typedef enum {
lelect 0:175bf093daa8 33 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
lelect 0:175bf093daa8 34 } RESISTER;
lelect 1:2ebc045424af 35 /** @enum DIRECTION
lelect 1:2ebc045424af 36 * enable direction\n
lelect 1:2ebc045424af 37 * Example...L3GD20::XY,L3GD20::XYZ
lelect 1:2ebc045424af 38 */
lelect 0:175bf093daa8 39 typedef enum {
lelect 1:2ebc045424af 40 Y=0x1,
lelect 1:2ebc045424af 41 X=0x1<<1,
lelect 1:2ebc045424af 42 Z=0x1<<2,
lelect 1:2ebc045424af 43 XY=X|Y,
lelect 1:2ebc045424af 44 XZ=X|Z,
lelect 1:2ebc045424af 45 YZ=Y|Z,
lelect 1:2ebc045424af 46 XYZ=X|Y|Z
lelect 0:175bf093daa8 47 } DIRECTION;
lelect 2:be6daa938101 48 /** @enum FIFO_mode
lelect 2:be6daa938101 49 * FIFO mode\n
lelect 2:be6daa938101 50 * Example...L3GD20::FIFOmode\n
lelect 2:be6daa938101 51 * See Datasheet 4.2_FIFO(p.16/44)
lelect 2:be6daa938101 52 */
lelect 0:175bf093daa8 53 typedef enum {
lelect 0:175bf093daa8 54 BYPASSmode=0x0,FIFOmode,STREAMmode,STREAMtoFIFOmode,BYPASStoSTREAMmode
lelect 0:175bf093daa8 55 } FIFO_mode;
lelect 2:be6daa938101 56 /** @enum FIFOstatus
lelect 2:be6daa938101 57 * FIFO status for cause of interruption\n
lelect 2:be6daa938101 58 * Example...L3GD20::watermark\n
lelect 2:be6daa938101 59 * See Datasheet 7.4_CTRL_REG3(p.33/44)
lelect 2:be6daa938101 60 */
lelect 0:175bf093daa8 61 typedef enum {
lelect 0:175bf093daa8 62 none=0,empty,watermark,overrun
lelect 0:175bf093daa8 63 } FIFOstatus;
lelect 0:175bf093daa8 64 struct tagFIFO {
lelect 0:175bf093daa8 65 FIFOstatus status;
lelect 0:175bf093daa8 66 int level;
lelect 0:175bf093daa8 67 } FIFO;
lelect 0:175bf093daa8 68 struct config {
lelect 0:175bf093daa8 69 //read and write resister
lelect 0:175bf093daa8 70 union CTRL_REG1 CTRL_REG1;
lelect 0:175bf093daa8 71 union CTRL_REG2 CTRL_REG2;
lelect 0:175bf093daa8 72 union CTRL_REG3 CTRL_REG3;
lelect 0:175bf093daa8 73 union CTRL_REG4 CTRL_REG4;
lelect 0:175bf093daa8 74 union CTRL_REG5 CTRL_REG5;
lelect 0:175bf093daa8 75 union REF_DATACAP REF_DATACAP;
lelect 0:175bf093daa8 76 union OUT_TEMP OUT_TEMP;
lelect 0:175bf093daa8 77 union STATUS_REG STATUS_REG;
lelect 0:175bf093daa8 78 union FIFO_CTRL_REG FIFO_CTRL_REG;
lelect 0:175bf093daa8 79 union INT1_CFG INT1_CFG;
lelect 0:175bf093daa8 80 union INT1_TSH_XH INT1_TSH_XH;
lelect 0:175bf093daa8 81 union INT1_TSH_XL INT1_TSH_XL;
lelect 0:175bf093daa8 82 union INT1_TSH_YH INT1_TSH_YH;
lelect 0:175bf093daa8 83 union INT1_TSH_YL INT1_TSH_YL;
lelect 0:175bf093daa8 84 union INT1_TSH_ZH INT1_TSH_ZH;
lelect 0:175bf093daa8 85 union INT1_TSH_ZL INT1_TSH_ZL;
lelect 0:175bf093daa8 86 union INT1_DURATION INT1_DURATION;
lelect 0:175bf093daa8 87 } _config;
lelect 0:175bf093daa8 88 struct status {
lelect 0:175bf093daa8 89 //read only resister
lelect 0:175bf093daa8 90 int OUT_TEMP;
lelect 0:175bf093daa8 91 int STATUS_REG;
lelect 0:175bf093daa8 92 union FIFO_SRC_REG FIFO_SRC_REG;
lelect 0:175bf093daa8 93 int INT1_SRC;
lelect 0:175bf093daa8 94 } _status;
lelect 0:175bf093daa8 95 //Class method
lelect 1:2ebc045424af 96 /** @fn void L3GD20::start(DIRECTION enable);
lelect 1:2ebc045424af 97 * Start command send to module
lelect 1:2ebc045424af 98 * @param enable
lelect 0:175bf093daa8 99 */
lelect 0:175bf093daa8 100 void start(DIRECTION enable);
lelect 1:2ebc045424af 101 /** @fn void L3GD20::start(DIRECTION enable,void (*func)(anglerrates*));
lelect 1:2ebc045424af 102 * Start with interrupt
lelect 1:2ebc045424af 103 * @param enable L3GD20 channel
lelect 1:2ebc045424af 104 * @param func user function(call by InterrtptIn)
lelect 1:2ebc045424af 105 */
lelect 0:175bf093daa8 106 void start(DIRECTION enable,void (*func)(anglerrates*));
lelect 1:2ebc045424af 107 /** @fn void L3GD20::stop()
lelect 1:2ebc045424af 108 * stop sampling command send
lelect 0:175bf093daa8 109 */
lelect 0:175bf093daa8 110 void stop();
lelect 1:2ebc045424af 111 /** @fn void L3GD20::sleep()
lelect 1:2ebc045424af 112 * sleep command send
lelect 1:2ebc045424af 113 */
lelect 0:175bf093daa8 114 void sleep();
lelect 1:2ebc045424af 115 /** @fn void L3GD20::read(anglerrates* val,DIRECTION direction)
lelect 1:2ebc045424af 116 * read angler rates with direction(L3GD20::XY)\n
lelect 1:2ebc045424af 117 * This is read and calcurate dps, reading value is set to class instanse
lelect 1:2ebc045424af 118 */
lelect 0:175bf093daa8 119 void read(anglerrates* val,DIRECTION direction);
lelect 1:2ebc045424af 120 /** @fn int L3GD20::readTemperature()
lelect 1:2ebc045424af 121 * read temperature without format
lelect 1:2ebc045424af 122 * (I don't know meaning of value.)
lelect 1:2ebc045424af 123 */
lelect 0:175bf093daa8 124 int readTemperature();
lelect 1:2ebc045424af 125 /** @fn void L3GD20::enableFIFO(FIFO_mode mode,FIFOstatus interrupt,const int threshold)
lelect 1:2ebc045424af 126 * @bref L3GD20mode need to reset(to bypass mode) when filled FIFObuffor
lelect 1:2ebc045424af 127 * @param mode FIFOmode(L3GD20::BYPASSmode,FIFOmode,STREAMmode,STREAMtoFIFOmode,BYPASStoSTREAMmode)
lelect 1:2ebc045424af 128 * @param interrupt cause of interrupt(L3GD20::none,empty,watermark,overrun)
lelect 1:2ebc045424af 129 * @param threshold interruption threshold(1 to 30 vaild)
lelect 1:2ebc045424af 130 */
lelect 1:2ebc045424af 131 void enableFIFO(FIFO_mode mode,FIFOstatus interrupt,const int threshold=30);
lelect 1:2ebc045424af 132 /** @fn int L3GD20::updateFIFO(void)
lelect 1:2ebc045424af 133 * @bref Update FIFO status
lelect 1:2ebc045424af 134 * @return FIFO buffer level
lelect 1:2ebc045424af 135 */
lelect 0:175bf093daa8 136 int updateFIFO(void);
lelect 1:2ebc045424af 137 anglerrates value;///< @brief latest angler rates
lelect 0:175bf093daa8 138 protected:
lelect 0:175bf093daa8 139 //write command to resister
lelect 0:175bf093daa8 140 void write(RESISTER reg,int val);
lelect 0:175bf093daa8 141 //read resister for resister
lelect 0:175bf093daa8 142 void read(RESISTER reg,int* val);
lelect 0:175bf093daa8 143 //just send reboot command
lelect 0:175bf093daa8 144 void reboot();
lelect 2:be6daa938101 145 //reset FIFO To restart data collection, resister must be written back to Bypass mode.
lelect 2:be6daa938101 146 void resetFIFO();
lelect 0:175bf093daa8 147 //read all configration rester
lelect 0:175bf093daa8 148 void configReadOut(void);
lelect 0:175bf093daa8 149 //read all status rester
lelect 0:175bf093daa8 150 void statusReadOut(void);
lelect 0:175bf093daa8 151 //for InterruptIn function ,call userFunction in this methed
lelect 0:175bf093daa8 152 void interrupt(void);
lelect 0:175bf093daa8 153 /*
lelect 0:175bf093daa8 154 void datarate(uint8_t rate,uint8_t bandwidth);
lelect 0:175bf093daa8 155 void setDataFormat();
lelect 0:175bf093daa8 156 void filter(uint8_t mode,uint8_t frequency);
lelect 0:175bf093daa8 157 void channelSource(uint8_t channnel,uint8_t dataSelection,uint8_t interruptSelection);
lelect 0:175bf093daa8 158 void FIFO(uint8_t mode,uint8_t watermark);
lelect 0:175bf093daa8 159 void interrupt(uint8_t source,uint8_t threthold,uint8_t duration,uint8_t Wait);
lelect 0:175bf093daa8 160 */
lelect 0:175bf093daa8 161 void (*userFunction)(anglerrates*);
lelect 0:175bf093daa8 162 SPI _spi;
lelect 0:175bf093daa8 163 DigitalOut _cs;
lelect 0:175bf093daa8 164 InterruptIn _int2;
lelect 0:175bf093daa8 165 };
lelect 0:175bf093daa8 166
lelect 0:175bf093daa8 167 #endif