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