5.4.1 TA Bits to Temperature Conversion
To convert the TA bits to decimal temperature, the upper three boundary bits (TA<15:13>) must be masked out. Then, determine the SIGN bit (bit 12) to check positive or negative temperature, shift the bits accordingly, and combine the upper and lower bytes of the 16-bit register. The upper byte contains data for temperatures greater than +32°C while the lower byte contains data for temperature less than +32°C, including fractional data. When combining the upper and lower bytes, the upper byte must be right-shifted by 4 bits (or multiply by 24) and the lower byte must be left-shifted by 4 bits (or multiply by 2-4). Adding the results of the shifted values provides the temperature data in decimal format (see Equation 5-1).
The temperature bits are in two’s compliment format, therefore, positive temperature data and negative temperature data are computed differently. Equation 5-1 shows the temperature computation. The example instruction code, outlined in Example 5-1, shows the communication flow; also see Figure 5-5 for the timing diagram.
Where:
TA = Ambient Temperature (°C)
UpperByte = TA bit 15 to bit 8
LowerByte = TA bit 7 to bit 0
Sample Instruction Code
This example routine assumes the variables and I2C communication subroutines are predefined (see Appendix A Source Code):
i2c_start(); // send START command
i2c_write (AddressByte & 0xFE); //WRITE Command (see Section 4.1.4 “Address Byte”)
//also, make sure bit 0 is cleared ‘0’
i2c_write(0x05); // Write TA Register Address
i2c_start(); //Repeat START
i2c_write(AddressByte | 0x01); // READ Command (seeSection 4.1.4 “Address Byte”)
//also, make sure bit 0 is Set ‘1’
UpperByte = i2c_read(ACK); // READ 8 bits
//and Send ACK bit
LowerByte = i2c_read(NAK); // READ 8 bits
//and Send NAK bit
i2c_stop(); // send STOP command
//Convert the temperature data
//First Check flag bits
if ((UpperByte & 0x80) == 0x80){ //TA ≥ TCRIT
}
if ((UpperByte & 0x40) == 0x40){ //TA> TUPPER
}
if ((UpperByte & 0x20) == 0x20){ //TA< TLOWER
}
UpperByte = UpperByte & 0x1F; //Clear flag bits
if ((UpperByte & 0x10) == 0x10){ //TA< 0°C
UpperByte = UpperByte & 0x0F; //Clear SIGN
Temperature = 256 - (UpperByte x 16 + LowerByte / 16);
}else //TA ≥ 0°C
Temperature = (UpperByte x 16 + LowerByte / 16);
//Temperature = Ambient Temperature (°C)
