Problem z AT45DB161 Atmela

Aug 29, 2005 8 Replies

Witam,



Używam w projekcie pamięci Flash AT45DB161 podłączonej do mikrokontrolera ATMega8L. Problem polega na tym, że funkcja zapisująca bufor do pamięci robi to nie do jednej strony ale do 4 kolejnych. Np. chcę zapisać dane do strony 4, zapisywane są tymi samymi danymi strony od 4 do 7. Czy ktoś ma jakiś pomysł? Używam zmodyfikowanych funkcji z AVR Butterfly.



funkcja zapisująca do bufora



void Buffer_Write_Byte (unsigned char BufferNo, unsigned int IntPageAdr, unsigned char Data) { DF_CS_inactive; //make sure to toggle CS signal in order DF_CS_active; //to reset dataflash command decoder



if (1 == BufferNo) //write byte to buffer 1 { DF_SPI_RW(Buf1Write); //buffer 1 write op-code DF_SPI_RW(0x00); //don't cares DF_SPI_RW((unsigned char)(IntPageAdr>>8));//upper part of internal buffer address DF_SPI_RW((unsigned char)(IntPageAdr)); //lower part of internal buffer address DF_SPI_RW(Data); //write data byte }


else if (2 == BufferNo) //write byte to buffer 2 { DF_SPI_RW(Buf2Write); //buffer 2 write op-code DF_SPI_RW(0x00); //don't cares DF_SPI_RW((unsigned char)(IntPageAdr>>8));//upper part of internal buffer address DF_SPI_RW((unsigned char)(IntPageAdr)); //lower part of internal buffer address DF_SPI_RW(Data); //write data byte } IntBufAdr++;



}

funkcja zapisujaca bufor do pamieci :



void Buffer_To_Page (unsigned char BufferNo, unsigned int PageAdr) { DF_CS_inactive; //make sure to toggle CS signal in order DF_CS_active; //to reset dataflash command decoder if (1 == BufferNo) //program flash page from buffer 1 { DF_SPI_RW(Buf1ToFlashWE); //buffer 1 to flash with erase op-code DF_SPI_RW((unsigned char)(PageAdr >> (16 - PageBits))); //upper part of page address DF_SPI_RW((unsigned char)(PageAdr << (PageBits - 8))); //lower part of page address DF_SPI_RW(0x00); //don't cares }


else if (2 == BufferNo) //program flash page from buffer 2 { DF_SPI_RW(Buf2ToFlashWE); //buffer 2 to flash with erase op-code DF_SPI_RW((unsigned char)(PageAdr >> (16 - PageBits))); //upper part of page address DF_SPI_RW((unsigned char)(PageAdr << (PageBits - 8))); //lower part of page address DF_SPI_RW(0x00); //don't cares } //#endif DF_CS_inactive; //initiate flash page programming DF_CS_active; //while(!(Read_DF_status() & 0x80)); //monitor the status register, wait until busy-flag is high -- tego nie moge uzyc - nie czyta tego statusu }



funkcja zapisujaca dane:



void pisz () { int y; int imp3=0;



for (y=0; y<528; y++) { RTC_get_time();



Buffer_Write_Byte(1,y,hours1); //zapis godziny my_function(); y++; Buffer_Write_Byte(1,y,min1); //zapis minut my_function(); y++; Buffer_Write_Byte(1,y,sec1); //zapis sekund my_function(); y++; Buffer_Write_Byte(1,y,year); //zapis roku my_function(); y++; Buffer_Write_Byte(1,y,month); //zapis miesiaca my_function(); y++; Buffer_Write_Byte(1,y,day); //zapis dnia my_function(); y++; imp3++; Buffer_Write_Byte(1,y,(imp3)&0x000000ff); //impulsy LSB my_function(); y++; Buffer_Write_Byte(1,y,(imp3>>8)&0x000000ff); my_function(); y++; Buffer_Write_Byte(1,y,(imp3>>16)&0x000000ff); my_function(); y++; Buffer_Write_Byte(1,y,(imp3>>24)&0x000000ff); //impulsy MSB my_function(); y++; kierunek_wiatru(); Buffer_Write_Byte(1,y,((kierunek>>1)&0x0f)); my_function(); }



Buffer_To_Page(1,8); my_function(); }


pozdrawiam, Krzysztof


Od razu uprzedzam, że nie zagłębiałem się specjalnie w podany kod. Tak na logikę jednak, trudno zapisać jednocześnie do 4 stron. Stawiałbym raczej na błędne adresowanie podczas odczytu. Pzdr

Dzięki za szybką odpowiedz. Problem w tym, że nie widzę błędu przy czytaniu.

żądanie przeczytania wysyłam po RS-ie tak kastując po stronie nadawczej: sendbuf[3] = ((PageAdr)&0x00ff); //Adres strony w pamieci (0-4096) (LSB) sendbuf[4] = ((PageAdr>>8)&0x00ff); //Adres strony w pamieci (0-4096) (MSB)

a tak składam po stronie odbiorczej i z tymi adresami czytam pamięć:

P_Adr=(unsigned int)((recbuf[4]<<8)&0xff00)|((recbuf[3])&0x00ff);

moze tu jakis błąd?? Any idea? :)

Pozdr.

To jeszcze wszystkiego nie wyjaśnia. Proponuje zwrócić uwagę na to jak dokładnie jest wysyłany adres strony. W tych dwóch bajtach, wysyłanych do pamięci, które maja zawierać adres strony nie ma wyrównania ani do lewej ani do prawej. Dwa najstarsze i dwa najmłodsze bity są nieznaczące. Pzdr

Pytanie pomocnicze PageBits jak jest zdefiniowane? Pzdr

[...]

Widzę tu bardzo dziwne majtanie chip selectem. Powinno być tak, że aktywujesz chip select, gadasz z pamięcią a potem deaktywujesz. Gotowość możesz sprawdzić sprzętowo na pinie RDY/BUSY jeżeli nie chcesz odczytywać statusu.

Wystawienie aktywnego chip selecta tuż po rozpoczęciu programowania (czyli po wysłaniu rozkazu i zdjęciu chip selecta) jest bardzo dziwnym rozwiązaniem - nie wiem, po co.

Z tym, że o ile pamietam nie we wszystkich obudowach jest ten sygnał dostępny Pzdr

Nie ma chyba tylko w maluszkach 8-pinowych (nie dotyczy AT45DB161B) ale dla pewnosci trzeba by sprawdzic w dokumentacji konkretnej kostki. Podczas operacji na pamieci Flash czyli m.in. kasowania i programowania moga byc wykonywane komendy odczytu statusu i pracujace na drugim buforze RAM (nie tym, ktory jest np. przepisywany do Flasha).

W artykule <df2fgr$pve$ snipped-for-privacy@atlantis.news.tpi.pl> autorem którego mieni się Adam Dybkowski, napisano:

AFAIR we wszystkich standardowych jest. Wyjątek stanowi obudowa a'la MMC.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required