X

Kurs ESP - SPI

Protokół komunikacyjny SPI został wynaleziony przez Motorolę w 1970r.

SPI jest synchronicznym oraz szeregowym protokołem danych. Do synchronizacji komunikacji między urządzeniami nadrzędnymi i podrzędnymi wymagany jest zegar. W  przypadku komunikacji SPI, tylko jedno urządzenie może być nadrzędne.

Maksymalna przepustowość wynosi do 10000000 bit/s. Jest to szybszy protokół, niż  UART, czy I2C. Szybkość, z której może korzystać mikrokontroler, zależna jest od  taktowania zegara chipa. ESP82 i ESP32 ma wyższą szybkość zegara, w porównaniu do  mikrokontrolera Arduino. Dla kontrolerów ESP zaleca się zmniejszenie szybkości transmisji danych. 

Istnieje możliwość ręcznego dobrania szybkości przesyłania. Przykładem jest funkcja setClockDivider(). Daje ona możliwość obniżenia przepustowości, za pomocą dzielników setClockDivider(dzielnik), może on przyjąć wartość 2, 4, 8, 16, 32, 64 lub 128. Jednak nie  ma  konieczności korzystania z tej funkcji, ponieważ ESP samo dobiera odpowiednią szybkość komunikacji.

W systemie SPI tylko jedno urządzenie może być masterem. Jeden master może obsłużyć wiele urządzeń typu slave. Każde z tych urządzeń musi być podłączone do mastera za  pomocą oddzielnej linii „Slave Select”. W przeciwieństwie do I2C, nie występuje tu  adresowanie urządzeń unikalnym identyfikatorem. Linia zegara, MOSI oraz MISO są  wspólne. 

Przepływ informacji w protokole SPI

SPI 3 urządzenia slave
 
W standardzie tym występują linie:

•    MISO Linia Slave do wysyłania danych do mastera

•    MOSI Linia Master do wysyłania danych do urządzeń peryferyjnych

•    SCK / SCLK impuls z urządzenia nadrzędnego w celu synchronizacji transmisji danych

•    SS po jednej na każde urządzenie Slave - Pozwala na współdzielenie linii MISO, MOSI i SCK. Jest to dowolny pin cyfrowy kontrolera. Określa które urządzenie nadaje (stan niski). W przypadku stanu wysokiego brak komunikacji. 
https://diyi0t.com/spi-tutorial-for-arduino-and-esp8266/

Obsługa czytnika kart SD

W przypadku komunikacji ESP karta pamięci wykorzystywany jest protokół SPI. 

Biblioteki oraz komendy do obsługi kart pamięci.

Wymagane są biblioteki SPI.h oraz SD.h. 
#include <SPI.h>
#include <SD.h>

Komendy służące do obsługi kart pamięci.

1. Tworzenie instancji klasy File.
File myFile;

2. Wybór pinu karty. Warunek pozwoli na zwrócenie informacji o wykryciu karty.

if (!SD.begin(4)) {
    Serial.println("Brak karty!");
    return;
  }

3. Sprawdzenie czy w pamięci karty znajduje się plik „test.txt” z rozszerzeniem.
SD.exists("test.txt ")

4. Usuwanie pliku.
SD.remove("test.txt ");

5. Nadanie praw odczyt zapis.
plik = SD.open("test.txt ", FILE_WRITE);

6. Obsługa pliku w konkretnym katalogu:
plik = SD.open("/katalog1/katalog2/ test.txt ", FILE_WRITE);
 
7. Zapis danych do pliku.
plik.print("Dane do zapisania.");

8. Sprawdzenie czy plik zawiera dane do odczytu.
    plik.available();

9. Odczyt danych.
plik.read();
 

Schemat podłączenia

Schemat ESP SPI SD

Kod programu

#include <SPI.h>
#include <SD.h>

File myFile;

void setup()
{
  Serial.begin(115200);
  while (!Serial) {
    ; 
  }  
  Serial.print("Szukam karty SD...");
  if (!SD.begin(4)) {
    Serial.println("Karta SD jest niedostępna.");
    return;
  }
  Serial.println("karta SD wykryta.");
  SD.remove("test.txt");
}
  

void loop()
{
  myFile = SD.open("test.txt", FILE_WRITE);

  if (myFile) {
    Serial.print("Zapis test.txt...");
    myFile.println("Test...");
    myFile.close();
    Serial.println("OK.");
  } else {
    Serial.println("błąd otwarcia pliku test.txt");
  }
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    myFile.close();
  } else {
    Serial.println("Błąd otwarcia pliku test.txt");
  }
  delay(5000);
}