📄 at24cxx.c
字号:
//********************************************************************************
#include "../SubProgram/SubprogramList.h"
/***************************************************************************/
void AT24cxxDelay(void)
{
U8 dly;
dly=50;//25
while(dly--);
}
/***************************************************************************/
void SetSDA(bit c)
{
if(FlagEEPROM==EEPROM1)
SDA1=c;
else if(FlagEEPROM==EEPROM2)
SDA2=c;
else if(FlagEEPROM==EEPROM3)
SDA3=c;
else if(FlagEEPROM==EEPROM4)
SDA4=c;
else if(FlagEEPROM==EEPROM5)
SDA5=c;
else if(FlagEEPROM==EEPROM6)
SDA6=c;
else if(FlagEEPROM==EEPROM7)
SDA7=c;
AT24cxxDelay();
}
/***************************************************************************/
void SetSCL(bit c)
{
if(FlagEEPROM==EEPROM1)
SCL1=c;
else if(FlagEEPROM==EEPROM2)
SCL2=c;
else if(FlagEEPROM==EEPROM3)
SCL3=c;
else if(FlagEEPROM==EEPROM4)
SCL4=c;
else if(FlagEEPROM==EEPROM5)
SCL5=c;
else if(FlagEEPROM==EEPROM6)
SCL6=c;
else if(FlagEEPROM==EEPROM7)
SCL7=c;
AT24cxxDelay();
}
/***************************************************************************/
bit ReadSDA(void)
{
bit c;
if(FlagEEPROM==EEPROM1)
c=SDA1;
else if(FlagEEPROM==EEPROM2)
c=SDA2;
else if(FlagEEPROM==EEPROM3)
c=SDA3;
else if(FlagEEPROM==EEPROM4)
c=SDA4;
else if(FlagEEPROM==EEPROM5)
c=SDA5;
else if(FlagEEPROM==EEPROM6)
c=SDA6;
else if(FlagEEPROM==EEPROM7)
c=SDA7;
return(c);
}
/***************************************************************************/
void Start(void)
{
SetSDA(1);
SetSCL(1);
SetSDA(0);
SetSCL(0);
}
/***************************************************************************/
void Stop(void)
{
SetSCL(0);
SetSDA(0);
SetSCL(1);
SetSDA(1);
}
/***************************************************************************/
void Ack(void)
{
SetSDA(0);
SetSCL(1);
SetSCL(0);
SetSDA(1);
}
/***************************************************************************/
void NoAck(void)
{
SetSDA(1);
SetSCL(1);
SetSCL(0);
}
/***************************************************************************/
void TestAck(void)
{
U16 wait=0;
SetSDA(1);
SetSCL(1);
while(ReadSDA()!=0)
{
wait++;
if(wait>3000)
break;
}
SetSCL(0);
if(wait>3000)
FlagACK=0; //NCK
else
FlagACK=1; //ACK
}
//***************************************************************************/
void Write8Bit(U8 cdata)
{
U8 temp;
for(temp=8;temp!=0;temp--)
{
if(cdata & 0x80)
SetSDA(1);
else
SetSDA(0);
SetSCL(1);
SetSCL(0);
cdata=cdata<<1;
}
}
//***************************************************************************/
void Write24cxx(U8 bank,U8 *RamAddress,U8 RomAddress,U8 number)
{
Start();
Write8Bit(bank);
TestAck();
if(FlagACK==0)
FlagError=1;
Write8Bit(RomAddress);
TestAck();
if(FlagACK==0)
FlagError=1;
for(;number!=0;number--)
{
Write8Bit(*RamAddress);
TestAck();
RamAddress++;
}
Stop();
Delay(T1ms*2);
}
/***************************************************************************/
U8 Read8Bit(void)
{
U8 temp,rbyte=0;
for(temp=8;temp!=0;temp--)
{
SetSCL(1);
rbyte=rbyte<<1;
if(ReadSDA())
rbyte=rbyte+1;
SetSCL(0);
}
return(rbyte);
}
/***************************************************************************/
void Read24cxx(U8 bank,U8 *RamAddress,U8 RomAddress,U8 bytes)
{
Start();
Write8Bit(bank);
TestAck();
if(FlagACK==0)
FlagError=1;
Write8Bit(RomAddress);
TestAck();
if(FlagACK==0)
FlagError=1;
Start();
Write8Bit(bank+1);
TestAck();
if(FlagACK==0)
FlagError=1;
while(bytes!=1)
{
*RamAddress=Read8Bit();
Ack();
RamAddress++;
bytes--;
}
*RamAddress=Read8Bit();
NoAck();
Stop();
Delay(T1ms*2);
}
//****************************************************************************************************
// Start Program Port
//****************************************************************************************************
void StartProgram(void)
{
U16 LengthA,DataLength;
U16 Len=0;
U16 PageLen=0;
U8 i,Bank;
U8 *ptr;
FlagError=0;
//-------------------------------------------------------------------------------------
//disply
if(FlagPort1ProgramEn==1)
{
SetPortLed(PORT1,LED_Busy);
DisplayStringData(1,SystemPort1Program,sizeof(SystemPort1Program));
}
else if(FlagPort2ProgramEn==1)
{
SetPortLed(PORT2,LED_Busy);
DisplayStringData(1,SystemPort2Program,sizeof(SystemPort2Program));
}
else if(FlagPort3ProgramEn==1)
{
SetPortLed(PORT3,LED_Busy);
DisplayStringData(1,SystemPort3Program,sizeof(SystemPort3Program));
}
Delay(T1s);
//-------------------------------------------------------------------------------------
//read sample code
if(FlagSelfStudy==1)
{
if(FlagPort1ProgramEn==1)
{
if(FlagSelfStudy==0)
FlagEEPROM=EEPROM1;
else
FlagEEPROM=EEPROM2;
if(FlagPort1EEPROMType==AT24C01)
MaxProgramDataLenngth=128;
else if(FlagPort1EEPROMType==AT24C02)
MaxProgramDataLenngth=256;
else if(FlagPort1EEPROMType==AT24C04)
MaxProgramDataLenngth=512;
else if(FlagPort1EEPROMType==AT24C08)
MaxProgramDataLenngth=1024;
else if(FlagPort1EEPROMType==AT24C16)
MaxProgramDataLenngth=2048;
ptr=Port1SampleCode;
}
else if(FlagPort2ProgramEn==1)
{
if(FlagSelfStudy==0)
FlagEEPROM=EEPROM3;
else
FlagEEPROM=EEPROM4;
if(FlagPort2EEPROMType==AT24C01)
MaxProgramDataLenngth=128;
else if(FlagPort2EEPROMType==AT24C02)
MaxProgramDataLenngth=256;
else if(FlagPort2EEPROMType==AT24C04)
MaxProgramDataLenngth=512;
else if(FlagPort2EEPROMType==AT24C08)
MaxProgramDataLenngth=1024;
else if(FlagPort2EEPROMType==AT24C16)
MaxProgramDataLenngth=2048;
ptr=Port2SampleCode;
}
else if(FlagPort3ProgramEn==1)
{
if(FlagSelfStudy==0)
FlagEEPROM=EEPROM5;
else
FlagEEPROM=EEPROM6;
if(FlagPort3EEPROMType==AT24C01)
MaxProgramDataLenngth=128;
else if(FlagPort3EEPROMType==AT24C02)
MaxProgramDataLenngth=256;
else if(FlagPort3EEPROMType==AT24C04)
MaxProgramDataLenngth=512;
else if(FlagPort3EEPROMType==AT24C08)
MaxProgramDataLenngth=1024;
else if(FlagPort3EEPROMType==AT24C16)
MaxProgramDataLenngth=2048;
ptr=Port3SampleCode;
}
DataLength=MaxProgramDataLenngth;
Bank=BANK0;
while(MaxProgramDataLenngth!=0)
{
if(MaxProgramDataLenngth>256)
{
PageLen=256;
MaxProgramDataLenngth=MaxProgramDataLenngth-256;
}
else
{
PageLen=MaxProgramDataLenngth;
MaxProgramDataLenngth=MaxProgramDataLenngth-PageLen;
}
LengthA=0;
Len=0;
while(LengthA<PageLen)
{
Read24cxx(Bank,EmpBuffer,Len,8);
if(FlagError!=0)
break;
for(i=0;i<8;i++)
{
*ptr=EmpBuffer[i];
LengthA++;
ptr++;
}
Len=Len+8;
}
if(FlagError!=0)
break;
Bank=Bank+0x02;
}
if(FlagError!=0)
{
if(FlagPort1ProgramEn==1)
DisplayStringData(1,SystemPort1ProgramNG,sizeof(SystemPort1ProgramNG));
else if(FlagPort2ProgramEn==1)
DisplayStringData(1,SystemPort2ProgramNG,sizeof(SystemPort2ProgramNG));
else if(FlagPort3ProgramEn==1)
DisplayStringData(1,SystemPort3ProgramNG,sizeof(SystemPort3ProgramNG));
Delay(T1s);
return;
}
}
//-----------------------------------------------------------------------------------------------
//program used sample code
if(FlagPort1ProgramEn==1)
{
if(FlagSelfStudy==0)
FlagEEPROM=EEPROM2;
else
FlagEEPROM=EEPROM1;
if(FlagPort1EEPROMType==AT24C01)
MaxProgramDataLenngth=128;
else if(FlagPort1EEPROMType==AT24C02)
MaxProgramDataLenngth=256;
else if(FlagPort1EEPROMType==AT24C04)
MaxProgramDataLenngth=512;
else if(FlagPort1EEPROMType==AT24C08)
MaxProgramDataLenngth=1024;
else if(FlagPort1EEPROMType==AT24C16)
MaxProgramDataLenngth=2048;
ptr=Port1SampleCode;
}
else if(FlagPort2ProgramEn==1)
{
if(FlagSelfStudy==0)
FlagEEPROM=EEPROM4;
else
FlagEEPROM=EEPROM3;
if(FlagPort2EEPROMType==AT24C01)
MaxProgramDataLenngth=128;
else if(FlagPort2EEPROMType==AT24C02)
MaxProgramDataLenngth=256;
else if(FlagPort2EEPROMType==AT24C04)
MaxProgramDataLenngth=512;
else if(FlagPort2EEPROMType==AT24C08)
MaxProgramDataLenngth=1024;
else if(FlagPort2EEPROMType==AT24C16)
MaxProgramDataLenngth=2048;
ptr=Port2SampleCode;
}
else if(FlagPort3ProgramEn==1)
{
if(FlagSelfStudy==0)
FlagEEPROM=EEPROM6;
else
FlagEEPROM=EEPROM5;
if(FlagPort3EEPROMType==AT24C01)
MaxProgramDataLenngth=128;
else if(FlagPort3EEPROMType==AT24C02)
MaxProgramDataLenngth=256;
else if(FlagPort3EEPROMType==AT24C04)
MaxProgramDataLenngth=512;
else if(FlagPort3EEPROMType==AT24C08)
MaxProgramDataLenngth=1024;
else if(FlagPort3EEPROMType==AT24C16)
MaxProgramDataLenngth=2048;
ptr=Port3SampleCode;
}
//-----------------------------------------------
DataLength=MaxProgramDataLenngth;
Bank=BANK0;
while(MaxProgramDataLenngth!=0)
{
if(MaxProgramDataLenngth>256)
{
PageLen=256;
MaxProgramDataLenngth=MaxProgramDataLenngth-256;
}
else
{
PageLen=MaxProgramDataLenngth;
MaxProgramDataLenngth=MaxProgramDataLenngth-PageLen;
}
LengthA=0;
Len=0;
while(LengthA<PageLen)
{
for(i=0;i<8;i++)
{
EmpBuffer[i]=*ptr;
LengthA++;
ptr++;
}
Write24cxx(Bank,EmpBuffer,Len,8);
if(FlagError!=0)
break;
Len=Len+8;
}
if(FlagError!=0)
break;
Bank=Bank+0x02;
}
if(FlagError!=0)
{
if(FlagPort1ProgramEn==1)
DisplayStringData(1,SystemPort1ProgramNG,sizeof(SystemPort1ProgramNG));
else if(FlagPort2ProgramEn==1)
DisplayStringData(1,SystemPort2ProgramNG,sizeof(SystemPort2ProgramNG));
else if(FlagPort3ProgramEn==1)
DisplayStringData(1,SystemPort3ProgramNG,sizeof(SystemPort3ProgramNG));
Delay(T1s);
return;
}
//-----------------------------------------------------------------------------------------------
//READ ALL CODE AND DOUBLE CHECK
if(FlagPort1ProgramEn==1)
{
DisplayStringData(1,SystemPort1ProgramOK,sizeof(SystemPort1ProgramOK));
Delay(T10ms*50);
DisplayStringData(1,SystemPort1Verify,sizeof(SystemPort1Verify));
}
else if(FlagPort2ProgramEn==1)
{
DisplayStringData(1,SystemPort2ProgramOK,sizeof(SystemPort2ProgramOK));
Delay(T10ms*50);
DisplayStringData(1,SystemPort2Verify,sizeof(SystemPort2Verify));
}
else if(FlagPort3ProgramEn==1)
{
DisplayStringData(1,SystemPort3ProgramOK,sizeof(SystemPort3ProgramOK));
Delay(T10ms*50);
DisplayStringData(1,SystemPort3Verify,sizeof(SystemPort3Verify));
}
Delay(T1s);
//verify program code
MaxProgramDataLenngth=DataLength;
Bank=BANK0;
ptr=CheckCodeBuffer;
while(MaxProgramDataLenngth!=0)
{
if(MaxProgramDataLenngth>256)
{
PageLen=256;
MaxProgramDataLenngth=MaxProgramDataLenngth-256;
}
else
{
PageLen=MaxProgramDataLenngth;
MaxProgramDataLenngth=MaxProgramDataLenngth-PageLen;
}
LengthA=0;
Len=0;
while(LengthA<PageLen)
{
Read24cxx(Bank,EmpBuffer,Len,8);
if(FlagError!=0)
break;
for(i=0;i<8;i++)
{
*ptr=EmpBuffer[i];
LengthA++;
ptr++;
}
Len=Len+8;
}
if(FlagError!=0)
break;
Bank=Bank+0x02;
}
if(FlagError==0)
{
LengthA=0;
if(FlagPort1ProgramEn==1)
ptr=Port1SampleCode;
else if(FlagPort2ProgramEn==1)
ptr=Port2SampleCode;
else if(FlagPort3ProgramEn==1)
ptr=Port3SampleCode;
while(LengthA<DataLength)
{
if(CheckCodeBuffer[LengthA]!=*ptr)
{
FlagError=1;
break;
}
LengthA++;
ptr++;
}
}
if(FlagError!=0)
{
FlagError=1;
if(FlagPort1ProgramEn==1)
DisplayStringData(1,SystemPort1VerifyNG,sizeof(SystemPort1VerifyNG));
else if(FlagPort2ProgramEn==1)
DisplayStringData(1,SystemPort2VerifyNG,sizeof(SystemPort2VerifyNG));
else if(FlagPort3ProgramEn==1)
DisplayStringData(1,SystemPort3VerifyNG,sizeof(SystemPort3VerifyNG));
Delay(T1s);
}
else
{
if(FlagPort1ProgramEn==1)
{
DisplayStringData(1,SystemPort1VerifyOK,sizeof(SystemPort1VerifyOK));
SetPortLed(PORT1,LED_Ready);
}
else if(FlagPort2ProgramEn==1)
{
DisplayStringData(1,SystemPort2VerifyOK,sizeof(SystemPort2VerifyOK));
SetPortLed(PORT2,LED_Ready);
}
else if(FlagPort3ProgramEn==1)
{
DisplayStringData(1,SystemPort3VerifyOK,sizeof(SystemPort3VerifyOK));
SetPortLed(PORT3,LED_Ready);
}
Delay(T1s);
}
}
//****************************************************************************************************
// save sample code
//****************************************************************************************************
void StartSave(void)
{
U16 LengthA;
U16 Len=0;
U16 PageLen=0;
U8 i,Bank;
U8 *ptr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -