L3GD20 Library using FIFO and Interrupt
Fork of L3GD20_SPI by
L3GD20.h@2:be6daa938101, 2014-05-12 (annotated)
- 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?
User | Revision | Line number | New 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 |