U¿ytkownik "Pszemol" napisa³ w wiadomo¶ci grup dyskusyjnych:o7f8jr$e99$ snipped-for-privacy@dont-email.me... //check toggle bit2 indicating erase operation pending while(Status1 = *pStatus, Status2 = *pStatus, (Status1 ^ Status2) & (1 <<
2))
Tez mi sie ten kod nie podoba, ale patrze, patrze ... i bledu nie widze :-) Program sprawdzony z 1 koscia ? Pierwsze co mi sie nie podoba ... czytam status1, pamiec konczy czysczenie, do status2 czytam juz dane. Ale nieszczescia nie bedzie ... jak bit niezgodny, to przeczytamy jeszcze raz, a ewentualny blad bierzemy z bitow status1. Jak zgodny, to jak rozumiem pamiec zakonczyla kasowanie poprawnie ?
{ if(Status1 & (1 << 5)) // check error bit on one chip { LEDFRed(); return 0;
A te bledy sie zgadzaja ? Co wtedy robisz ? Bo tu mi jedna mozliwosc sie rysuje - pierwsza kostka zglasza blad, robimy return ... a druga sie ciagle kasuje. Jesli teraz zacznies jakies resety robic, to kto wie, jak to sie dla drugiej skonczy.
} } while(Status1 = *pStatus, Status2 = *pStatus, (Status1 ^ Status2) & (1 << (16+2)))
To mi sie nie podoba - bo najpierw sprawdzalismy pierwsza koste, a druga lezala odlogiem. Ale jesli w tym czasie druga sie skonczyla ... to program pojdzie dalej, jak nie skonczyla, to poczeka, jak zglasza blad ... dlugo to wachlowanie bitem wtedy trwa ? Czy nie ma sytuacji takiej, ze druga kosc ma blad, a Ty ciagle w pierwszej petli sprawdzasz pierwsza. Pierwsza sie skasuje, a drugiej juz sie znudzi wachlowanie..
{ if(Status1 & (1 << (16+5))) // check error bit on second chip { LEDFRed(); return 0; } }
No i ... przerwania wylaczyles ? Bo jesli jakis odczyt sie zapl±ta miedzy odczyt status1 i 2, to zakonczysz czekanie przed czasem
// Check the erase if(*pSector != 0xffffffff) { LEDFRed(); return 0;
Moze sprawdzic caly blok, a nie tylko poczatek ? Predkosciowo pamiec wyrabia ? moze trzeba troche opoznien dodac ?
} else return 1; }
// returns 1 if success int STFlashWrite32(unsigned int Address, unsigned char *pSource, unsigned int Size)
A problem jest w kasowaniu czy w zapisie ?
{ int Timeout; U32 Status1, Status2; volatile U32 *pDest = (volatile U32 *)Address; U32 *pData = (U32 *)pSource;
// EMCSC bit in System Controls and Status register is cleared in Flash_Init(). // It controls how addresses are output on the EMC address pins. // For 32 bit bus the address is shifted so A2 is on A0 pin. U32 *pA1 = (U32 *)(EXTERNAL_FLASH_LOCATION + (0x555 << 2)); //555
16bit mode U32
*pA2 = (U32 *)(EXTERNAL_FLASH_LOCATION + (0x2AA << 2)); //2AA
16bit mode
moze jakis volatile by sie przydal - bo jak kompilator wykryje, ze stale pod jeden adres zapisuje to samo, to moze zoptymalizowac.
Cache jakiegos ten procesor nie ma ? Te zapisy wychodza do pamieci ?
J.