第一次用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 µÍ |
#define | ADT7420_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_StopCondi
tion(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;
}