added CC2541 8051 example
This commit is contained in:
@@ -0,0 +1,338 @@
|
||||
/**************************************************************************************************
|
||||
Filename: hal_irtemp.c
|
||||
Revised: $Date: 2013-04-05 07:25:57 -0700 (Fri, 05 Apr 2013) $
|
||||
Revision: $Revision: 33773 $
|
||||
|
||||
Description: Driver for the TI TMP06 infrared thermophile sensor.
|
||||
|
||||
|
||||
Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved.
|
||||
|
||||
IMPORTANT: Your use of this Software is limited to those specific rights
|
||||
granted under the terms of a software license agreement between the user
|
||||
who downloaded the software, his/her employer (which must be your employer)
|
||||
and Texas Instruments Incorporated (the "License"). You may not use this
|
||||
Software unless you agree to abide by the terms of the License. The License
|
||||
limits your use, and you acknowledge, that the Software may not be modified,
|
||||
copied or distributed unless embedded on a Texas Instruments microcontroller
|
||||
or used solely and exclusively in conjunction with a Texas Instruments radio
|
||||
frequency transceiver, which is integrated into your product. Other than for
|
||||
the foregoing purpose, you may not use, reproduce, copy, prepare derivative
|
||||
works of, modify, distribute, perform, display or sell this Software and/or
|
||||
its documentation for any purpose.
|
||||
|
||||
YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
|
||||
PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
|
||||
NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
|
||||
TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
|
||||
NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
|
||||
LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
|
||||
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
|
||||
OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
|
||||
OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
|
||||
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
|
||||
|
||||
Should you have any questions regarding your right to use this Software,
|
||||
contact Texas Instruments Incorporated at www.TI.com.
|
||||
**************************************************************************************************/
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* Includes
|
||||
* ------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
#include "hal_irtemp.h"
|
||||
#include "hal_i2c.h"
|
||||
#include "hal_sensor.h"
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* Constants
|
||||
* ------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* Slave address */
|
||||
#define TMP006_I2C_ADDRESS 0x44
|
||||
|
||||
/* TMP006 register addresses */
|
||||
#define TMP006_REG_ADDR_VOLTAGE 0x00
|
||||
#define TMP006_REG_ADDR_TEMPERATURE 0x01
|
||||
#define TMP006_REG_ADDR_CONFIG 0x02
|
||||
#define TMP006_REG_MANF_ID 0xFE
|
||||
#define TMP006_REG_PROD_ID 0xFE
|
||||
|
||||
/* TMP006 register values */
|
||||
#define TMP006_VAL_CONFIG_RESET 0x7400 // Sensor reset state
|
||||
#define TMP006_VAL_CONFIG_ON 0x7000 // Sensor on state
|
||||
#define TMP006_VAL_CONFIG_OFF 0x0000 // Sensor off state
|
||||
#define TMP006_VAL_MANF_ID 0x5449 // Manufacturer ID
|
||||
#define TMP006_VAL_PROD_ID 0x0067 // Product ID
|
||||
|
||||
/* Bit values */
|
||||
#define DATA_RDY_BIT 0x8000 // Data ready
|
||||
|
||||
/* Register length */
|
||||
#define IRTEMP_REG_LEN 2
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* Local Functions
|
||||
* ------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
static void HalIRTempSelect(void);
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* Local Variables
|
||||
* ------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
static IRTemperature_States_t irtSensorState = TMP006_OFF;
|
||||
|
||||
static uint8 configSensorReset[2] = {0x80, 0x00}; // Sensor reset
|
||||
static uint8 configSensorOff[2] = {0x00, 0x80}; // Sensor standby
|
||||
static uint8 configSensorOn[2] = {0x70, 0x00}; // Conversion time 0.25 sec
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* Public functions
|
||||
* -------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
/**************************************************************************************************
|
||||
* @fn HALIRTempInit
|
||||
*
|
||||
* @brief Initialise the temperature sensor driver
|
||||
*
|
||||
* @return none
|
||||
**************************************************************************************************/
|
||||
void HALIRTempInit(void)
|
||||
{
|
||||
irtSensorState = TMP006_OFF;
|
||||
HalIRTempTurnOff();
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************************************
|
||||
* @fn HalIRTempTurnOn
|
||||
*
|
||||
* @brief Turn the sensor on
|
||||
*
|
||||
* @return none
|
||||
**************************************************************************************************/
|
||||
void HalIRTempTurnOn(void)
|
||||
{
|
||||
HalDcDcControl(ST_IRTEMP,true);
|
||||
HalIRTempSelect();
|
||||
|
||||
if (HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOn, IRTEMP_REG_LEN))
|
||||
{
|
||||
irtSensorState = TMP006_IDLE;
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************************************
|
||||
* @fn HalIRTempTurnOff
|
||||
*
|
||||
* @brief Turn the sensor off
|
||||
*
|
||||
* @return none
|
||||
**************************************************************************************************/
|
||||
void HalIRTempTurnOff(void)
|
||||
{
|
||||
HalIRTempSelect();
|
||||
|
||||
if (HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOff, IRTEMP_REG_LEN))
|
||||
{
|
||||
irtSensorState = TMP006_OFF;
|
||||
}
|
||||
HalDcDcControl(ST_IRTEMP,false);
|
||||
}
|
||||
|
||||
/**************************************************************************************************
|
||||
* @fn HalIRTempRead
|
||||
*
|
||||
* @brief Read the sensor voltage and sensor temperature registers
|
||||
*
|
||||
* @param Voltage and temperature in raw format (2 + 2 bytes)
|
||||
*
|
||||
* @return TRUE if valid data
|
||||
**************************************************************************************************/
|
||||
bool HalIRTempRead(uint8 *pBuf)
|
||||
{
|
||||
uint16 v;
|
||||
uint16 t;
|
||||
bool success;
|
||||
|
||||
if (irtSensorState != TMP006_DATA_READY)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
HalIRTempSelect();
|
||||
|
||||
// Read the sensor registers
|
||||
success = HalSensorReadReg(TMP006_REG_ADDR_VOLTAGE, (uint8 *)&v,IRTEMP_REG_LEN );
|
||||
if (success)
|
||||
{
|
||||
success = HalSensorReadReg(TMP006_REG_ADDR_TEMPERATURE, (uint8 *)&t,IRTEMP_REG_LEN );
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
// Store values
|
||||
pBuf[0] = HI_UINT16( v );
|
||||
pBuf[1] = LO_UINT16( v );
|
||||
pBuf[2] = HI_UINT16( t );
|
||||
pBuf[3] = LO_UINT16( t );
|
||||
}
|
||||
|
||||
// Turn off sensor
|
||||
if (HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOff, IRTEMP_REG_LEN))
|
||||
{
|
||||
irtSensorState = TMP006_OFF;
|
||||
}
|
||||
HalDcDcControl(ST_IRTEMP,false);
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************************************
|
||||
* @fn HalIRTempStatus
|
||||
*
|
||||
* @brief Read the state of the sensor
|
||||
*
|
||||
* @return none
|
||||
**************************************************************************************************/
|
||||
IRTemperature_States_t HalIRTempStatus(void)
|
||||
{
|
||||
if (irtSensorState != TMP006_OFF)
|
||||
{
|
||||
bool success;
|
||||
uint16 v;
|
||||
|
||||
// Select this sensor on the I2C bus
|
||||
HalIRTempSelect();
|
||||
|
||||
// Read the data ready bit
|
||||
success = HalSensorReadReg(TMP006_REG_ADDR_CONFIG, (uint8 *)&v,IRTEMP_REG_LEN );
|
||||
if ((v & DATA_RDY_BIT) && success)
|
||||
{
|
||||
irtSensorState = TMP006_DATA_READY;
|
||||
}
|
||||
}
|
||||
|
||||
return irtSensorState;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************************************
|
||||
* @fn HalIRTempTest
|
||||
*
|
||||
* @brief Run a sensor self-test
|
||||
*
|
||||
* @return TRUE if passed, FALSE if failed
|
||||
**************************************************************************************************/
|
||||
bool HalIRTempTest(void)
|
||||
{
|
||||
uint16 val;
|
||||
|
||||
// Select this sensor on the I2C bus
|
||||
HalIRTempSelect();
|
||||
|
||||
// Check manufacturer ID
|
||||
ST_ASSERT(HalSensorReadReg(TMP006_REG_MANF_ID, (uint8 *)&val, IRTEMP_REG_LEN));
|
||||
val = (LO_UINT16(val) << 8) | HI_UINT16(val);
|
||||
ST_ASSERT(val == TMP006_VAL_MANF_ID);
|
||||
|
||||
// Reset sensor
|
||||
ST_ASSERT(HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorReset, IRTEMP_REG_LEN));
|
||||
|
||||
// Check config register (reset)
|
||||
ST_ASSERT(HalSensorReadReg(TMP006_REG_ADDR_CONFIG, (uint8 *)&val, IRTEMP_REG_LEN));
|
||||
val = ((LO_UINT16(val) << 8) | HI_UINT16(val));
|
||||
ST_ASSERT(val == TMP006_VAL_CONFIG_RESET);
|
||||
|
||||
// Turn sensor off
|
||||
ST_ASSERT(HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOff,IRTEMP_REG_LEN));
|
||||
|
||||
// Check config register (off)
|
||||
ST_ASSERT(HalSensorReadReg(TMP006_REG_ADDR_CONFIG, (uint8 *)&val, IRTEMP_REG_LEN));
|
||||
val = ((LO_UINT16(val) << 8) | HI_UINT16(val));
|
||||
ST_ASSERT(val == TMP006_VAL_CONFIG_OFF);
|
||||
|
||||
// Turn sensor on
|
||||
ST_ASSERT(HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOn, IRTEMP_REG_LEN));
|
||||
|
||||
// Check config register (on)
|
||||
ST_ASSERT(HalSensorReadReg(TMP006_REG_ADDR_CONFIG, (uint8 *)&val, IRTEMP_REG_LEN));
|
||||
val = ((LO_UINT16(val) << 8) | HI_UINT16(val));
|
||||
ST_ASSERT(val == TMP006_VAL_CONFIG_ON);
|
||||
|
||||
// Turn sensor off
|
||||
ST_ASSERT(HalSensorWriteReg(TMP006_REG_ADDR_CONFIG, configSensorOff, IRTEMP_REG_LEN));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* Private functions
|
||||
* -------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**************************************************************************************************
|
||||
* @fn HalIRTempSelect
|
||||
*
|
||||
* @brief Select the TMP006 slave and set the I2C bus speed
|
||||
*
|
||||
* @return none
|
||||
**************************************************************************************************/
|
||||
static void HalIRTempSelect(void)
|
||||
{
|
||||
// Select slave and set clock rate
|
||||
HalI2CInit(TMP006_I2C_ADDRESS, i2cClock_533KHZ);
|
||||
}
|
||||
|
||||
/* Conversion algorithm for die temperature
|
||||
* ================================================
|
||||
*
|
||||
double calcTmpLocal(uint16 rawT)
|
||||
{
|
||||
//-- calculate die temperature [°C] --
|
||||
m_tmpAmb = (double)((qint16)rawT)/128.0;
|
||||
|
||||
return m_tmpAmb;
|
||||
}
|
||||
|
||||
*
|
||||
* Conversion algorithm for target temperature
|
||||
*
|
||||
double calcTmpTarget(uint16 rawT)
|
||||
{
|
||||
//-- calculate target temperature [°C] -
|
||||
double Vobj2 = (double)(qint16)rawT;
|
||||
Vobj2 *= 0.00000015625;
|
||||
|
||||
double Tdie2 = m_tmpAmb + 273.15;
|
||||
const double S0 = 6.4E-14; // Calibration factor
|
||||
|
||||
const double a1 = 1.75E-3;
|
||||
const double a2 = -1.678E-5;
|
||||
const double b0 = -2.94E-5;
|
||||
const double b1 = -5.7E-7;
|
||||
const double b2 = 4.63E-9;
|
||||
const double c2 = 13.4;
|
||||
const double Tref = 298.15;
|
||||
double S = S0*(1+a1*(Tdie2 - Tref)+a2*pow((Tdie2 - Tref),2));
|
||||
double Vos = b0 + b1*(Tdie2 - Tref) + b2*pow((Tdie2 - Tref),2);
|
||||
double fObj = (Vobj2 - Vos) + c2*pow((Vobj2 - Vos),2);
|
||||
double tObj = pow(pow(Tdie2,4) + (fObj/S),.25);
|
||||
tObj = (tObj - 273.15);
|
||||
|
||||
return tObj;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
/*********************************************************************
|
||||
*********************************************************************/
|
||||
|
||||
Reference in New Issue
Block a user