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; 
 
}