已回答假定已回答

ADT7420调试问题

辰天师 在 2018-6-29 詢問的問題
最後回覆由ternence於2018-7-2提供

第一次用ADT7420,然后用的是之前就已经做好的模拟I2C的程序,之后也是按照数据手册的读写时序来做的。但是根本联不通,I2C两个引脚都是10K上拉,芯片17也接地了。

不知道是哪里的问题,就换成了官方历程的I2C时序,但是还是,我来贴出我的代码,望指正。

 

#define    ADT7420_ADDR         0x48         // Æ÷¼þ´ÓµØÖ·  A1:A0Ϊ 00  
//#define    ADT7420_ADDR         0x49         // Æ÷¼þ´ÓµØÖ·  A1:A0Ϊ 01
//#define    ADT7420_ADDR         0x4A         // Æ÷¼þ´ÓµØÖ·  A1:A0Ϊ 10
//#define    ADT7420_ADDR         0x4B         // Æ÷¼þ´ÓµØÖ·  A1:A0Ϊ 11

 

#define ADT7420_I2C_IO_SDA           (1 << 4)          //  ADT7420_I2C_IO_SDA  P0.4¹Ü½Å

#define ADT7420_I2C_IO_SCL           (1 << 0)         //   ADT7420_I2C_IO_SCL  P0.0¹Ü½Å

 

 

 

 

#define  ADT7420_I2C_SDA_HIGH()     LPC_GPIO_PORT->PIN[0] |=  ADT7420_I2C_IO_SDA//MCU824 -> SDA   ¸ß
#define  ADT7420_I2C_SDA_LOW()     LPC_GPIO_PORT->PIN[0] &= ~ADT7420_I2C_IO_SDA  //MCU824 -> SDA   µÍ
#define  ADT7420_I2C_SCL_HIGH()     LPC_GPIO_PORT->PIN[0] |=  ADT7420_I2C_IO_SCL//MCU824 -> SCL   ¸ß
#define  ADT7420_I2C_SCL_LOW()     LPC_GPIO_PORT->PIN[0] &= ~ADT7420_I2C_IO_SCL//MCU824 -> SCL   µÍ

 

 

#defineADT7420_I2C_SDA_V()             ((LPC_GPIO_PORT->PIN[0] & ADT7420_I2C_IO_SDA) >>4)   //SDAÖµ

                                  

#define ADT7420_I2C_SDA_IN()             LPC_GPIO_PORT->DIR[0] &=  ~ADT7420_I2C_IO_SDA;// SDA¸ÄIN
#define ADT7420_I2C_SDA_OUT()            LPC_GPIO_PORT->DIR[0] |=   ADT7420_I2C_IO_SDA;// SDA¸ÄOUT
#define ADT7420_I2C_SCL_OUT()            LPC_GPIO_PORT->DIR[0] |=   ADT7420_I2C_IO_SCL;

// SCL¸ÄOUT

void ADT7420_I2C_Start (void)  

{

 

// ADT7420_I2C_SDA_OUT();

// ADT7420_I2C_SCL_OUT();

  ADT7420_I2C_SDA_HIGH();

  Delay_10us(5);

  ADT7420_I2C_SCL_HIGH();

  Delay_10us(5);

  ADT7420_I2C_SDA_LOW();   //¿ªÊ¼Ìõ¼þ

 

}

 

 

/******************************************************

**º¯Êý£ºADT7420_I2C_StopCondition(void)         

**      I2C½áÊøÌõ¼þ

**      SCLΪ¸ßʱ£¬SDAÓɵ͵½¸ßÌø±ä

*******************************************************/

 

 

void ADT7420_I2C_Stop (void)

{

// ADT7420_I2C_SDA_OUT();

// ADT7420_I2C_SCL_OUT();

 

  ADT7420_I2C_SDA_LOW();

  Delay_10us(5);

  ADT7420_I2C_SCL_HIGH();

  Delay_10us(5);

  ADT7420_I2C_SDA_HIGH();  //ÖÕÖ¹Ìõ¼þ

}

 

 

/***********************************************************************************

º¯Êý£º void ADT7420_I2C_Send_ACK ( int ack )

¹¦ÄÜ£º I2C ·¢³öACKÐźţ¨¶ÁÊý¾ÝʱʹÓã©          -----

SCL

      -----      -----

SDA

      -----

***********************************************************************************/

 

 

