|
只能正确读出24C02的从地址0开始的三个字节,其他都读出来全是0xFF.
//检查总线,开始I2C
uchar Check_IIC_BUSY(void)
{
IICE0 = 1;
LREL0 = 1;
/* bus check */
DI();
if( IICBSY == 1 )
{
EI(); /* bus busy */
return MD_ERROR;
}
/* trigger check */
if( SPT0 == 1 || STT0 == 1)
{
EI();
return MD_ERROR;
}
STT0 = 1; /* IIC0 send start condition */
EI();
/* wait */
NOP();
NOP();
}
//停止
void IIC0_Stop( void )
{
SPT0 = 1; /* set stopcondition flag */
}
//等待应答
uchar IIC0_CheckAck(void)
{
uchar i;
i=IIC_WAIT;
while((!ACKD0) && (i--));
if(0 == i) return FALSE;
return TRUE;
}
#define DEV_ADD 0xA0
//读字节
unsigned char I2cRead(unsigned char adr,unsigned char len,unsigned char *pr)
{
uchar result;
uchar CheckSum;
uchar dev,i;
result=TRUE;
IIC0_Stop();
Delay5Us();
dev=DEV_ADD;
if(Check_IIC_BUSY()==MD_ERROR) return(FALSE);
dev&=0xFE;
IIC0 = dev; /* send address */
result=IIC0_CheckAck();
IIC0 = adr>>8;
result=IIC0_CheckAck();
IIC0 = adr&0xff;
result=IIC0_CheckAck();
STT0 = 1;
dev|=0x01;
IIC0 = dev;
result=IIC0_CheckAck();
//ACKE0 = 1;
for(i=0;i<len;i++)
{
WREL0 = 1;
result=IIC0_CheckAck();
*(pr++)=IIC0;
result=IIC0_CheckAck();
//while( !((IICS0 | 0xF7) == 0xF7));
}
ACKE0 = 0;
WREL0 = 1;
WTIM0=1;
IIC0_Stop();
return result;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|