artur134,
Nigdy nie używałem pamięci DataFlash, widzę, żę Twój sterownik jest przygotowany na 2 połączone ze sobą kości. Ja mam tylko jedną, w dodatku nie wersję B tylko D, czyli AT45DB041D , czy ta różnica jest istotna?
Przeczytałem w dokumentacji, że ten mój DataFlash ma:
User Configurable Page Size
–256 Bytes per Page
–264 Bytes per Page
–Page Size Can Be Factory Pre-configured for 256 Bytes
Page Program Operation
–Intelligent Programming Operation
–2,048 Pages (256/264 Bytes/Page) Main Memory 4-megabit
Czy w takim razie ta pamięć ma standardowo wielkość strony ustawioną na 264 B? A jeśli nie to w jaki sposób to ustawić?
Interesują mnie poniższe informacje:
1> Zapisanie do pamięci 264 B danych spod "char *dana1zapis" na adres 0, następnie zapisanie danych spod "char *dana2zapis" na kolejny adres, czyli kolejną stronę po tej danej.
2> Skasowanie całej zawartości pamięci
3> Odczytanie 264 B danych i zapisanie ich do "char *dana1odczyt" a następnie sięgnięcie do kolejnych 264 B danych w pamięci i zapisanie ich do "char *dana2odczyt".
Czy ten kod jest prawidłowy:
#include "flash.c"
int main(void)
{
flash_init();
char dane1_zapis[264];
char dane2_zapis[264];
char dane1_odczyt[264];
char dane2_odczyt[264];
// zapis
// void zapisz_do_bufora(unsigned nr_strony, unsigned offset, unsigned char* blok, unsigned ilosc);
// void bufor_na_strone(unsigned nr_strony);
zapisz_do_bufora(0, 0, dane1_zapis, 264);
bufor_na_strone(0);
zapisz_do_bufora(1, 0, dane2_zapis, 264);
bufor_na_strone(1);
// odczyt
// void odczytaj_bez_bufora(unsigned nr_strony, unsigned offset, unsigned char* blok, unsigned ilosc);
odczytaj_bez_bufora(0, 0, dane1_odczyt, 264);
odczytaj_bez_bufora(1, 0, dane2_odczyt, 264);
// skasowanie całej pamięci
// void kasuj_blok(unsigned nr_bloku);
int i = 255;
while (i--) kasuj_blok(i);
return 0;
}
Jaka jest różnica funkcjonalna funkcji (w jakim przypadku warto skorzystać z bufora?):
void odczytaj_z_bufora(unsigned nr_strony, unsigned offset, unsigned char* blok, unsigned ilosc);
void odczytaj_bez_bufora(unsigned nr_strony, unsigned offset, unsigned char* blok, unsigned ilosc);
I jeszcze jedno pytanie: czy ta biblioteka spi.h bedzie dzialac gdy mam polaczony uklad w taki sposob, gdyz zauwazylem, ze niektore funkcje odnosza sie do PORTE?
Powyzsze porty pelnia te funkcje:
- PB1 (SCK)
Alternatywne funkcje:
SCK – linia zegarowa interfejsu SPI
- PB2 (MOSI)
PB2 – wejście/wyjście cyfrowe ogólnego przeznaczenia
Alternatywne funkcje:
MOSI – linia danych MOSI interfejsu SPI
- PB3 (MISO)
PB3 – wejście/wyjście cyfrowe ogólnego przeznaczenia
Alternatywne funkcje:
MISO – linia danych MISO interfejsu SPI
- PB5 (OC1A/PWM1A)
PB5 – wejście/wyjście cyfrowe ogólnego przeznaczenia
Alternatywne funkcje:
OC1A - wyjście A komparatora przy Timerze/Liczniku1 (może działać jako wyjście PWM)
Jednak czy o to, żeby te porty pełniły te "alternatywne funkcje" trzeba się dodatkowo postarać?
Niestety w tym momencie nie mam możliwości sprawdzić tego wszystkiego w praktyce, a czas na realizację projektu mnie nagli stąd moje pytania.
Za wszelką pomoc megadzięki.