KAmod SPI Flash (PL)
From Kamamilabs.com - Wiki

Opis
KAmod SPI Flash - Moduł z nieulotną pamięcią typu Flash z interfejsem SPI
Moduł KAmod SPI Flash zawiera pamięć Flash z interfejsem SPI. Wszystkie sygnały sterujące zostały wyprowadzone jako punkty lutownicze z otworami, rozmieszczone ze standardowym rastrem 2,54 mm, tuż przy krawędzi płytki oraz w sposób odpowiadający obudowie do montażu przewlekanego DIL8. Moduł dostępny jest z pamięciami o pojemności 1 MB (8Mb) lub 16 MB (128 Mb).

Podstawowe cechy i parametry
- Pamięć nieulotna Flash o pojemności 1 MB (W25Q80) lub 16 MB (W25Q128)
- Interfejs SPI o taktowaniu do 50 MHz (praca przy wyższej częstotliwości jest możliwa, ale zależy od jakości/długości połączeń sygnałów interfejsu SPI)
- Zawartość pamięci można zabezpieczyć przed skasowaniem montując zworkę „Write protect”
- Sygnały sterujące wyprowadzone jako punkty lutownicze z otworami, rozmieszczone ze standardowym rastrem 2,54 mm, tuż przy krawędzi płytki
- Sygnały sterujące dodatkowo zostały wyprowadzone jako punkty lutownicze z otworami, rozmieszczone ze standardowym rastrem 2,54 mm w sposób odpowiadający obudowie do montażu przewlekanego DIL8
- Zasilanie napięciem 2,7...3,6 V
Wyposażenie standardowe
| Kod | Opis |
|---|---|
| KAmod SPI Flash |
|

Schemat elektryczny

Sygnały sterujące
| Oznaczenie (J1) | Funkcja |
|---|---|
| CS |
|
| SCK |
|
| DI |
|
| DO |
|
| GND |
|
| V+ |
|
| WP |
|
| HOLD |
|
Komunikacja z pamięciami W25Q80/W25Q128 stosowanymi w KAmod SPI Flash jest możliwa poprzez interfejs SPI. Niektóre sygnały pełnią podwójną rolę w trybie komunikacji Dual/Quad SPI. Dokładny opis wszystkich sygnałów, sposobów komunikacji oraz procedur i komend jest zawarty w dokumentacji technicznej układów.
Interfejs SPI ukłądów pamieci typu W25Qxxx może działać z bardzo wysokim taktowaniem (sygnał na wejściu SCK) – nawet ponad 100 MHz, jednak w przypadku modułu połączonego przewodami nie zaleca się komunikacji z taktowaniem większym niż 50 MHz. W razie problemów z komunikacją należy zmniejszyć częstotliwość taktowania SPI.
Rozmieszczenie sygnałów sterujących zostało pokazane na poniższych rysunkach. Oznaczenia sygnałów znajdują się na dolnej stronie płytki (bottom), zarówno dla złącza na krawędzi płytki jak i dla obudowy DIL8.
Oznaczenie pojemności pamięci
Moduł KAmod SPI Flash dostępny jest z pamięciami o pojemności 1 MB (8Mb) lub 16 MB (128 Mb). W zależności od wersji na płytce zamontowane są układy W25Q80 (1 MB) lub W25Q128 (16 MB).
Wersja pamięci jest zaznaczona na dolnej stronie płytki (bottom) tak, jak pokazano na rysunkach.
Zabezpieczenie przed zapisem „Write protect”
| Oznaczenie (J1) | Funkcja |
|---|---|
| WP (J1) |
|
| Write protect |
|
Funkcja Write protect zabezpiecza pamięć przez skasowaniem lub zmianą jej zawartości.
Aby uaktywnić funkcję zabezpieczającą należy podać stan niski (logiczne 0) na wyprowadzenie WP. Innym sposobem jest przylutowanie kropli cyny w miejscu jumpera SMD lub przylutowanie szpilek goldpin z zamontowanym jumperem, tak jak pokazano na rysunku. Zamontowanie jumpera również wymusza stan niski na wyprowadzeniu WP.

Zasilanie
| Oznaczenie | Funkcja |
|---|---|
|
|
Moduł KAmod SPI Flash może być zasilany napięciem stałym o wartości 2,7...3,6V, dołączonym do styków V+ oraz GND na złączu J1.

Wymiary
Wymiary płytki KAmod SPI Flash to 27x18,3 mm. Na płytce znajdują się 2 otwory montażowe o średnicy 3,2 mm.

