Zapis do FLASH u procesoru DS89C430
Jan Waclawek
konfera@efton.sk
Středa Červenec 23 15:13:56 CEST 2008
S tymto kuskom nemam konkretne skusenosti ale vo vseobecnosti su castym problemom nevhodne nastavene lockbity.
Tiez si overte, ci viete precitat dany byte, jeho "normalnym" naprogramovanim ISP alebo v paralelnom programatori. Potom si overte, ci viete naozaj vymazat. Krok po kroku...
wek
----- Original Message ---------------
Subject: Zapis do FLASH u procesoru DS89C430
From: <tomas.martinec@centrum.cz>
Date: Wed, 23 Jul 2008 14:59:59 +0200
To: "hw-list" <hw-list@list.hw.cz>
>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
>
>_______________________________________________
>HW-list mailing list - sponsored by www.HW.cz
>Hw-list@list.hw.cz
>http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list