Experiment to CC2640R2 and Sensor Booster Pack
http://dev.ti.com/tirex/content/simplelink_academy_cc2640r2sdk_1_13_02_07/modules/ble_02_thermostat/ble_02_thermostat.html
Because the sensor TMP0007 has out of date now, so I little modify to use with OTP3001.
Step1. Copy file i2ctmp from simpllink sdk cc2640R2 version
Reference The Booster pack datasheet http://www.ti.com/lit/ug/slau666b/slau666b.pdf
Step1. Copy file i2ctmp from simpllink sdk cc2640R2 version
Reference The Booster pack datasheet http://www.ti.com/lit/ug/slau666b/slau666b.pdf
TMP0007 and OTP3001 share the I2C bus including SCL, SDA.
Address's TMP is 0x04, Data Register: 0x00
Address's OTP is 0x47, DataRegister: 0x00
So in the code we modify:
#define OTP3001_REG 0x0000 /* Die Temp Result Register for TMP006 */
#define OTP3001_ADDR 0x47;
#define OTP3001_ADDR 0x47;
According to OTP3001 datasheet, in default, a configuration register (address 0x01) in sleep mode, so if we read data out, it will be always 0.
So we need to set it on working mode for the IC as the code below:
So we need to set it on working mode for the IC as the code below:
txBuffer[0] = 0x01; // set address of Register need to access
txBuffer[1] = 0xCC; // the configuration register has two byte and this High Byte
txBuffer[2] = 0x10;// this is low Byte
To write to the register we use the code as following:
/* Common I2C transaction setup */
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 3;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.readCount = 2;
if (I2C_transfer(i2c, &i2cTransaction))
{
light = (rxBuffer[0] << 8) | (rxBuffer[1]);
Display_printf(display, 0, 0, "After Configuration : %d (C)",
light);
}
Here we print the result to UART to verify it works by reading the register.
For reading level of light at Result Register, we need to know the format of it.
From the datasheet, it has E[15-12] for exponent and N[11-0] for number:
The value is:
From the datasheet, it has E[15-12] for exponent and N[11-0] for number:
The value is:
M = 2**E[15-12]*N[11-0]*0.01
So we use the code below to express the result:
So we use the code below to express the result:
i2cTransaction.writeCount = 1;
txBuffer[0] = 0x00;
for (sample = 0; sample < 20; sample++) {
if (I2C_transfer(i2c, &i2cTransaction)) {
pow = (rxBuffer[0] >> 4) ;
light = ((rxBuffer[0]&0x0F) << 8) | (rxBuffer[1]);
while(pow!=0)
{
pow -=1; // Multiply 2^n by left shifting to n times
light <<=1;
}
light *=0.01;
Display_printf(display, 0, 0, "Sample %u: %d (C)",
sample, light); //temperature
}
else {
Display_printf(display, 0, 0, "I2C Bus fault.");
}
/* Sleep for 1 second */
sleep(1);
}
here we declare two variable: pow for Exponent part and light for result in decimal
And the result on UART as below:
Comments
Post a Comment