void ADT7420_I2C_Send_ACK ( uint8_t ack )

{

// ADT7420_I2C_SDA_OUT() ;

// ADT7420_I2C_SDA_LOW();

  ADT7420_I2C_SCL_LOW();

  if(ack)

  ADT7420_I2C_SDA_HIGH();

  else

  ADT7420_I2C_SDA_LOW();

  Delay_10us(5);

  ADT7420_I2C_SCL_HIGH();

  Delay_10us(5);

}

 

 

uint8_t ADT7420_I2C_Read_ACK (void)

{

  int i = 1 ;

  uint8_t ack;

  uint8_t error;

  ADT7420_I2C_SDA_IN();

  ADT7420_I2C_SCL_LOW();

  if(ADT7420_I2C_SDA_V())

    ack=1;

  else

  ack=0;

  while (( ADT7420_I2C_SDA_V() != 0 )  && ( i<= 50) )                 //   ACK УÑé   µÃ  i=1ʱ£¬¾Í¿ÉÌø³öÑ»·

  {

  i++ ;

  Delay_10us(1);

  if (i==50)

  error = ACK_ERROR ;

  }

  Delay_10us(5);

  ADT7420_I2C_SCL_HIGH();

  Delay_10us(5);

 

  ADT7420_I2C_SDA_OUT() ;

 

  return error ;

}

 

 

/*********************************************************************

º¯Êý£ºADT7420_I2C_WriteByte()                 

¹¦ÄÜ£ºÏòI2C×ÜÏßд1¸ö×Ö½ÚµÄÊý¾Ý

²ÎÊý£º

    dat£ºÒªÐ´µ½×ÜÏßÉϵÄÊý¾Ý

*********************************************************************/

 

 

void ADT7420_I2C_Send_byte ( uint8_t data )

{

  uint8_t i ;

 

  ADT7420_I2C_SDA_OUT() ;

  ADT7420_I2C_SCL_OUT() ;

 

  for(i=0;i<8;i++)

  {

  ADT7420_I2C_SCL_LOW();

 

 

  if((data & 0x80)==0x80)

  ADT7420_I2C_SDA_HIGH();

  else

  ADT7420_I2C_SDA_LOW();

  Delay_10us(2);

 

 

  ADT7420_I2C_SCL_HIGH();

 

  data = (data << 1);

 

  Delay_10us(5);

  }       //Êä³ö×Ö½Ú

}

 

 

/******************************************************************

º¯Êý£ºADT7420_I2C_ReadByte()             

¹¦ÄÜ£º´Ó´Ó»ú¶ÁÈ¡1¸ö×Ö½ÚµÄÊý¾Ý

·µ»Ø£º¶ÁÈ¡µÄÒ»¸ö×Ö½ÚÊý¾Ý

******************************************************************/

 

 

uint8_t ADT7420_I2C_Read_byte (void)

{

  uint8_t i;

 

 

  uint8_t data=0 ;

// ADT7420_I2C_SCL_OUT();

  ADT7420_I2C_SDA_IN();

  for(i=0;i<8;i++)

  {

  ADT7420_I2C_SCL_LOW();

  data = (data << 1);

  Delay_10us(5);

  if(ADT7420_I2C_SDA_V())

  {

  data |= 0x01;

  }

  else

  {

  data &= ~0x01;

  }

 

 

  ADT7420_I2C_SCL_HIGH();

  Delay_10us(5);

  }

 

  ADT7420_I2C_SDA_OUT();

 

  return data ;

 

}

 

 

unsigned char ReadFromADT7420ViaI2C(unsigned char Dads)

{

  unsigned char   i;

  unsigned char Value;

 

 

  ADT7420_I2C_Start();

 

 

  WriteToADT7420Byte(0x90);

  WriteToADT7420Byte(Dads);  //Êä³öоƬдµØÖ·ºÍ¼Ä´æÆ÷µØÖ·

 

  ADT7420_I2C_Start();

 

  WriteToADT7420Byte(0x91);  //Êä³öоƬ¶ÁµØÖ·

 

  Value=ADT7420_I2C_Read_byte();

 

  ADT7420_I2C_Send_ACK(0);

 

  ADT7420_I2C_Stop();

 

 

  return  Value;

}

結果