ds1631_i2c.c - PIC24 uC in Master mode to Maxim DS1631 Digital Thermometer using I2CΒΆ
I2C Example: Demonstrates I2C functions by reading/writing from a Maxim DS1631 Digital Thermometer.
#include "pic24_all.h"
#include <stdio.h>
#define DS1631ADDR 0x90 //DS1631 address with all pins tied low
#define ACCESS_CONFIG 0xAC
#define START_CONVERT 0x51
#define READ_TEMP 0xAA
void writeConfigDS1631(uint8_t u8_i) {
write2I2C1(DS1631ADDR, ACCESS_CONFIG, u8_i);
}
void startConversionDS1631() {
write1I2C1(DS1631ADDR, START_CONVERT);
}
int16_t readTempDS1631() {
uint8_t u8_lo, u8_hi;
int16_t i16_temp;
write1I2C1(DS1631ADDR, READ_TEMP);
read2I2C1 (DS1631ADDR, &u8_hi, &u8_lo);
i16_temp = u8_hi;
return ((i16_temp<<8)|u8_lo);
}
int main (void) {
int16_t i16_temp;
float f_tempC,f_tempF;
configBasic(HELLO_MSG);
configI2C1(400); //configure I2C for 400 KHz
writeConfigDS1631(0x0C); //continuous conversion, 12-bit mode
startConversionDS1631(); //start conversions
while (1) {
DELAY_MS(750);
i16_temp = readTempDS1631();
f_tempC = i16_temp; //convert to floating point
f_tempC = f_tempC/256; //divide by precision
f_tempF = f_tempC*9/5 + 32;
printf("Temp is: 0x%0X, %4.4f (C), %4.4f (F)\n", i16_temp, (double) f_tempC, (double) f_tempF);
}
}