Program testowy
Program testowy został napisany w środowisku Arduino dla płytki KAmodESP32 POW RS485.
//example code for KAmod SPI Flash 1MB (W25Q80)
//ino board: ESP32-WROOM-DA Module
#include <SPI.h>
#include "Kamod_SPIFlashBase.h"
//LED
#define LED_PIN 2
#define MY_DELAY 2000
//SPI
#define SPI_MOSI 13
#define SPI_MISO 12
#define SPI_SCK 14
#define SPI_CS 15
#define SPI_CLOCK 10000000
//INIT
SPIClass spiFlashBus(HSPI);
Kamod_SPIFlashBase spiFlashBase(&spiFlashBus, SPI_CS, SPI_SCK, SPI_MOSI, SPI_MISO);
Kamod_SPIFlash_Device_t MY_W25Q80DV;
uint8_t *data_buff;
int ledi;
int loops;
bool retstat;
bool verify;
int result;
//-------------------------------------------
void setup() {
Serial.begin(115200);
while (!Serial) {}
delay(1000); // wait for native usb
Serial.println();
Serial.println();
Serial.println();
Serial.println("Hello. KAmod SPI Flash test start");
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
ledi = 0;
retstat = false;
while(retstat == false){
spiFlashBus.begin(SPI_SCK, SPI_MISO, SPI_MOSI, SPI_CS);
spiFlashBase.setClockSpeed(SPI_CLOCK, SPI_CLOCK);
retstat = spiFlashBase.begin(&MY_W25Q80DV);
if (!retstat){
Serial.println("Init fail ");
delay(1000);
} else {
Serial.print("JEDEC: ");
Serial.println(spiFlashBase.getJEDECID(), HEX);
}
}
Serial.println("Flash init...OK");
Serial.println("--- First, erase sector ---");
spiFlashBase.eraseSector(0);
delay(500);
loops = 0;
result = 0;
Serial.println();
}
//-------------------------------------------
void loop() {
Serial.print("### START at page: ");
Serial.print(loops);
Serial.println(" ###");
Serial.println("--- Clear buff ---");
data_buff = spiFlashBase.buff();
for(int n = 0; n<KAMOD_SFLASH80_PAGE_SIZE; n++){
*data_buff = 0;
data_buff++;
}
Serial.println("--- Read mem ---");
spiFlashBase.readPageBuff(loops * KAMOD_SFLASH80_PAGE_SIZE);
data_buff = spiFlashBase.buff();
for(int n = 0; n<20; n++){
Serial.print(*data_buff);
Serial.print(",");
data_buff++;
}
Serial.println("");
Serial.println("--- Prepare new buff ---");
data_buff = spiFlashBase.buff();
for(int n = 0; n<20; n++){
*data_buff = (uint8_t)(n + (loops*10));
Serial.print(*data_buff);
Serial.print(",");
data_buff++;
}
Serial.println("");
Serial.println("--- Write mem ---");
//spiFlashBase.eraseSector(0);
spiFlashBase.writePageBuff(loops * KAMOD_SFLASH80_PAGE_SIZE);
Serial.println("--- Clear buff ---");
data_buff = spiFlashBase.buff();
for(int n = 0; n<KAMOD_SFLASH80_PAGE_SIZE; n++){
*data_buff = 0;
data_buff++;
}
Serial.println("--- Read mem for check content ---");
spiFlashBase.readPageBuff(loops * KAMOD_SFLASH80_PAGE_SIZE);
data_buff = spiFlashBase.buff();
for(int n = 0; n<20; n++){
Serial.print(*data_buff);
Serial.print(",");
data_buff++;
}
Serial.println("");
Serial.print("### Verify ");
verify = true;
data_buff = spiFlashBase.buff();
for(int n = 0; n<20; n++){
if (*data_buff != (uint8_t)(n + (loops*10))) verify = false;
data_buff++;
}
if (verify) {
result++;
Serial.println("OK ###");
}
else Serial.println("FAIL !!! ###");
ledi++;
digitalWrite(LED_PIN, (ledi&1));
Serial.println();
Serial.println();
Serial.println();
delay(500);
loops++;
if (loops >= 3) {
if (result == 3) Serial.println("### Verify OK 3 times ###");
else Serial.println("!!! Some things are wrong, some verifications fail !!!!");
Serial.println("### THATS ALL ###");
while(1){};
}
}