请帮忙看看EEPROM 问题:写入数据和读出数据不同
书上的原程序,但是读出的结果只有第1,3个数据是正确的,第2,4个数据错误。两天了找不到错误在那里。是不是sda,scl 电平的问题?原程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar usigned char
#define uint unsigned int
#define AddWr 0xa0
#define AddRd 0xa1
void Start(void)
{
Sda=1;
Scl=1;
SomeNOP();
Sda=0;
SomeNOP();
Scl=0;
}
void Stop(void)
{
Sda=0;
Scl=1;
SomeNOP();
Sda=1;
SomeNOP();
}
void mDelay(uchar j)
{
uint i;
for(;j>0;j--)
{
for(i=0;i<125;i--)
{; }
}
}
void Ack(void)
{
Sda=0;
SomeNOP();
Scl=1;
SomeNOP();
Scl=0;
}
void NoAck(void)
{
Sda=1;
SomeNOP();
Scl=1;
SomeNOP();
Scl=0;
}
void Send(uchar Data)
{
uchar BitCounter=8;
uchar temp;
do
{
temp=Data;
Scl=0;
SomeNOP();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}while(BitCounter);
Scl=0;
}
uchar Read(void)
{
uchar temp=0;
uchar temp1=0;
uchar BitCounter=8;
Sda=1;
do{
Scl=0;
SomeNOP();
Scl=1;
SomeNOP();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
} while(BitCounter);
return(temp);
}
void WrToROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Send(*(PData+i));
Ack();
Stop();
mDelay(20);
}
}
void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Start();
Send(0xa1);
Ack();
*(PData+i)=Read();
Scl=0;
NoAck();
Stop();
}
}
main()
{
uchar i,key;
uchar Number[4]={1,2,3,4};
WrToROM(Number,0x05,4);
mDelay(20);
Number[0]=0;
Number[1]=0;
Number[2]=0;
Number[3]=0;
RdFromROM(Number,0x05,4);
DelayUs(500);
}