L3GD20 Library using FIFO and Interrupt

Fork of L3GD20_SPI by Tatsuki Fukuda

Committer:
lelect
Date:
Mon May 12 07:23:09 2014 +0000
Revision:
1:2ebc045424af
Parent:
0:175bf093daa8
Child:
2:be6daa938101
add doxygen

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 0:175bf093daa8 48 typedef enum {
lelect 0:175bf093daa8 49 BYPASSmode=0x0,FIFOmode,STREAMmode,STREAMtoFIFOmode,BYPASStoSTREAMmode
lelect 0:175bf093daa8 50 } FIFO_mode;
lelect 0:175bf093daa8 51 typedef enum {
lelect 0:175bf093daa8 52 none=0,empty,watermark,overrun
lelect 0:175bf093daa8 53 } FIFOstatus;
lelect 0:175bf093daa8 54 struct tagFIFO {
lelect 0:175bf093daa8 55 FIFOstatus status;
lelect 0:175bf093daa8 56 int level;
lelect 0:175bf093daa8 57 } FIFO;
lelect 0:175bf093daa8 58 struct config {
lelect 0:175bf093daa8 59 //read and write resister
lelect 0:175bf093daa8 60 union CTRL_REG1 CTRL_REG1;
lelect 0:175bf093daa8 61 union CTRL_REG2 CTRL_REG2;
lelect 0:175bf093daa8 62 union CTRL_REG3 CTRL_REG3;
lelect 0:175bf093daa8 63 union CTRL_REG4 CTRL_REG4;
lelect 0:175bf093daa8 64 union CTRL_REG5 CTRL_REG5;
lelect 0:175bf093daa8 65 union REF_DATACAP REF_DATACAP;
lelect 0:175bf093daa8 66 union OUT_TEMP OUT_TEMP;
lelect 0:175bf093daa8 67 union STATUS_REG STATUS_REG;
lelect 0:175bf093daa8 68 union FIFO_CTRL_REG FIFO_CTRL_REG;
lelect 0:175bf093daa8 69 union INT1_CFG INT1_CFG;
lelect 0:175bf093daa8 70 union INT1_TSH_XH INT1_TSH_XH;
lelect 0:175bf093daa8 71 union INT1_TSH_XL INT1_TSH_XL;
lelect 0:175bf093daa8 72 union INT1_TSH_YH INT1_TSH_YH;
lelect 0:175bf093daa8 73 union INT1_TSH_YL INT1_TSH_YL;
lelect 0:175bf093daa8 74 union INT1_TSH_ZH INT1_TSH_ZH;
lelect 0:175bf093daa8 75 union INT1_TSH_ZL INT1_TSH_ZL;
lelect 0:175bf093daa8 76 union INT1_DURATION INT1_DURATION;
lelect 0:175bf093daa8 77 } _config;
lelect 0:175bf093daa8 78 struct status {
lelect 0:175bf093daa8 79 //read only resister
lelect 0:175bf093daa8 80 int OUT_TEMP;
lelect 0:175bf093daa8 81 int STATUS_REG;
lelect 0:175bf093daa8 82 union FIFO_SRC_REG FIFO_SRC_REG;
lelect 0:175bf093daa8 83 int INT1_SRC;
lelect 0:175bf093daa8 84 } _status;
lelect 0:175bf093daa8 85 //Class method
lelect 1:2ebc045424af 86 /** @fn void L3GD20::start(DIRECTION enable);
lelect 1:2ebc045424af 87 * Start command send to module
lelect 1:2ebc045424af 88 * @param enable
lelect 0:175bf093daa8 89 */
lelect 0:175bf093daa8 90 void start(DIRECTION enable);
lelect 1:2ebc045424af 91 /** @fn void L3GD20::start(DIRECTION enable,void (*func)(anglerrates*));
lelect 1:2ebc045424af 92 * Start with interrupt
lelect 1:2ebc045424af 93 * @param enable L3GD20 channel
lelect 1:2ebc045424af 94 * @param func user function(call by InterrtptIn)
lelect 1:2ebc045424af 95 */
lelect 0:175bf093daa8 96 void start(DIRECTION enable,void (*func)(anglerrates*));
lelect 1:2ebc045424af 97 /** @fn void L3GD20::stop()
lelect 1:2ebc045424af 98 * stop sampling command send
lelect 0:175bf093daa8 99 */
lelect 0:175bf093daa8 100 void stop();
lelect 1:2ebc045424af 101 /** @fn void L3GD20::sleep()
lelect 1:2ebc045424af 102 * sleep command send
lelect 1:2ebc045424af 103 */
lelect 0:175bf093daa8 104 void sleep();
lelect 1:2ebc045424af 105 /** @fn void L3GD20::read(anglerrates* val,DIRECTION direction)
lelect 1:2ebc045424af 106 * read angler rates with direction(L3GD20::XY)\n
lelect 1:2ebc045424af 107 * This is read and calcurate dps, reading value is set to class instanse
lelect 1:2ebc045424af 108 */
lelect 0:175bf093daa8 109 void read(anglerrates* val,DIRECTION direction);
lelect 1:2ebc045424af 110 /** @fn int L3GD20::readTemperature()
lelect 1:2ebc045424af 111 * read temperature without format
lelect 1:2ebc045424af 112 * (I don't know meaning of value.)
lelect 1:2ebc045424af 113 */
lelect 0:175bf093daa8 114 int readTemperature();
lelect 1:2ebc045424af 115 /** @fn void L3GD20::enableFIFO(FIFO_mode mode,FIFOstatus interrupt,const int threshold)
lelect 1:2ebc045424af 116 * @bref L3GD20mode need to reset(to bypass mode) when filled FIFObuffor
lelect 1:2ebc045424af 117 * @param mode FIFOmode(L3GD20::BYPASSmode,FIFOmode,STREAMmode,STREAMtoFIFOmode,BYPASStoSTREAMmode)
lelect 1:2ebc045424af 118 * @param interrupt cause of interrupt(L3GD20::none,empty,watermark,overrun)
lelect 1:2ebc045424af 119 * @param threshold interruption threshold(1 to 30 vaild)
lelect 1:2ebc045424af 120 */
lelect 1:2ebc045424af 121 void enableFIFO(FIFO_mode mode,FIFOstatus interrupt,const int threshold=30);
lelect 1:2ebc045424af 122 /** @fn int L3GD20::updateFIFO(void)
lelect 1:2ebc045424af 123 * @bref Update FIFO status
lelect 1:2ebc045424af 124 * @return FIFO buffer level
lelect 1:2ebc045424af 125 */
lelect 0:175bf093daa8 126 int updateFIFO(void);
lelect 1:2ebc045424af 127 anglerrates value;///< @brief latest angler rates
lelect 0:175bf093daa8 128 protected:
lelect 0:175bf093daa8 129 //write command to resister
lelect 0:175bf093daa8 130 void write(RESISTER reg,int val);
lelect 0:175bf093daa8 131 //read resister for resister
lelect 0:175bf093daa8 132 void read(RESISTER reg,int* val);
lelect 0:175bf093daa8 133 //just send reboot command
lelect 0:175bf093daa8 134 void reboot();
lelect 0:175bf093daa8 135 //read all configration rester
lelect 0:175bf093daa8 136 void configReadOut(void);
lelect 0:175bf093daa8 137 //read all status rester
lelect 0:175bf093daa8 138 void statusReadOut(void);
lelect 0:175bf093daa8 139 //for InterruptIn function ,call userFunction in this methed
lelect 0:175bf093daa8 140 void interrupt(void);
lelect 0:175bf093daa8 141 /*
lelect 0:175bf093daa8 142 void datarate(uint8_t rate,uint8_t bandwidth);
lelect 0:175bf093daa8 143 void setDataFormat();
lelect 0:175bf093daa8 144 void filter(uint8_t mode,uint8_t frequency);
lelect 0:175bf093daa8 145 void channelSource(uint8_t channnel,uint8_t dataSelection,uint8_t interruptSelection);
lelect 0:175bf093daa8 146 void FIFO(uint8_t mode,uint8_t watermark);
lelect 0:175bf093daa8 147 void interrupt(uint8_t source,uint8_t threthold,uint8_t duration,uint8_t Wait);
lelect 0:175bf093daa8 148 */
lelect 0:175bf093daa8 149 void (*userFunction)(anglerrates*);
lelect 0:175bf093daa8 150 SPI _spi;
lelect 0:175bf093daa8 151 DigitalOut _cs;
lelect 0:175bf093daa8 152 InterruptIn _int2;
lelect 0:175bf093daa8 153 };
lelect 0:175bf093daa8 154
lelect 0:175bf093daa8 155 #endif