Аппаратный SPI Arduino NANO не работает

У меня есть клон Arduino NANO и 2,4-дюймовый TFT-дисплей ILI9341. Контакты VCC и LCD дисплея подключены к контакту 5V платы. GND к GND. Все логические контакты подключены к делителям напряжения. (резисторы 2k2 и 4k3), их соединения проверены и дают 3,3 В, когда на них подается 5 В.

Если я правильно понимаю источник, если я укажу все выводы конструктору, то я использовать программный SPI, но если нет, то я использую аппаратный SPI.

Теперь, если я использую программный SPI, все работает нормально, я могу получать информацию, рисовать и т. д. Однако, если я использую аппаратный SPI, он ничего мне не дает.

#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>

// Adafruit_ILI9341 tft = Adafruit_ILI9341(10, 9); // НЕ РАБОТАЕТ!
Adafruit_ILI9341 tft = Adafruit_ILI9341(10, 9, 11, 13, 8, 12);  // РАБОТАЮЩИЙ!

void
setup()
{
    Serial.begin(9600);
    while (!Serial);

    Serial.println("ILI9341 Test!");

    tft.begin();

    // чтение диагностики (необязательно, но может помочь в отладке проблем)
    uint8_t x = tft.readcommand8(ILI9341_RDMODE);
    Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX);
    x = tft.readcommand8(ILI9341_RDMADCTL);
    Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX);
    x = tft.readcommand8(ILI9341_RDPIXFMT);
    Serial.print("Pixel Format: 0x"); Serial.println(x, HEX);
    x = tft.readcommand8(ILI9341_RDIMGFMT);
    Serial.print("Image Format: 0x"); Serial.println(x, HEX);
    x = tft.readcommand8(ILI9341_RDSELFDIAG);
    Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX);
}

void
loop()
{
    // проходить
}

Тем не менее, что меня действительно сбивает с толку, так это то, что когда я использую устройство чтения SD-карт только с SD Library (устройство чтения SD-карт находится на плате ILI9341), оно также работает нормально. (как если бы аппаратный SPI работал, если только SD-библиотека волшебным образом не переключается на программный SPI). Во всяком случае, следующий рабочий код:

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

void
setup()
{
    Serial.begin(9600);
    while (!Serial);

    Serial.println("ILI9341 Test!");

    if (!SD.begin(7))
    {
        Serial.println("Cannot initialise SD card");
        while (true);
    }

    File file;

    if ((file = SD.open("file.txt", FILE_WRITE)))
    {
        Serial.print("Writing to file...");
        file.println("Hello, World!");
        file.close();
        Serial.println(" DONE");
    }
    else
        Serial.println("Cannot open file for writing");

    if ((file = SD.open("file.txt")))
    {
        Serial.println("Opening file...");
        while (file.available())
            Serial.write(file.read());
        file.close();
        Serial.println("DONE");
    }
    else
        Serial.println("Cannot open file for reading");
}

void
loop()
{
    // проходить
}

Что именно здесь происходит? Я делаю что-то явно не так? Или аппаратный SPI платы не работает? Или проблема с библиотекой Adafruit?


Дополнительная информация:

Я использую arduino-cli для загрузки скетчей следующими способами:

# To compile:
arduino-cli                                     \
    compile                                     \
    --fqbn arduino:avr:nano:cpu=atmega328old    \
    --warnings all                              \
    MyArduinoSketch;

# To upload
sudo arduino-cli                                \
     upload                                     \
     --verify                                   \
     --verbose                                  \
     --port /dev/ttyUSB0                        \
     --fqbn arduino:avr:nano:cpu=atmega328old   \
     MyArduinoSketch;

Я установил упомянутые библиотеки через arduino-cli.

, 👍1

Обсуждение

если вы тестируете дисплей на аппаратном SPI без библиотеки SD, вставлена ли SD-карта?, @Juraj

дисплей adafruit имеет внутреннее преобразование логического уровня, и arduino будет читать 3,3 В как ВЫСОКОЕ (даже если оно выходит за пределы, указанные в техническом описании). вам не нужны делители напряжения., @Juraj

Подсказка: вам может потребоваться установить вывод выбора чипа SD в положение OUTPUT и HIGH при использовании TFT только с HW SPI. Особенно, если SD-карта вставлена., @Mikael Patel

@MikaelPatel, только если карта вставлена. без карты нет устройства, @Juraj

@Juraj Я тестировал как вставленную, так и извлеченную SD-карту, она в любом случае не работает. TBF это не официальный дисплей Adafruit, он такой: http://ceezblog.info/images/blog/9341breakout.jpg который, насколько я знаю, обрабатывает 3,3 В на логическом уровне, а не 5 В. В любом случае, я не думаю, что есть какой-то вред от добавления туда делителя напряжения и убедитесь, что ВЫСОКИЙ на самом деле соответствует ожидаемым 3,3 В. Если это будет проблемой, программный SPI тоже не должен работать, не так ли?, @Peter Varo

@MikaelPatel У меня есть две идентичные настройки: одна с двумя ведомыми устройствами SPI (дисплей, карта) и одна только с одним (дисплей). Оба они работают с программным SPI (первый работает только если SD-карта не вставлена). Я попытался установить для вывода SD CS/SS значение OUTPUT, несмотря на то, что SD.begin(<CS/SS pin>) неявно установит его для вывода. Я не тестировал с установкой ВЫСОКОГО, однако версия, в которой у меня не подключено устройство для чтения карт памяти, должно работать, но это не так., @Peter Varo

попробуйте Adafruit_ILI9341(10, 9, 8); без вставленной SD-карты, @Juraj

@Juraj сделал свое дело! Как? Почему? ;), @Peter Varo

(Позвольте мне попробовать заставить его работать одновременно с устройством для чтения SD-карт. Я уверен, что теперь оно будет работать, но давайте просто проверим его..), @Peter Varo

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


2 ответа


Лучший ответ:

2

Используйте конструктор Adafruit_ILI9341(10, 9, 8);, чтобы сделать сброс, который работает с программным SPI.

На SD-карту в качестве второго устройства на шине:

Каждое устройство SPI на шине SPI должно управляться выводом выбора ведомого устройства. Если устройство подключено к шине, а контакт SS остается плавающим, это устройство мешает шине.

Пустой адаптер SD-карты не является устройством на шине, устройством является только вставленная карта. Если он подключен к шине, соответствующий вывод SS должен быть установлен в ВЫСОКИЙ уровень. Если вы используете SD-библиотеку SD.begin(SD_SS_PIN), библиотека инициализирует вывод. Если вы не используете библиотеку в скетче (потому что она занимает много памяти), извлеките SD-карту или установите вывод SS в положение OUTPUT и HIGH.

,

0

Здравствуйте, Peter First Adafruit тратит много времени на создание своих библиотек, и я ценю это, но мне повезло, что у меня никогда ничего не работает с их библиотеками, это только я

Я использую эту библиотеку:

https://github.com/Bodmer/TFT_ILI9341

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


// #define SUPPORT_TRANSACTIONS

раскомментируйте эту строку, и ваша сенсорная часть, а также SD-карта будут работать нормально. У меня были настройки, работающие с экраном, сенсорным контроллером, платой RFID и SD-картой, все они работают на SPI, каждая со своим собственным SS или выводом выбора чипа.

Обратите внимание! если вы собираетесь попробовать библиотеку, лучше сначала удалить файл ADAfruit, потому что есть несколько файлов с одинаковыми именами, и IDE имеет тенденцию включать первый найденный файл, также известный как Adafruit

,