A compilation of some hardware sensors and their shared programming interfaces.
Embed:
(wiki syntax)
Show/hide line numbers
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 *) ®_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 }
Generated on Wed Jul 13 2022 19:24:40 by 1.7.2