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