Протокол SPI с несколькими устройствами

Мне нужно записать и прочитать измерения, полученные датчиком, на SD-карту. Считывание с карты будет заключаться в отображении данных на TFT-экране. В частности, я использую 1,8-дюймовый экран ST7735. Чтобы использовать карту с Arduino, я использую модуль чтения SD-карт (бренд ANGEEK). Оба устройства работают по протоколу SPI.

Чтобы убедиться, что это возможно, я создаю тестовый код. В нем две функции (measure_V и measure_I) имитируют измерения напряжения и тока. Итак, что я делаю, так это вызываю эти две функции, чтобы получить 10 измерений и сохранить их все на SD. Затем я читаю их и вывожу на экран. Я показываю их как на последовательном мониторе, так и на TFT-экране. Чтобы сопоставить значения V_data и I_data, я использую две функции, которые дают мне максимальное значение в каждой мере. Однако ни на последовательном мониторе, ни на экране ничего не отображается. Эти два устройства имеют общие контакты MISO, MOSI и SCK. Может ли кто-нибудь помочь мне с этим? Это первый раз, когда я использую протокол SPI более чем с одним устройством.

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

#define TFT_CS 10
#define A0_pin 8
#define RST_pin 9

#define SD_CS 7                                              // CS pin SD-карты, подключенной к контакту 7 Arduino

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, A0_pin, RST_pin);

const uint8_t rotation=2;                                    // Начало координат вверху слева

float V_data[10], I_data[10];                                // Хранить измерения напряжения и тока

File V_points;
File I_points;

const uint16_t  Display_Color_Green = 0x07E0;                // Зеленый цвет


int measure_V(int x){
  int voltage;
  voltage = x;
  return voltage;
}

int measure_I(int x){
  int current;
  current = pow(x, 2);
  return current;
}

int max_V(){
  int maxVal = 0;
  for (int i=0; i<sizeof(V_data)/sizeof(float); i++) {
    if (maxVal < V_data[i]) {
      maxVal= V_data[i];
    }
  }
  return maxVal;
}

int max_I(){
  int maxVal = 0;
  for (int i=0; i<sizeof(I_data)/sizeof(float); i++) {
    if (maxVal < I_data[i]) {
      maxVal= I_data[i];
    }
  }
  return maxVal;
}

void setup() {

  Serial.begin(9600);
  tft.initR(INITR_GREENTAB);                                                // Инициализировать микросхему ST7735R, зеленая вкладка
  tft.setSPISpeed(40000000);
  tft.setRotation(rotation);                                                // Устанавливаем тип вращения
  tft.fillScreen(ST7735_BLACK);
  
  Serial.print("Initializing SD card...");

  if (!SD.begin(SD_CS))
  {
    Serial.println("SD initialization failed!");
    while (1) ;
  }
  Serial.println("SD initialization done.");
}

void loop() {

  int static n = 0;                                                              // Номер измерения (начальное измерение = 0)
  uint16_t pixelV, pixelI;

  // Мы выполняем и сохраняем на карте памяти 10 измерений
  for(int i=0; i<=9; i++){
    V_points.print(measure_V(i));                                                // Новое значение напряжения
    I_points.print(measure_I(i));                                                // Новое текущее значение
    }

  // Мы считываем 10 показателей карты
  while (V_points.available() && I_points.available()){
    V_data[n] = V_points.parseFloat();                                           // Считывать значение напряжения из файла
    I_data[n] = I_points.parseFloat();                                           // Считывает текущее значение из файла
    Serial.print("Voltage= ");
    Serial.print(V_data[n]);
    Serial.print(", ");
    Serial.print("Current= ");
    Serial.println(I_data[n]);
    pixelV = map(V_data[n], 0, max_V(), 0, 128);                                 // Мы наносим на карту напряженность
    pixelI = map(I_data[n], 0, max_I(), 0, 160);                                 // Мы наносим на карту текущие
    tft.drawPixel(pixelV, pixelI, Display_Color_Green);
    n++;
    }


}

, 👍1

Обсуждение

Проверьте конкретные детали ваших датчиков, чтобы убедиться, что они правильно переводят контакт MISO в высокое сопротивление, когда SS вытягивается на высокий уровень. См. мой [ответ](https://arduinoprosto.ru/q/51963/33608) на аналогичный вопрос для возможного обходного пути., @sempaiscuba

это может быть эта проблема: https://arduinoprosto.ru/q/36912/slave-spi-does-not-work/36915#36915, @Juraj

Спасибо, я посмотрю, через что вы прошли, и посмотрю, исправит ли это это., @Libegria

Похоже, вы не открываете и не закрываете файлы, которые пытаетесь записать или прочитать. См. пример использования SD-карты: https://www.arduino.cc/en/Tutorial/LibraryExamples/ReadWrite., @6v6gt