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