本帖最后由 xichandoujigu 于 2018-4-9 10:49 编辑
我写了0XC0到AT24C04然后读出来到P3口用LED显示,但结果不对(我想读出0Xc0,结果读出来的是0XFE),从I2C debug也没看出问题,有其他方法看0XC0到底有没有写进24C04呢?
电路图:
I2C debug结果
源代码
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define NOP4() {_nop_();_nop_();_nop_();_nop_();}
sbit SDA=P1^0;
sbit SCL=P1^1;
uchar ACK;
void I2C_init()
{SDA=1;NOP4();SCL=1;NOP4();}
void I2C_start()
{SDA=1;NOP4();SCL=1;NOP4();SDA=0; NOP4();SCL=0; }
void I2C_stop()
{ SCL=0;SDA=0; NOP4() ;SCL=1; NOP4() ; SDA=1; NOP4() ; }
void I2C_write(uchar tmp)
{
int i;
for(i=0;i<8;i++)
{
tmp=tmp<<1;
SCL=0;
_nop_();
SDA=CY;
_nop_();
SCL=1;
NOP4();
}
SCL=0;
}
void I2C_ACK()
{
int i;
SCL=0;
NOP4();
SDA=1;
NOP4();
i=0;
while((SDA==1)&&(i++<250));
if(SDA==0)
ACK=1;
NOP4();
SCL=1;
NOP4();
}
uchar read_byte()
{
uchar i,dat = 0x00; SDA = 1;
for(i = 0; i < 8; i++)
{
SCL = 1; NOP4() ;
dat = (dat << 1) | SDA; NOP4() ;
SCL = 0; NOP4() ;
}
return dat;
}
void write_add(uchar address,uchar date)
{
I2C_start();
I2C_write(0xa0);
I2C_ACK();
I2C_write(address);
I2C_ACK();
I2C_write(date);
I2C_ACK();
I2C_stop();
}
uchar read_add(uchar address)
{
uchar tmp;
I2C_start();
I2C_write(0xa0);
I2C_ACK();
I2C_write(address);
I2C_ACK();
I2C_start();
I2C_write(0xa1);
I2C_ACK();
tmp=read_byte();
I2C_stop();
return(tmp);
}
void delay(uchar i)
{
uchar a,b;
for(a=0;a<i;i++)
for(b=0;b<100;b++) ;
}
void main()
{
I2C_init();
write_add(5,0xc0);
delay(100); //guanjian
P3=read_add(5);
while(1);
}
|