www.pudn.com > LPT_I2C_ADuC.rar > I2C_DEVICE.c
/**************************************************************************** * * File: I2C_DEVICE.c * * Author: Fiberxon(Jack Zhou) * * Description: Base function of the I2C-LPT accessing with EVB * * Time: 2006-Feb-26 * * version: v1.2 ÖØ´ó¸Ä°æ ****************************************************************************/ #include#include "utility.h" #include "I2C_LPT.h" #include "I2C_PROTOCOL.h" unsigned char m_1848_address_pointer_value; unsigned char m_1848_configuration_value; unsigned char m_1848_r0_value; unsigned char m_1848_r1_value; unsigned char m_1848_t_lsb_value; unsigned char m_1848_t_msb_value; unsigned char m_1848_table_select_value; double u0_R1,v0_R1,w0_R1,x0_R1,y0_R1,z0_R1,u1_R1,v1_R1,w1_R1,x1_R1,y1_R1,z1_R1; double u0_R2,v0_R2,w0_R2,x0_R2,y0_R2,z0_R2,u1_R2,v1_R2,w1_R2,x1_R2,y1_R2,z1_R2; int I2C_selftest(void) {int error, HOST_SDA_IN_error_counter; unsigned char HOST_SDA_IN; HOST_SDA_IN_error_counter=0; SetSDA(0); //HOST_SDA_OUT=1; HOST_SDA_OUT=0; SPI_DAT='0'; SPI_CLK='0'; SPI_CS='0'; HOST_SDA_IN=GetSDA(); if (HOST_SDA_IN != 0) {HOST_SDA_IN_error_counter++;} SetSDA(1); //HOST_SDA_OUT=1; HOST_SDA_OUT=0; SPI_DAT='0'; SPI_CLK='0'; SPI_CS='0'; HOST_SDA_IN=GetSDA(); if (HOST_SDA_IN != 1) {HOST_SDA_IN_error_counter++;} if (HOST_SDA_IN_error_counter) error=-1; else error=0; return error; } int Set_7312(unsigned char MAX7312_I2C_Slaadd, unsigned char cmd_7312, unsigned char dat1_7312, unsigned char dat2_7312) { I2C_START(); //device address code sda will be "str_device_addr+0" I2C_WRITE_DEVICE_ADDR(MAX7312_I2C_Slaadd,0); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //set WORD_VALUE , high order bit first I2C_WRITE_WORD_VALUE(cmd_7312); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //set WORD_VALUE , high order bit first I2C_WRITE_WORD_VALUE(dat1_7312); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //set WORD_VALUE , high order bit first I2C_WRITE_WORD_VALUE(dat2_7312); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //STOP I2C_STOP(); Delay(0.010); // Twr_max=10ms, waiting for WWPROM internal data written. return 0; } int Get_7312(unsigned char MAX7312_I2C_Slaadd, unsigned char cmd_7312, unsigned char *dat1_7312, unsigned char *dat2_7312) { I2C_START(); //device address code sda will be "str_device_addr+0" I2C_WRITE_DEVICE_ADDR(MAX7312_I2C_Slaadd,0); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //set WORD_VALUE , high order bit first I2C_WRITE_WORD_VALUE(cmd_7312); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } I2C_START(); //device address code sda will be "str_device_addr+0" I2C_WRITE_DEVICE_ADDR(MAX7312_I2C_Slaadd,1); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //get Data Byte high order bit first *dat1_7312=I2C_READ_WORD_VALUE(); //set acknowledge I2C_SET_ACK(); //get Data Byte high order bit first *dat2_7312=I2C_READ_WORD_VALUE(); //set acknowledge I2C_SET_ACK(); //STOP I2C_STOP(); Delay(0.010); // Twr_max=10ms, waiting for WWPROM internal data written. return 0; } int Get_7312_singlebyte(unsigned char MAX7312_I2C_Slaadd, unsigned char cmd_7312, unsigned char *dat1_7312) { I2C_START(); //device address code sda will be "str_device_addr+0" I2C_WRITE_DEVICE_ADDR(MAX7312_I2C_Slaadd,0); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //set WORD_VALUE , high order bit first I2C_WRITE_WORD_VALUE(cmd_7312); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } I2C_START(); //device address code sda will be "str_device_addr+0" I2C_WRITE_DEVICE_ADDR(MAX7312_I2C_Slaadd,1); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //get Data Byte high order bit first *dat1_7312=I2C_READ_WORD_VALUE(); //set acknowledge I2C_SET_ACK(); //STOP I2C_STOP(); Delay(0.010); // Twr_max=10ms, waiting for WWPROM internal data written. return 0; } int Set_7312_singlebyte(unsigned char MAX7312_I2C_Slaadd, unsigned char cmd_7312, unsigned char dat1_7312) { I2C_START(); //device address code sda will be "str_device_addr+0" I2C_WRITE_DEVICE_ADDR(MAX7312_I2C_Slaadd,0); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //set WORD_VALUE , high order bit first I2C_WRITE_WORD_VALUE(cmd_7312); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //set WORD_VALUE , high order bit first I2C_WRITE_WORD_VALUE(dat1_7312); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //STOP I2C_STOP(); Delay(0.010); // Twr_max=10ms, waiting for WWPROM internal data written. return 0; } int INIT_1238(unsigned char MAX1238_I2C_Slaadd, unsigned char m_1238_setup_value, unsigned char m_1238_config_value) { I2C_START(); //device address code sda will be "str_device_addr+0" I2C_WRITE_DEVICE_ADDR(MAX1238_I2C_Slaadd,0); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //set WORD_VALUE , m_1238_setup_value //I2C_WRITE_WORD_VALUE(0xd2); I2C_WRITE_WORD_VALUE(m_1238_setup_value); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //set WORD_VALUE , m_1238_config_value //I2C_WRITE_WORD_VALUE(0x07); I2C_WRITE_WORD_VALUE(m_1238_config_value); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //STOP I2C_STOP(); Delay(0.005); // Twr_max=10ms, waiting for WWPROM internal data written. return 0; } int SET_1238_SELECTED_CHANNEL_SAMPLE_8TIMES(unsigned char MAX1238_I2C_Slaadd, unsigned char channel) {unsigned char m_1238_setup_value, m_1238_config_value; float delay=0.001; int error; //scan only Ain_channel m_1238_setup_value=0xd2; m_1238_config_value=0x21 | (channel<<1); //Converts the input selected by CS3¨CCS0 eight times error = INIT_1238(MAX1238_I2C_Slaadd,m_1238_setup_value,m_1238_config_value); if (error <0) { return -1; } Delay(delay);//Must Delay or else the sample value will be wrong return error; } int READ_1238_SELECTED_CHANNEL(unsigned char MAX1238_I2C_Slaadd, int *m_1238_ain_value) { int int_temp; unsigned char byte_msb,byte_lsb,config_byte; unsigned char m_1238_setup_value, m_1238_config_value; float delay=0.001; I2C_START(); //device address code sda will be "str_device_addr+1" I2C_WRITE_DEVICE_ADDR(MAX1238_I2C_Slaadd,1); //set acknowledge I2C_SET_ACK(); //wait for clock STRETCH time Delay(delay); //Must Delay or else the sample value will be wrong //get Data Byte high order bit first byte_msb=I2C_READ_WORD_VALUE(); //set acknowledge I2C_SET_ACK(); //get Data Byte high order bit first byte_lsb=I2C_READ_WORD_VALUE(); //set acknowledge I2C_SET_ACK(); *m_1238_ain_value = ((byte_msb & 0x0f)<<8) | byte_lsb; //STOP I2C_STOP(); return 0; } int INIT_1236(unsigned char MAX1236_I2C_Slaadd, unsigned char m_1236_setup_value, unsigned char m_1236_config_value) { I2C_START(); //device address code sda will be "str_device_addr+0" I2C_WRITE_DEVICE_ADDR(MAX1236_I2C_Slaadd,0); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //set WORD_VALUE , m_1236_setup_value //I2C_WRITE_WORD_VALUE(0xd2); I2C_WRITE_WORD_VALUE(m_1236_setup_value); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //set WORD_VALUE , m_1236_config_value //I2C_WRITE_WORD_VALUE(0x07); I2C_WRITE_WORD_VALUE(m_1236_config_value); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //STOP I2C_STOP(); Delay(0.005); // Twr_max=10ms, waiting for WWPROM internal data written. return 0; } int SET_1236_SELECTED_CHANNEL_SAMPLE_8TIMES(unsigned char MAX1236_I2C_Slaadd, unsigned char channel) {unsigned char m_1236_setup_value, m_1236_config_value; float delay=0.001; int error; //scan only Ain_channel m_1236_setup_value=0xd2; m_1236_config_value=0x21 | (channel<<1); //Converts the input selected by CS3¨CCS0 eight times error = INIT_1236(MAX1236_I2C_Slaadd,m_1236_setup_value,m_1236_config_value); if (error <0) { return -1; } Delay(delay);//Must Delay or else the sample value will be wrong return error; } int READ_1236_SELECTED_CHANNEL(unsigned char MAX1236_I2C_Slaadd, int *m_1236_ain_value) { int int_temp; unsigned char byte_msb,byte_lsb,config_byte; unsigned char m_1236_setup_value, m_1236_config_value; float delay=0.001; I2C_START(); //device address code sda will be "str_device_addr+1" I2C_WRITE_DEVICE_ADDR(MAX1236_I2C_Slaadd,1); //set acknowledge // I2C_SET_ACK(); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //wait for clock STRETCH time Delay(delay); //Must Delay or else the sample value will be wrong //get Data Byte high order bit first byte_msb=I2C_READ_WORD_VALUE(); //set acknowledge I2C_SET_ACK(); //get Data Byte high order bit first byte_lsb=I2C_READ_WORD_VALUE(); //set acknowledge I2C_SET_ACK(); *m_1236_ain_value = ((byte_msb & 0x0f)<<8) | byte_lsb; //STOP I2C_STOP(); return 0; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ int INIT_1721(unsigned char DS1721_I2C_Slaadd, unsigned char CMD, unsigned char CONFIGURATION) { I2C_START(); //device address code sda will be "str_device_addr+0" I2C_WRITE_DEVICE_ADDR(DS1721_I2C_Slaadd,0); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //set WORD_VALUE , m_1236_setup_value //I2C_WRITE_WORD_VALUE(0xd2); I2C_WRITE_WORD_VALUE(CMD); //CMD=Access Config //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } I2C_START(); //device address code sda will be "str_device_addr+0" I2C_WRITE_DEVICE_ADDR(DS1721_I2C_Slaadd,1); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //get Data Byte high order bit first CONFIGURATION=I2C_READ_WORD_VALUE(); //set acknowledge I2C_SET_NONE_ACK(); I2C_START(); I2C_WRITE_DEVICE_ADDR(DS1721_I2C_Slaadd,0); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //wait for clock STRETCH time // Delay(delay); CMD=0x51; I2C_WRITE_WORD_VALUE(CMD); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //STOP I2C_STOP(); Delay(0.005); // Twr_max=10ms, waiting for WWPROM internal data written. return 0; } int Read_1721(unsigned char DS1721_I2C_Slaadd, unsigned short *t) { int int_temp; unsigned char byte_msb,byte_lsb,CMD; float delay=0.000; I2C_START(); I2C_WRITE_DEVICE_ADDR(DS1721_I2C_Slaadd,0); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } CMD=0xaa; I2C_WRITE_WORD_VALUE(CMD); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } I2C_START(); I2C_WRITE_DEVICE_ADDR(DS1721_I2C_Slaadd,1); //get acknowledge if (I2C_GET_ACK()) //error with no ack signal from target { return -1; } //get Data Byte high order bit first byte_msb=I2C_READ_WORD_VALUE(); //set acknowledge I2C_SET_ACK(); //get Data Byte high order bit first byte_lsb=I2C_READ_WORD_VALUE(); //set acknowledge I2C_SET_NONE_ACK(); //STOP I2C_STOP(); *t = ((byte_msb & 0xff)<<8) | byte_lsb; return 0; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ int Read_3902R(unsigned char DS3902_I2C_Slaadd, unsigned char *h0, unsigned char *h1) { int int_temp; int_temp = I2C_BYTE_READ (DS3902_I2C_Slaadd,0x02); if (int_temp<0) //error with no ack signal from target { return -1; } *h0=(unsigned char)(int_temp & 0xff); int_temp = I2C_BYTE_READ (DS3902_I2C_Slaadd,0x03); if (int_temp<0) //error with no ack signal from target { return -1; } *h1=(unsigned char)(int_temp & 0xff); return 0; } int Write_3902R(unsigned char DS3902_I2C_Slaadd, unsigned char h0, unsigned char h1) { int int_temp; int_temp = I2C_BYTE_WRITE (DS3902_I2C_Slaadd,0x02,h0); if (int_temp<0) //error with no ack signal from target { return -1; } int_temp = I2C_BYTE_WRITE (DS3902_I2C_Slaadd,0x03,h1); if (int_temp<0) //error with no ack signal from target { return -1; } return 0; } int Write_3902R_H0(unsigned char DS3902_I2C_Slaadd, unsigned char h0) { int int_temp; int_temp = I2C_BYTE_WRITE (DS3902_I2C_Slaadd,0x02,h0); if (int_temp<0) //error with no ack signal from target { return -1; } return 0; } int Write_3902R_H1(unsigned char DS3902_I2C_Slaadd, unsigned char h1) { int int_temp; int_temp = I2C_BYTE_WRITE (DS3902_I2C_Slaadd,0x03,h1); if (int_temp<0) //error with no ack signal from target { return -1; } return 0; } int Change_3902_SlaveAdd(unsigned char DS3902_I2C_Slaadd, unsigned char New_DS3902_I2C_Slaadd) { int int_temp; int_temp = I2C_BYTE_WRITE (DS3902_I2C_Slaadd,0x00,New_DS3902_I2C_Slaadd); if (int_temp<0) //error with no ack signal from target { return -1; } return 0; } int Set_3902R_HZ(unsigned char DS3902_I2C_Slaadd, unsigned char HZ_h0, unsigned char HZ_h1) { int int_temp; int_temp = I2C_BYTE_WRITE (DS3902_I2C_Slaadd,0x01,((HZ_h1<<1)|HZ_h0)); if (int_temp<0) //error with no ack signal from target { return -1; } return 0; } int LOCK_DS3902(unsigned char DS3902_I2C_Slaadd, unsigned char pw1, unsigned char pw2) { int int_temp; unsigned char p1,p2; //if error password entry if ((pw1==0) && (pw2==0)) {return -2;} int_temp = I2C_TWOBYTE_WRITE(DS3902_I2C_Slaadd,0x06,pw1,pw2); if (int_temp<0) //error with no ack signal from target { return -1; } //check password //enter password int_temp = I2C_TWOBYTE_WRITE(DS3902_I2C_Slaadd,0x04,pw1,pw2); if (int_temp<0) //error with no ack signal from target { return -1; } //Read password int_temp = I2C_BYTE_READ (DS3902_I2C_Slaadd,0x06); if (int_temp<0) //error with no ack signal from target { return -1; } p1 = int_temp; int_temp = I2C_BYTE_READ (DS3902_I2C_Slaadd,0x07); if (int_temp<0) //error with no ack signal from target { return -1; } p2 = int_temp; //enter password as 0xff,0xff, so as to lock DS3902 int_temp = I2C_TWOBYTE_WRITE(DS3902_I2C_Slaadd,0x04,0xff,0xff); if (int_temp<0) //error with no ack signal from target { return -1; } if ( (p1==pw1) && (p2==pw2) ) { return 1; }//success else { return -3; }//fault return 0; } int UNLOCK_DS3902(unsigned char DS3902_I2C_Slaadd, unsigned char pw1, unsigned char pw2) { int int_temp; unsigned char p1,p2; //if error password entry if ((pw1==0) && (pw2==0)) {return -2;} //Read original password int_temp = I2C_BYTE_READ (DS3902_I2C_Slaadd,0x06); if (int_temp<0) //error with no ack signal from target { return -1; } p1 = int_temp; int_temp = I2C_BYTE_READ (DS3902_I2C_Slaadd,0x07); if (int_temp<0) //error with no ack signal from target { return -1; } p2 = int_temp; //if no password, and the password are 255,255 if ((p1==255) && (p2=255)) //if no password, and the password are 255,255 {return 2;} //Set password int_temp = I2C_TWOBYTE_WRITE(DS3902_I2C_Slaadd,0x04,pw1,pw2); if (int_temp<0) //error with no ack signal from target { return -1; } //Read original password int_temp = I2C_BYTE_READ (DS3902_I2C_Slaadd,0x06); if (int_temp<0) //error with no ack signal from target { return -1; } p1 = int_temp; int_temp = I2C_BYTE_READ (DS3902_I2C_Slaadd,0x07); if (int_temp<0) //error with no ack signal from target { return -1; } p2 = int_temp; //if error password entry if ((p1==0) && (p2==0)) {return -3;} if ( (p1==pw1) && (p2==pw2) ) { int_temp = I2C_TWOBYTE_WRITE(DS3902_I2C_Slaadd,0x06,0xff,0xff); if (int_temp<0) //error with no ack signal from target { return -1; } int_temp = I2C_TWOBYTE_WRITE(DS3902_I2C_Slaadd,0x04,0xff,0xff); if (int_temp<0) //error with no ack signal from target { return -1; } return 1; //success } else {return -3;} return 0; } /*===============================================================================*/ int INIT_1848(unsigned char DS1848_I2C_Slaadd) { unsigned char m_1848_u0_msb_value ; unsigned char m_1848_u0_lsb_value ; unsigned char m_1848_u1_msb_value ; unsigned char m_1848_u1_lsb_value ; unsigned char m_1848_v0_msb_value ; unsigned char m_1848_v0_lsb_value ; unsigned char m_1848_v1_msb_value ; unsigned char m_1848_v1_lsb_value ; unsigned char m_1848_w0_msb_value ; unsigned char m_1848_w0_lsb_value ; unsigned char m_1848_w1_msb_value ; unsigned char m_1848_w1_lsb_value ; unsigned char m_1848_x0_msb_value ; unsigned char m_1848_x0_lsb_value ; unsigned char m_1848_x1_msb_value ; unsigned char m_1848_x1_lsb_value ; unsigned char m_1848_y0_msb_value ; unsigned char m_1848_y0_lsb_value ; unsigned char m_1848_y1_msb_value ; unsigned char m_1848_y1_lsb_value ; unsigned char m_1848_z0_msb_value ; unsigned char m_1848_z0_lsb_value ; unsigned char m_1848_z1_msb_value ; unsigned char m_1848_z1_lsb_value ; int error; //Get DS1848_I2C_Slaadd(R1) parameter m_1848_table_select_value=0; m_1848_configuration_value=7; error=I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xE0, m_1848_table_select_value); if (error<0) { return -1; } error=I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xE1, m_1848_configuration_value); if (error<0) { return -1; } m_1848_u0_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x60); m_1848_u0_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x61); m_1848_u1_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x6c); m_1848_u1_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x6d); m_1848_v0_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x62); m_1848_v0_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x63); m_1848_v1_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x6e); m_1848_v1_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x6f); m_1848_w0_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x64); m_1848_w0_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x65); m_1848_w1_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x70); m_1848_w1_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x71); m_1848_x0_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x66); m_1848_x0_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x67); m_1848_x1_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x72); m_1848_x1_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x73); m_1848_y0_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x68); m_1848_y0_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x69); m_1848_y1_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x74); m_1848_y1_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x75); m_1848_z0_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x6a); m_1848_z0_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x6b); m_1848_z1_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x76); m_1848_z1_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0x77); u0_R1= ((m_1848_u0_msb_value << 8) | m_1848_u0_lsb_value) / 256.0; v0_R1= ((m_1848_v0_msb_value << 8) | m_1848_v0_lsb_value) / 1000000.0; w0_R1= ((m_1848_w0_msb_value << 8) | m_1848_w0_lsb_value) / 1000000000.0; x0_R1= ((m_1848_x0_msb_value << 8) | m_1848_x0_lsb_value) / 256.0; y0_R1= ((m_1848_y0_msb_value << 8) | m_1848_y0_lsb_value) / 10000000.0; z0_R1= ((m_1848_z0_msb_value << 8) | m_1848_z0_lsb_value) / 10000000000.0; u1_R1= ((m_1848_u1_msb_value << 8) | m_1848_u1_lsb_value) / 256.0; v1_R1= ((m_1848_v1_msb_value << 8) | m_1848_v1_lsb_value) / 1000000.0; w1_R1= ((m_1848_w1_msb_value << 8) | m_1848_w1_lsb_value) / 1000000000.0; x1_R1= ((m_1848_x1_msb_value << 8) | m_1848_x1_lsb_value) / 256.0; y1_R1= ((m_1848_y1_msb_value << 8) | m_1848_y1_lsb_value) / 10000000.0; z1_R1= ((m_1848_z1_msb_value << 8) | m_1848_z1_lsb_value) / 10000000000.0; return 0; } int set_1848_resistor(unsigned char DS1848_TYPE, unsigned char DS1848_I2C_Slaadd, unsigned char R0_position, unsigned char R1_position, double *r0, double *r1, double *t) {double Alpha_010_R0andR1= 8.394533, Alpha_050_R0 = 3.78964, Alpha_050_R1 = 19.74866; double t_R1; int error; //Set 1848 m_1848_table_select_value=0; m_1848_configuration_value=0; //changed error=I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xE0, m_1848_table_select_value); if (error<0) { return -1; } error=I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xE1, m_1848_configuration_value); if (error<0) { return -1; } //R=255; error=I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xF0, R0_position); if (error<0) { return -1; } error=I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xF1, R1_position); if (error<0) { return -1; } Delay(0.001); //must delay for 1848 converting //Get 1848 temperature m_1848_t_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0xE2); m_1848_t_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0xE3); *t = ((m_1848_t_msb_value<< 8) | m_1848_t_lsb_value)/128.0 - 2*256.0*((m_1848_t_msb_value & 0x80) >> 7) ; //Calculate two 1848 resistor value t_R1=*t; if (DS1848_TYPE) //DS1848-050 { *r0 = (R0_position+Alpha_050_R0) *x0_R1*(1+y0_R1*(t_R1-25.0)+z0_R1*(t_R1-25.0)*(t_R1-25.0)) + u0_R1*(1+v0_R1*(t_R1-25.0)+w0_R1*(t_R1-25.0)*(t_R1-25.0)); *r1 = (R1_position+Alpha_050_R1) *x1_R1*(1+y1_R1*(t_R1-25.0)+z1_R1*(t_R1-25.0)*(t_R1-25.0)) + u1_R1*(1+v1_R1*(t_R1-25.0)+w1_R1*(t_R1-25.0)*(t_R1-25.0)); } else //DS1848-010 { *r0 = (R0_position+Alpha_010_R0andR1) *x0_R1*(1+y0_R1*(t_R1-25.0)+z0_R1*(t_R1-25.0)*(t_R1-25.0)) + u0_R1*(1+v0_R1*(t_R1-25.0)+w0_R1*(t_R1-25.0)*(t_R1-25.0)); *r1 = (R1_position+Alpha_010_R0andR1) *x1_R1*(1+y1_R1*(t_R1-25.0)+z1_R1*(t_R1-25.0)*(t_R1-25.0)) + u1_R1*(1+v1_R1*(t_R1-25.0)+w1_R1*(t_R1-25.0)*(t_R1-25.0)); } return 0; } int Read_1848_resistor(unsigned char DS1848_TYPE, unsigned char DS1848_I2C_Slaadd, unsigned char *position1, unsigned char *position2, double *r0, double *r1, double *t) {double Alpha_010_R0andR1= 8.394533, Alpha_050_R0 = 3.78964, Alpha_050_R1 = 19.74866; double t_R1; double pos1,pos2; int error; //Set 1848 m_1848_table_select_value=0; m_1848_configuration_value=0; //changed error=I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xE0, m_1848_table_select_value); if (error<0) { return -1; } error=I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xE1, m_1848_configuration_value); if (error<0) { return -1; } //Get 1848 temperature m_1848_t_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0xE2); m_1848_t_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0xE3); *t = ((m_1848_t_msb_value<< 8) | m_1848_t_lsb_value)/128.0 - 2*256.0*((m_1848_t_msb_value & 0x80) >> 7) ; *position1 =I2C_BYTE_READ (DS1848_I2C_Slaadd,0xF0); if (error<0) { return -1; } *position2 =I2C_BYTE_READ (DS1848_I2C_Slaadd,0xF1); if (error<0) { return -1; } Delay(0.001); //must delay for 1848 converting //Calculate two 1848 resistor value t_R1=*t; if (DS1848_TYPE) //DS1848-050 { *r0 = (*position1+Alpha_050_R0) *x0_R1*(1+y0_R1*(t_R1-25.0)+z0_R1*(t_R1-25.0)*(t_R1-25.0)) + u0_R1*(1+v0_R1*(t_R1-25.0)+w0_R1*(t_R1-25.0)*(t_R1-25.0)); *r1 = (*position2+Alpha_050_R1) *x1_R1*(1+y1_R1*(t_R1-25.0)+z1_R1*(t_R1-25.0)*(t_R1-25.0)) + u1_R1*(1+v1_R1*(t_R1-25.0)+w1_R1*(t_R1-25.0)*(t_R1-25.0)); } else //DS1848-010 { *r0 = (*position1+Alpha_010_R0andR1) *x0_R1*(1+y0_R1*(t_R1-25.0)+z0_R1*(t_R1-25.0)*(t_R1-25.0)) + u0_R1*(1+v0_R1*(t_R1-25.0)+w0_R1*(t_R1-25.0)*(t_R1-25.0)); *r1 = (*position2+Alpha_010_R0andR1) *x1_R1*(1+y1_R1*(t_R1-25.0)+z1_R1*(t_R1-25.0)*(t_R1-25.0)) + u1_R1*(1+v1_R1*(t_R1-25.0)+w1_R1*(t_R1-25.0)*(t_R1-25.0)); } return 0; } int get_1848_resistor(unsigned char DS1848_I2C_Slaadd, double RT1, unsigned char *position1, unsigned char *position2, double *r0, double *r1, double *t) {double alpha= 8.394533; double t_R1; double pos1,pos2; int error; //Set 1848 m_1848_table_select_value=0; m_1848_configuration_value=0; //changed error=I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xE0, m_1848_table_select_value); if (error<0) { return -1; } error=I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xE1, m_1848_configuration_value); if (error<0) { return -1; } //Get 1848 temperature m_1848_t_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0xE2); m_1848_t_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0xE3); *t = ((m_1848_t_msb_value<< 8) | m_1848_t_lsb_value)/128.0 - 2*256.0*((m_1848_t_msb_value & 0x80) >> 7) ; t_R1=*t; pos1=(2000*RT1-u0_R1*(1+v0_R1*(t_R1-25.0)+w0_R1*(t_R1-25.0)*(t_R1-25.0)))/x0_R1/(1+y0_R1*(t_R1-25.0)+z0_R1*(t_R1-25.0)*(t_R1-25.0))-alpha; pos2=(2000*RT1-u1_R1*(1+v1_R1*(t_R1-25.0)+w1_R1*(t_R1-25.0)*(t_R1-25.0)))/x1_R1/(1+y1_R1*(t_R1-25.0)+z1_R1*(t_R1-25.0)*(t_R1-25.0))-alpha; if (pos1<0) *position1=0; else *position1= (unsigned char)pos1; if (pos2<0) *position2=0; else *position2=(unsigned char)pos2; //R=255; error=I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xF0, *position1); if (error<0) { return -1; } error=I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xF1, *position2); if (error<0) { return -1; } Delay(0.001); //must delay for 1848 converting //Calculate two 1848 resistor value // t_R1=*t; *r0 = (*position1+alpha) *x0_R1*(1+y0_R1*(t_R1-25.0)+z0_R1*(t_R1-25.0)*(t_R1-25.0)) + u0_R1*(1+v0_R1*(t_R1-25.0)+w0_R1*(t_R1-25.0)*(t_R1-25.0)); *r1 = (*position2+alpha) *x1_R1*(1+y1_R1*(t_R1-25.0)+z1_R1*(t_R1-25.0)*(t_R1-25.0)) + u1_R1*(1+v1_R1*(t_R1-25.0)+w1_R1*(t_R1-25.0)*(t_R1-25.0)); return 0; } int Read_1848_temperature(unsigned char DS1848_I2C_Slaadd, double *t) {unsigned char m_1848_t_msb_value,m_1848_t_lsb_value; m_1848_configuration_value=7; I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xE1, m_1848_configuration_value); //Read 1848 temperature m_1848_t_msb_value= I2C_BYTE_READ (DS1848_I2C_Slaadd,0xE2); m_1848_t_lsb_value= I2C_BYTE_READ (DS1848_I2C_Slaadd,0xE3); *t = ((m_1848_t_msb_value<< 8) | m_1848_t_lsb_value)/128.0 - 2*256.0*((m_1848_t_msb_value & 0x80) >> 7) ; return 0; } int tune_1848_resistor(unsigned char DS1848_I2C_Slaadd, double RT1, unsigned char *position1, unsigned char *position2, double *r0, double *r1, double *t) {double alpha= 8.394533; double t_R1; double pos1,pos2; //Set 1848 m_1848_table_select_value=0; m_1848_configuration_value=0; //changed I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xE0, m_1848_table_select_value); I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xE1, m_1848_configuration_value); //Get 1848 temperature m_1848_t_msb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0xE2); m_1848_t_lsb_value = I2C_BYTE_READ (DS1848_I2C_Slaadd,0xE3); *t = ((m_1848_t_msb_value<< 8) | m_1848_t_lsb_value)/128.0 - 2*256.0*((m_1848_t_msb_value & 0x80) >> 7) ; t_R1=*t; *position1=255; *r0 = (*position1+alpha) *x0_R1*(1+y0_R1*(t_R1-25.0)+z0_R1*(t_R1-25.0)*(t_R1-25.0)) + u0_R1*(1+v0_R1*(t_R1-25.0)+w0_R1*(t_R1-25.0)*(t_R1-25.0)); *r1=1000*(*r0)*RT1/(*r0-1000*RT1); pos2=(*r1-u1_R1*(1+v1_R1*(t_R1-25.0)+w1_R1*(t_R1-25.0)*(t_R1-25.0)))/x1_R1/(1+y1_R1*(t_R1-25.0)+z1_R1*(t_R1-25.0)*(t_R1-25.0))-alpha; if (pos2<0) { *position2=1; *r1 = (*position2+alpha) *x1_R1*(1+y1_R1*(t_R1-25.0)+z1_R1*(t_R1-25.0)*(t_R1-25.0)) + u1_R1*(1+v1_R1*(t_R1-25.0)+w1_R1*(t_R1-25.0)*(t_R1-25.0)); *r0=1000*(*r1)*RT1/(*r1-1000*RT1); pos1=(*r0-u0_R1*(1+v0_R1*(t_R1-25.0)+w0_R1*(t_R1-25.0)*(t_R1-25.0)))/x0_R1/(1+y0_R1*(t_R1-25.0)+z0_R1*(t_R1-25.0)*(t_R1-25.0))-alpha; if (pos1<0) *position1=1; else *position1=(unsigned char)pos1; } else *position2=(unsigned char)pos2; I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xF0, *position1); I2C_BYTE_WRITE(DS1848_I2C_Slaadd,0xF1, *position2); Delay(0.001); //must delay for 1848 converting return 0; }