Actions

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>J2, 0...8</b>
| style="text-align: center;"|<b>CS</b>
| style="text-align: left;"|  
| style="text-align: left;"|  
*8 wyjść z aktywnym stanem niskim (masa zasilania, GND)
*Wejście sygnału CS (Chip Select - aktywowanie interfejsu SPI)
|-
|-
| style="text-align: center;"|<b>J2, VCC</b>
| style="text-align: center;"|<b>SCK</b>
| style="text-align: left;"|  
| style="text-align: left;"|  
*wejście zasilania obwodów wyjść, biegun dodatni
*Wejście sygnału zegarowego/taktującego
|-
|-
| style="text-align: center;"|<b>J2, G</b>
| style="text-align: center;"|<b>DI</b>
| style="text-align: left;"|  
| style="text-align: left;"|  
*wejście zasilania obwodów wyjść, biegun ujemny (GND)
*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>
Wyjścia modułu zostały wyprowadzone jako punkty lutownicze z otworami, rozmieszczone ze standardowym rastrem 2,54 mm, tuż przy krawędzi płytki. Umożliwiają one przylutowanie przewodów lub szpilek goldpin. Przyporządkowanie wyprowadzeń zostało pokazane na poniższym rysunku.
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>
Każde wyjście jest zbudowane z tranzystora N-MOSFET i diody zabezpieczającej. Aktywne wyjście dostarcza masę zasilania (G GND), wyjście nieaktywne jest w stanie wysokiej impedancji (HiZ). Maksymalny prąd wyjścia nie może przekroczyć 1 A, a maksymalne napięcie na wyjściu nie może przekroczyć 50 V. Dzięki zastosowaniu diody zabezpieczającej, wyjścia mogą bezpośrednio sterować obciążeniami indukcyjnymi, np. przekaźnikami, elektrozaworami, silnikami elektrycznymi, jeśli ich parametry nie przekraczają wartości prądu lub napięcia maksymalnego.
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>
Obwód wyjściowy należy połączyć z zasilaniem komponentów dołączonych do wyjść – VCC – biegun dodatni, G – biegun ujemny.
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:KAmod_I2C-Mini_Out_8_out.jpg|none|600px|thumb|center]]
[[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
  • Zmontowany i uruchomiony moduł
  • 1 x prosta listwa goldpin 8-pin raster 2,54 mm
Schemat elektryczny


Sygnały sterujące


Oznaczenie (J1) Funkcja
CS
  • Wejście sygnału CS (Chip Select - aktywowanie interfejsu SPI)
SCK
  • Wejście sygnału zegarowego/taktującego
DI
  • Wejście szeregowe danych (Data In)
DO
  • Wyjście szeregowe danych (Data Out)
GND
  • Zasilanie – biegun ujemny (masa/GND)
V+
  • Zasilanie – biegun dodatni, napięcie 2,7...3,6 V
WP
  • Wejście blokady zapisu (Write Protect) aktywne w stanie niskim, połączone ze zworką Write protect
HOLD
  • Wejście sygnału zatrzymania komunikacji


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
  • V+ (J1)
  • GND (J1)
  • wejście zasilania obwodów sterujących, biegun dodatni
  • wejście zasilania obwodów sterujących, biegun ujemny (GND)

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



Linki