Problem z AT45DB161 Atmela

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

Reply to
klukas
Loading thread data ...

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

Reply to
mokule

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.

Reply to
klukas

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

Reply to
mokule

Pytanie pomocnicze PageBits jak jest zdefiniowane? Pzdr

Reply to
mokule

[...]

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.

Reply to
Adam Dybkowski

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

Reply to
mokule

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).

Reply to
Adam Dybkowski

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.

Reply to
JS

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.