Modified I2C write / read methods for ST nucleo platforms. Library and code now works with Nucleo F411. Should also work with Nucleo F401.

Dependents:   MPU9150_nucleo_noni2cdev MPU9150_nucleo_noni2cdev_F401 JPEGCamera_SIM808_MPU9150_STM32F401RE

Fork of MPU9150_DMP by Chris Pepper

Revision:
0:74f0ae286b03
Child:
1:8ff0beb54dd4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MPU9150.h	Sun Aug 31 12:52:29 2014 +0000
@@ -0,0 +1,212 @@
+#ifndef MPU9150_INCLUDE
+#define MPU9150_INCLUDE
+
+#include "mbed.h"
+#include "registers.h"
+#include "dmpdata.h"
+//https://github.com/sparkfun/MPU-9150_Breakout/blob/master/firmware/MPU6050/MPU6050_9Axis_MotionApps41.h
+extern Serial debug;
+
+class MPU9150{
+public: 
+    MPU9150(PinName scl, PinName sda, PinName interrupt, bool secondary_addr = false):i2c(sda, scl){
+        device_address = MPU6050_DEFAULT_ADDRESS;
+        read_errors = 0;
+        write_errors = 0;
+        if(secondary_addr){
+            device_address = MPU6050_ADDRESS_AD0_HIGH;
+        }
+        
+       // i2c.frequency(400000);
+        i2c.frequency(100000);
+    }
+    ~MPU9150(){}
+    
+    bool getBit(char reg_addr, uint8_t bit);
+    int8_t get8(char reg_addr);
+    int16_t get16(char reg_addr);
+    int16_t get16L(char reg_addr);
+    
+    bool read(char reg_addr, char* data);
+    bool read(char reg_addr, char* data, int length);
+    bool readBit(char reg_addr, uint8_t bit_start, uint8_t *data);
+    bool readBits(char reg_addr, uint8_t bit_start, uint8_t length, uint8_t *data);
+    
+    bool write(char reg_addr, char data);
+    bool write(char reg_addr, char* data, int length);
+    bool writeBit(char reg_addr, uint8_t bit, bool value);
+    bool writeBits(char reg_addr, uint8_t bit_start, uint8_t length, uint8_t data);
+    
+    uint8_t getDeviceID();
+    bool isReady();
+    void initialise();
+    void initialiseMagnetometer();
+    void initialiseDMP();
+    
+    
+    //PWR_MGMT_1 Control Register
+    void reset();
+    void sleep(bool state);
+    void cycleMode(bool state);
+    void disableTemperatureSensor(bool state);
+    void clockSelect(uint8_t clk);
+    
+    //PWR_MGMT_2 Control Register
+    void setCycleWakeFrequency(uint8_t value);
+    void setStandbyAccX( bool value );
+    void setStandbyAccY( bool value );
+    void setStandbyAccZ( bool value );
+    void setStandbyGyroX( bool value );
+    void setStandbyGyroY( bool value );
+    void setStandbyGyroZ( bool value );
+    
+    //SMPRT_DI Sample Rate Divider 
+    void setSampleRateDivider(uint8_t value);
+
+    //CONFIG
+    void setExternalFrameSync(uint8_t value);
+    void setDigitalLowPassFilter(uint8_t value);
+    
+    //GYRO_CONFIG
+    void setGyroSelfTest(bool value);
+    void setGyroFullScaleRange(uint8_t value);
+    
+    //ACCEL_CONFIG
+    void setAccelSelfTest(bool value);
+    void setAccelFullScaleRange(uint8_t value);
+    
+    //FIFO_EN
+    void setTemperatureFifo(bool value);
+    void setGyroFifo(bool value);
+    void setAccelFifo(bool value);
+    void setSlave2Fifo(bool value);
+    void setSlave1Fifo(bool value);
+    void setSlave0Fifo(bool value);
+    
+    //I2C_MST_CTRL
+    void setMultiMaster(bool value);
+    void setWaitForExternalSensor(bool value);
+    void setSlave3Fifo(bool value);
+    void setMasterStartStop(bool value);
+    void setI2CMasterClock(uint8_t value);
+    
+    //I2C_SLV0_ADDR
+    void setI2cSlaveRW(uint8_t slave_id, bool value);
+    void setI2cSlaveAddress(uint8_t slave_id, uint8_t value);
+    //I2C_SLV0_REG,
+    void setI2cSlaveRegister(uint8_t slave_id, uint8_t value);
+    //I2C_SLV0_CTRL
+    void setI2cSlaveEnable(uint8_t slave_id, bool value);
+    void setI2cSlaveByteSwap(uint8_t slave_id, bool value);
+    void setI2cSlaveRegDisable(uint8_t slave_id, bool value);
+    void setI2cSlaveByteGrouping(uint8_t slave_id, bool value);
+    void setI2cSlaveTransactionLength(uint8_t slave_id, uint8_t value);
+    //I2C_SLV0_DO
+    void setI2cSlaveDataOut(uint8_t slave_id, uint8_t value);
+    //I2C_MST_DELAY_CTRL
+    void setI2cSlaveDelay(uint8_t slave_id, uint8_t value);
+    void setI2cSlaveShadowDelay(uint8_t value)    ;
+    //Slave4 is different
+    void setI2cSlave4RW( bool value);
+    void setI2cSlave4Address( uint8_t value);
+    void setI2cSlave4Register(uint8_t value);
+    void setI2cSlave4DataOut(uint8_t value);
+    void setI2cSlave4Enable(bool value);
+    void setI2cSlave4IntEnable(bool value);
+    void setI2cSlave4RegDisable(bool value);
+    void setI2cMasterDelay(uint8_t value);
+    uint8_t getI2cSlave4Di();
+    
+    //I2C_MST_STATUS
+    bool setI2cPassthrough();
+    bool setI2cSlave4Done();
+    bool setI2cLostArbitration();
+    bool setI2cSlave0Nack();
+    bool setI2cSlave1Nack();
+    bool setI2cSlave2Nack();
+    bool setI2cSlave3Nack();
+    bool setI2cSlave4Nack();
+    
+    //INT_PIN_CFG
+    void setInterruptActiveLow(bool value);
+    void setInterruptOpenDrain(bool value);
+    void setInterruptLatch(bool value);
+    void setInterruptAnyReadClear(bool value);
+    void setFsyncInterruptActiveLow(bool value);
+    void setFsyncInterruptEnable(bool value);
+    void setI2cAuxBypassEnable(bool value);
+    
+    //INT_ENABLE
+    void setInterruptFifoOverflowEnable(bool value);
+    void setInterruptMasterEnable(bool value);
+    void setInterruptDataReadyEnable(bool value);
+    
+    //INT_STATUS
+    bool getInterruptFifoOverflow();
+    bool getInterruptMaster();
+    bool getInterruptDataReady();
+    uint8_t getInterruptStatus();
+    
+    //SIGNAL_PATH_RESET
+    void resetGyroSignalPath();
+    void resetAccelSignalPath();
+    void resetTempSignalPath();
+    
+    //USER_CTRL 
+    void setEnableFifo(bool value);
+    void setI2cMasterEnable(bool value);
+    void setFifoReset(bool value);
+    void setI2cMasterReset(bool value);
+    void setFullSensorReset(bool value);
+    
+    //FIFO_COUNT_H and FIFO_COUNT_L
+    int16_t getFifoCount();
+    
+    //FIFO_R_W
+    bool getFifoBuffer(char* buffer, int16_t length);
+    
+    //UNDOCUMENTED
+    // XG_OFFS_TC
+    uint8_t getOTPBankValid();
+    
+    //INT_ENABLE 
+    void setIntPLLReadyEnabled(bool value); 
+    void setIntDMPEnabled(bool value);
+    
+    // INT_STATUS
+    bool getIntPLLReadyStatus();
+    bool getIntDMPStatus();
+    
+    // USER_CTRL
+    bool getDMPEnabled();
+    void setDMPEnabled(bool value);
+    void resetDMP();
+    
+    // BANK_SEL
+    void setMemoryBank(uint8_t bank, bool prefetchEnabled=false, bool userBank=false);
+    
+    // MEM_START_ADDR
+    void setMemoryStartAddress(uint8_t address);
+    
+    // MEM_R_W register
+    uint8_t readMemoryByte();
+    void writeMemoryByte(uint8_t value);
+    void readMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address);
+    bool writeMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank = 0, uint8_t address = 0, bool verify = false);
+    bool writeDMPConfigurationSet(const uint8_t *data, uint16_t dataSize);
+    
+    // DMP_CFG_1
+    uint8_t getDMPConfig1();
+    void setDMPConfig1(uint8_t config);
+    
+    // DMP_CFG_2
+    uint8_t getDMPConfig2();
+    void setDMPConfig2(uint8_t config);
+
+    I2C i2c;
+    uint8_t device_address;
+    uint32_t read_errors;
+    uint32_t write_errors;
+};
+
+#endif
\ No newline at end of file