Zapis do FLASH u procesoru DS89C430
tomas.martinec@centrum.cz
tomas.martinec@centrum.cz
Středa Červenec 23 14:59:59 CEST 2008
Dobry den,
chtel bych pozadat vsechny pritomne o radu pri zapisu do FLASH u procesoru DS89C430.
Pokousim se vyuzit programovou pamet tohoto procesoru pro ulozeni parametru komunikace (hlavne mi jde o moznost zmenit adresu jednotky primo po datove lince). Podle datasheetu lze zapisovat do horni banky programove pameti (coz je u tohoto procesoru hornich 8kB) pomoci SFR registru FCNTL a FDATA. Protoze mam program dlouhy jen cca 4kB, muzu si dovolit tuto cast pameti obetovat na tyto ucely.
Napsal jsem si proto prislusne funkce presne podle instrukci v datasheetu, ale ani po nekolika dnech experimentovani se mi nejak nedari to rozfungovat. Nepokousel jste se nekdo o neco podobneho?
V hlavnim programu mam pro zapis tuto sekvenci:
ClearFLASH();
NormalModeFLASH();
WriteToFLASH(8192,ADRESA);
NormalModeFLASH();
WriteToFLASH(8193,TYP);
NormalModeFLASH();
Reset();
Zde jsou prislusne funkce:
void ClearFLASH()
{
EA=0;
while((FCNTL&0x80)==0);
TA = 0xAA;
TA = 0x55;
FCNTL=0x0E;
while((FCNTL&0x80)==1);
while((FCNTL&0x80)==0);
EA=1;
}
void WriteToFLASH(unsigned int Addr, unsigned char Data)
{
unsigned char lo,hi;
lo=Addr%256;
hi=Addr/256;
EA=0;
while((FCNTL&0x80)==0);
TA = 0xAA;
TA = 0x55;
FCNTL=0x0B;
FDATA=hi;
FDATA=lo;
FDATA=Data;
while((FCNTL&0x80)==1);
while((FCNTL&0x80)==0);
EA=1;
}
void NormalModeFLASH()
{
EA=0;
while((FCNTL&0x80)==0);
TA = 0xAA;
TA = 0x55;
FCNTL=0x00;
while((FCNTL&0x80)==1);
while((FCNTL&0x80)==0);
EA=1;
}
void Reset()
{
EA=0;
while((FCNTL&0x80)==0);
TA = 0xAA;
TA = 0x55;
FCNTL=0x0F;
while((FCNTL&0x80)==1);
while((FCNTL&0x80)==0);
EA=1;
}
Vse probehne zda se v poradku, na konci se procesor vyresetuje. Kdyz se ale po resetu pokusim zapsanou adresu precist, je tam 255
ADRESA=CBYTE[8192];
Jen pro uplnost pouzivam prekladac SDCC. Predem dekuji za nakopnuti jakymkoliv smerem.
Tomas Martinec
Další informace o konferenci Hw-list