Сделать CS (chip select) для работаты в SPI (для и SD карты и OLED)

This is how it looks.

Я работаю над проектом, который будет записывать данные на SD-карту и отображать пользовательский интерфейс на OLED. SparkFun OLED-прорыв был очень прост в настройке. Я также смог заставить библиотеку SD-карт работать независимо, хотя это было сложнее.

Проблема в том, что когда я объединяю эти примеры, SD-карта записывает только во время "настройки", после чего она не записывается на SD-карту, поскольку цикл продолжается. OLED по-прежнему работает просто отлично. Я немного читал на SPI и пробовал различные вещи, чтобы заставить "chip select" работать (я подозреваю, что это проблема) Я даже попытался установить CS-контакты на НИЗКИЙ или ВЫСОКИЙ с помощью digitalWrite, но это не повлияло.

Мои контакты соединены следующим образом:

          SD CARD      OLED  
MOSI        A5            A5     same pin
MISO        A4            --     just SD connected
SCK         A3            A3     same pin
CS          A1            A2     different pins

SD-карта записывает в основной цикл, если я закомментирую весь код, который запускает OLED. OLED работает в любом случае. Что я мог сделать дальше?

Вот код:

 #include "application.h"
 #include "sd-card-library/sd-card-library.h"
 #include "SparkFunMicroOLED/SparkFunMicroOLED.h"
 #include "math.h"

 //////////////////////////////////
 // MicroOLED Object Declaration //
 //////////////////////////////////
 // Declare a MicroOLED object. If no parameters are supplied, 
 // default pins are used, which will work for the Photon Micro 
 // OLED-экран (RST=D7, DC=D6, CS=A2)
 // Так как я использую A1 в качестве чипа выбрать контакт для SD-карты эти
 // значения по умолчанию кажутся прекрасными.

    MicroOLED oled;

 // Объявить файловый объект?

    File myFile;

 // Это контакты для SD-карты. A5, A4 и A3-это все 
 // совместно с OLED.

    const uint8_t chipSelectSD = A1;
    const uint8_t mosiPin = A5;
    const uint8_t misoPin = A4;
    const uint8_t clockPin = A3;

 ////////////
 // setup //
 ////////////
 void setup() {
  delay(500);

  SD.begin(mosiPin, misoPin, clockPin, chipSelectSD);
  File dataFile = SD.open("data.txt", FILE_WRITE);
  dataFile.println("этот текст был напечатан на SD-карту во время установки");
  dataFile.close();

  oled.begin();  // Инициализировать OLED
  oled.clear(ALL); // Clear задержка внутренней памяти дисплея
  delay(1000);  // Delay 1000 ms
  oled.clear(PAGE); // Clear the buffer.
  randomSeed(analogRead(A0) + analogRead(A7)); //seed, чтобы сделать тестовый шаблон случайным.

               }//end setup


//////////////////
// main loop //
//////////////////
void loop()  {

  SD.begin(mosiPin, misoPin, clockPin, chipSelectSD);
  File dataFile = SD.open("data.txt", FILE_WRITE);
  dataFile.println("The text was added during the loop.");
  dataFile.close();

  //проверьте дисплей с помощью текста и пикселей. 
  printTitle("Pixels", 1);
  for (int i=0; i<512; i++)
  { oled.pixel(random(oled.getLCDWidth()),  random(oled.getLCDHeight()));
  oled.display(); }
   delay(9000);

               } //end loop


//-------------------------//
// функция печати заголовков //
//-------------------------//
  void printTitle(String title, int font) {
  int middleX = oled.getLCDWidth() / 2;
  int middleY = oled.getLCDHeight() / 2;
  oled.clear(PAGE);
  oled.setFontType(font);
  // Try to set the cursor in the middle of the screen
  oled.setCursor(middleX - (oled.getFontWidth() * (title.length()/2)),
  middleY - (oled.getFontWidth() / 2));
  // Print the title:
  oled.print(title);
  oled.display();
  delay(1500);
  oled.clear(PAGE);
                                           } //end title function 

Так подключается SD-карта.

 oled.begin(); // Инициализировать OLED

Любая попытка использовать SD-карту после этой строки не будет работать. Я искал что-то вроде "oled.end ()", но не нашел способа сбросить до состояния, в котором работает SD-карта.

Я пробовал комментировать весь OLED-код, а затем SD-карта отлично пишет в основном цикле. Итак, я начал добавлять OLED-код обратно. Эта строка кода прерывает запись SD-карты в основной цикл:

, 👍1

Обсуждение

Попробуйте взаимодействовать с OLED-дисплеем с помощью I2C. Это могло бы избежать разногласий с SD-картой., @Nick Gammon

Попробуйте явно установить вывод CS, используемый " MicroOLED oled(rst, dc, cs)"., @Gerben

I2C, как известно, глючит на этом микропроцессоре. Я посмотрю, работает ли он у кого-нибудь. Я добавил "MicroOLED oled(MODE_SPI,D7, D6, A2)"; он все еще имеет ту же ошибку., @futurebird

Существуют устройства, которые "ломают" шину, не имея возможности работать в системах, имеющих более одного ведомого SPI. В этом случае вы ничего не можете сделать, чтобы исправить это, но используете устройства, которые не имеют такого поведения., @Avamander


1 ответ


1

Я хотел писать на 2 SD-карты одновременно с одним Arduino Mega. Использовали все соответствующие контакты, включая CS on 53 для первой SD-карты и 13 для второй SD-карты. Может быть любой цифровой PIN, который я думаю, но этот тоже заставляет мигать светодиод). Перед SD.begin(13) второй SD - карты я делаю цифровую запись(53,HIGH). Это де-выбирает первую SD-карту. и digitalWrite(13,HIGH) при переключении обратно на SD.begin(53) Я делаю digitalWrite(13,HIGH). Это работает очень хорошо.

Теперь я попытался внедрить это на D1-Mini. Не может заставить его работать.
SD.begin(D8) запускает первый SD нормально. Сделав digitalWrite(D8,HIGH) я попытался снять SD1 и с SD.begin(D4) открыл вторую карту. Как ни странно, он все равно снова открывает первую SD-карту независимо от параметра pinnumber.
Может быть, библиотека SD для ESP8266 помнит первую настройку CS, а более поздние настройки параметра с различными вершинами игнорируются???

,