Сделать CS (chip select) для работаты в SPI (для и SD карты и OLED)
Я работаю над проектом, который будет записывать данные на 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-карты в основной цикл:
@futurebird, 👍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, а более поздние настройки параметра с различными вершинами игнорируются???
- Как увеличить скорость записи на SD-карту в Ардуино
- Путаница между SPI и I2C для SSD1306 OLED
- Какие контакты можно использовать для выбора микросхемы (CS, CC) на Arduino Nano Every?
- Использование экрана SD-карты на Arduino Due
- Загрузить сайт с SD-карты
- Отобразить изображение с SD-карты на ЖК-дисплей ILI9486
- Аппаратный SPI Arduino NANO не работает
- Nextion Display не получает обновленных данных
Попробуйте взаимодействовать с OLED-дисплеем с помощью I2C. Это могло бы избежать разногласий с SD-картой., @Nick Gammon
Попробуйте явно установить вывод CS, используемый " MicroOLED oled(rst, dc, cs)"., @Gerben
I2C, как известно, глючит на этом микропроцессоре. Я посмотрю, работает ли он у кого-нибудь. Я добавил "MicroOLED oled(MODE_SPI,D7, D6, A2)"; он все еще имеет ту же ошибку., @futurebird
Существуют устройства, которые "ломают" шину, не имея возможности работать в системах, имеющих более одного ведомого SPI. В этом случае вы ничего не можете сделать, чтобы исправить это, но используете устройства, которые не имеют такого поведения., @Avamander