Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: acce_ChenZhengyang mbed_ProjectC_Accelerometer AccelerometerProject mbed_Accelerometer ... more
MMA8452.cpp
00001 /** 00002 @file MMA8452.cpp 00003 00004 @brief Member functions implementations 00005 00006 */ 00007 #include "mbed.h" 00008 #include "MMA8452.h" 00009 00010 MMA8452:: MMA8452(PinName sdaPin, PinName sclPin) 00011 { 00012 i2c = new I2C(sdaPin,sclPin); // create new I2C instance and initialise 00013 i2c->frequency(400000); // I2C Fast Mode - 400kHz 00014 leds = new BusOut(LED4,LED3,LED2,LED1); // for debug 00015 } 00016 00017 void MMA8452::init() 00018 { 00019 00020 i2c->frequency(400000); // set Fast Mode I2C frequency (5.10 datasheet) 00021 00022 char data = readByteFromRegister(WHO_AM_I); // p18 datasheet 00023 if (data != 0x2A) { // if correct ID not found, hand and flash error message 00024 error(); 00025 } 00026 00027 // put into STANDBY while configuring 00028 data = readByteFromRegister(CTRL_REG1); // get current value of register 00029 data &= ~(1<<0); // clear bit 0 (p37 datasheet) 00030 sendByteToRegister(data,CTRL_REG1); 00031 00032 // Set output data rate, default is 800 Hz, will set to 100 Hz (clear b5, set b4/b3 - p37 datasheet) 00033 data = readByteFromRegister(CTRL_REG1); 00034 data &= ~(1<<5); 00035 data |= (1<<4); 00036 data |= (1<<3); 00037 sendByteToRegister(data,CTRL_REG1); 00038 00039 //// Can also change default 2g range to 4g or 8g (p22 datasheet) 00040 data = readByteFromRegister(XYZ_DATA_CFG); 00041 data |= (1<<0); // set bit 0 - 4g range 00042 sendByteToRegister(data,XYZ_DATA_CFG); 00043 00044 // set ACTIVE 00045 data = readByteFromRegister(CTRL_REG1); 00046 data |= (1<<0); // set bit 0 in CTRL_REG1 00047 sendByteToRegister(data,CTRL_REG1); 00048 00049 } 00050 00051 // read acceleration data from device 00052 Acceleration MMA8452::readValues() 00053 { 00054 // acceleration data stored in 6 registers (0x01 to 0x06) 00055 // device automatically increments register, so can read 6 bytes starting from OUT_X_MSB 00056 char data[6]; 00057 readBytesFromRegister(OUT_X_MSB,6,data); 00058 00059 char x_MSB = data[0]; // extract MSB and LSBs for x,y,z values 00060 char x_LSB = data[1]; 00061 char y_MSB = data[2]; 00062 char y_LSB = data[3]; 00063 char z_MSB = data[4]; 00064 char z_LSB = data[5]; 00065 00066 // [0:7] of MSB are 8 MSB of 12-bit value , [7:4] of LSB are 4 LSB's of 12-bit value 00067 // need to type-cast as numbers are in signed (2's complement) form (p20 datasheet) 00068 int x = (int16_t) (x_MSB << 8) | x_LSB; // combine bytes 00069 x >>= 4; // are left-aligned, so shift 4 places right to right-align 00070 int y = (int16_t) (y_MSB << 8) | y_LSB; 00071 y >>= 4; 00072 int z = (int16_t) (z_MSB << 8) | z_LSB; 00073 z >>= 4; 00074 00075 // sensitivity is 1024 counts/g in 2g mode (pg 9 datasheet) 00076 // " " 512 " 4g " 00077 // " " 256 " 8g " 00078 Acceleration acc; 00079 00080 acc.x = x/512.0; 00081 acc.y = y/512.0; 00082 acc.z = z/512.0; 00083 00084 return acc; 00085 } 00086 00087 // reads a byte from a specific register 00088 char MMA8452::readByteFromRegister(char reg) 00089 { 00090 int nack = i2c->write(MMA8452_W_ADDRESS,®,1,true); // send the register address to the slave 00091 // true as need to send repeated start condition (5.10.1 datasheet) 00092 // http://www.i2c-bus.org/repeated-start-condition/ 00093 if (nack) 00094 error(); // if we don't receive acknowledgement, flash error message 00095 00096 char rx; 00097 nack = i2c->read(MMA8452_R_ADDRESS,&rx,1); // read a byte from the register and store in buffer 00098 if (nack) 00099 error(); // if we don't receive acknowledgement, flash error message 00100 00101 return rx; 00102 } 00103 00104 // reads a series of bytes, starting from a specific register 00105 void MMA8452::readBytesFromRegister(char reg,int numberOfBytes,char bytes[]) 00106 { 00107 00108 int nack = i2c->write(MMA8452_W_ADDRESS,®,1,true); // send the slave write address and the configuration register address 00109 // true as need to send repeated start condition (5.10.1 datasheet) 00110 // http://www.i2c-bus.org/repeated-start-condition/ 00111 00112 if (nack) 00113 error(); // if we don't receive acknowledgement, flash error message 00114 00115 nack = i2c->read(MMA8452_R_ADDRESS,bytes,numberOfBytes); // read bytes 00116 if (nack) 00117 error(); // if we don't receive acknowledgement, flash error message 00118 00119 } 00120 00121 // sends a byte to a specific register 00122 void MMA8452::sendByteToRegister(char byte,char reg) 00123 { 00124 char data[2]; 00125 data[0] = reg; 00126 data[1] = byte; 00127 // send the register address, followed by the data 00128 int nack = i2c->write(MMA8452_W_ADDRESS,data,2); 00129 if (nack) 00130 error(); // if we don't receive acknowledgement, flash error message 00131 00132 } 00133 00134 void MMA8452::error() 00135 { 00136 while(1) { 00137 leds->write(15); 00138 wait(0.1); 00139 leds->write(0); 00140 wait(0.1); 00141 } 00142 }
Generated on Tue Jul 12 2022 22:24:26 by
1.7.2