A compilation of some hardware sensors and their shared programming interfaces.

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers I2CSensor.cpp Source File

I2CSensor.cpp

00001 /* I2CSensor.cpp
00002  * Tested with mbed board: FRDM-KL46Z
00003  * Author: Mark Gottscho
00004  * mgottscho@ucla.edu
00005  */
00006 
00007 #include "mbed.h"
00008 #include "I2CSensor.h"
00009  
00010 using namespace std;
00011 
00012 ///////////////////// Public methods /////////////////////////////
00013 
00014 I2CSensor::I2CSensor (PinName sda, PinName scl, int i2c_addr) :
00015                             __sda_pin(sda),
00016                             __scl_pin(scl),
00017                             __i2c_addr(i2c_addr),
00018                             __who_am_i(0),
00019                             __i2c(sda, scl)
00020                             { }
00021 
00022 I2CSensor::~I2CSensor() { }
00023         
00024 PinName I2CSensor::getSDAPin () { return __sda_pin; }
00025 
00026 PinName I2CSensor::getSCLPin () { return __scl_pin; }
00027 
00028 uint8_t I2CSensor::getDeviceI2CAddress () { return __i2c_addr; }
00029 
00030 uint8_t I2CSensor::getRegister(const uint8_t reg_addr) {
00031     uint8_t data;
00032     __readReg (reg_addr, &data, 1);
00033     return data;
00034 }
00035 
00036 uint16_t I2CSensor::getRegister16b(const uint8_t reg_addr) {
00037     uint8_t payload[2];
00038     __readReg (reg_addr, payload, 2);
00039     uint16_t data = (payload[0] << 8) | (payload[1]);
00040     return data;
00041 }
00042 
00043 void I2CSensor::setRegister(const uint8_t reg_addr, const uint8_t data) {
00044     uint8_t payload[2] = {reg_addr, data};
00045     __writeReg (payload, 2);
00046 }
00047 
00048 void I2CSensor::setRegister16b(const uint8_t reg_addr, const uint16_t data) {
00049     uint8_t dataMSB = (data >> 8) & 0x00FF;
00050     uint8_t dataLSB = data & 0x00FF;
00051     uint8_t payload[3] = {reg_addr, dataMSB, dataLSB};
00052     __writeReg (payload, 3);
00053 }
00054 
00055 ///////////////////// Protected methods /////////////////////////////
00056 
00057 int I2CSensor::__readReg (const uint8_t reg_addr, uint8_t *data, int len) { 
00058     int retval = 0;
00059     
00060     __disable_irq();
00061     retval = __i2c.write(__i2c_addr, (char *) &reg_addr, 1, true);
00062     if (retval != 0) {
00063         __enable_irq();
00064         return retval;
00065     }
00066     retval = __i2c.read(__i2c_addr, (char *) data, len);
00067     __enable_irq();
00068     
00069     return retval;
00070 }
00071 
00072 int I2CSensor::__writeReg (const uint8_t *data, int total_len) {
00073     int retval = 0;
00074     
00075     __disable_irq();
00076     retval = __i2c.write(__i2c_addr, (char *) data, total_len);
00077     __enable_irq();
00078    
00079     return retval;
00080 }