KAmod SPI Flash (PL): Difference between revisions
From Kamamilabs.com - Wiki
| Line 47: | Line 47: | ||
! style="text-align: center;"|<b>Funkcja</b> | ! style="text-align: center;"|<b>Funkcja</b> | ||
|- | |- | ||
| style="text-align: center;"|<b> | | style="text-align: center;"|<b>CS</b> | ||
| style="text-align: left;"| | | style="text-align: left;"| | ||
* | *Wejście sygnału CS (Chip Select - aktywowanie interfejsu SPI) | ||
|- | |- | ||
| style="text-align: center;"|<b> | | style="text-align: center;"|<b>SCK</b> | ||
| style="text-align: left;"| | | style="text-align: left;"| | ||
* | *Wejście sygnału zegarowego/taktującego | ||
|- | |- | ||
| style="text-align: center;"|<b> | | style="text-align: center;"|<b>DI</b> | ||
| style="text-align: left;"| | | style="text-align: left;"| | ||
* | *Wejście szeregowe danych (Data In) | ||
|- | |||
| style="text-align: center;"|<b>DO</b> | |||
| style="text-align: left;"| | |||
*Wyjście szeregowe danych (Data Out) | |||
|- | |||
| style="text-align: center;"|<b>GND</b> | |||
| style="text-align: left;"| | |||
*Zasilanie – biegun ujemny (masa/GND) | |||
|- | |||
| style="text-align: center;"|<b>V+</b> | |||
| style="text-align: left;"| | |||
*Zasilanie – biegun dodatni, napięcie 2,7...3,6 V | |||
|- | |||
| style="text-align: center;"|<b>WP</b> | |||
| style="text-align: left;"| | |||
*Wejście blokady zapisu (Write Protect) aktywne w stanie niskim, połączone ze zworką Write protect | |||
|- | |||
| style="text-align: center;"|<b>HOLD</b> | |||
| style="text-align: left;"| | |||
*Wejście sygnału zatrzymania komunikacji | |||
|- | |- | ||
|} | |} | ||
</center> | </center> | ||
<br> | <br> | ||
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. | |||
<br><br> | <br><br> | ||
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. | |||
<br><br> | <br><br> | ||
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. | |||
<br><br> | |||
<center> | <center> | ||
[[File: | [[File:KAmod_SPI_Flash_r1.png|500px|]] | ||
[[File:KAmod_SPI_Flash_r2.png|500px|]] | |||
[[File:KAmod_SPI_Flash_r3.png|430px|]] | |||
</center> | </center> | ||
===== Zasilanie ===== | ===== Zasilanie ===== | ||
Revision as of 06:34, 4 June 2025

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.
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){};
}
}