Jurica Resetar / MMA8452

Dependents:   acd52832_BLE_VF_GeoBeacon

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers mma8452.cpp Source File

mma8452.cpp

00001 /*
00002  * Library for mma8452 3-Axis, 12-bit/8-bit, Digital Accelerometer
00003  * Made by Jurica Resetar
00004  * jurica_resetar@yahoo.com
00005  *
00006  * All rights reserved
00007  */
00008  
00009  
00010 #include "mma8452.h"
00011 
00012 Acc_MMA8452::Acc_MMA8452(PinName sda, PinName scl, char address): i2c(sda, scl), acc_address(address){
00013 }
00014 
00015 Acc_MMA8452::~Acc_MMA8452(){
00016 }
00017 
00018 uint8_t Acc_MMA8452::set_register(char reg, char data){
00019     char cmd[2] = {0, 0};
00020     i2c.start();
00021     cmd[0] = MODE_STATUS;
00022     cmd[1] = 0x00;                      // Standby Mode on
00023     i2c.write(acc_address, cmd, 2);
00024   
00025     cmd[0] = reg;
00026     cmd[1] = data;                      // New value of the register
00027     i2c.write(acc_address, cmd, 2); 
00028       
00029     cmd[0] = MODE_STATUS;
00030     cmd[1] = 0x01;                      // Active Mode on
00031     i2c.write(acc_address, cmd, 2);
00032     i2c.stop();
00033     return 0;       // Success
00034 }
00035 
00036 uint8_t Acc_MMA8452::get_register(char reg, char *data){
00037     char temp_read = 2;
00038     i2c.start();
00039     if(i2c.write(acc_address & 0xFE) == 0){            // just good practice to force bit 1 to a '0' by ANDing with 0xFE
00040         return 1;                                       // we failed to write the mcu address on the bus to initiate dialogue 
00041     }
00042     if(i2c.write(reg) == 0){
00043         return 1;                                       // we failed to write 'who am i' to the chip
00044     }
00045     i2c.start();
00046     if(i2c.write(acc_address | 0x01) == 0){           // this is asking to read the slave mcu address - even though it's a 'write' method!!! Crap API...
00047         return 1;                                       // we failed to request a read from that mcu - this really is just writing the mcu vaule on the bus
00048     }
00049     temp_read = i2c.read(0);
00050     i2c.stop();
00051     *data = temp_read;
00052         
00053     return 0;       // Success
00054 }
00055 
00056 uint8_t Acc_MMA8452::get_x_acc(char *data){
00057     get_register(OUT_X_MSB, data);
00058     return 0;
00059 }
00060 uint8_t Acc_MMA8452::get_y_acc(char *data){
00061     get_register(OUT_Y_MSB, data);
00062     return 0;
00063 }
00064 uint8_t Acc_MMA8452::get_z_acc(char *data){
00065     get_register(OUT_Z_MSB, data);
00066     return 0;
00067 }