Использование двух SPI устройств (Nano + SPIFlash + LCD)

ss7
Offline
Зарегистрирован: 30.06.2018

К ардуине нано (подходит из-за размера), подключены два устройства:

Winbond flash на 4Мб и Nokia 5510 lcd.

Чтобы не было ограничений памяти, использую минимальную библиотеку для дисплея: https://github.com/platisd/nokia-5110-lcd-library/

Для памяти отлично подошла эта библиотека: https://github.com/Marzogh/SPIMemory

Подключены оба устройства. Нужно выводить картинки из подключенной памяти на дисплей. Экран отлично работает, когда подключены оба устройства (там указаны используемые пины), если я вызываю его так:

#include <Nokia_LCD.h>

Nokia_LCD lcd(3 /* CLK */, 4 /* DIN */, 5 /* DC */, 6 /* CE */, 7 /* RST */);

void setup() {
 
  // Initialize the screen
  lcd.begin();
  // Set the contrast
  lcd.setContrast(60);
  // Clear the screen
  lcd.clear(false);
  //delay(100);
  // Draw the image
  lcd.draw(testimage, 504, true);

Когда я выполняю код с подключенной флеш памятью, он выводит на экран треш и перестаёт нормально рисовать, при этом данные из памяти отлично считываются и выводятся в серийный порт:

#include<SPIMemory.h>
#include <Nokia_LCD.h>

SPIFlash flash(10); //CS 10, D0 12, CLK 13, DI 11  

Nokia_LCD lcd(3 /* CLK */, 4 /* DIN */, 5 /* DC */, 6 /* CE */, 7 /* RST */);

void setup() {
  Serial.begin(9600);
  Serial.println("Accesing flash...");
  flash.begin();
  readbytes_toserial(); // read bytes and print to serial
  Serial.println();

  lcd.begin();
  // Set the contrast
  lcd.setContrast(60);  // Good values are usualy between 40 and 60
  // Clear the screen by filling it with pixels
  lcd.clear(false);
  lcd.draw(testimg, 504, true);
}

Как использовать оба устройства одновременно правильно?

b707
Offline
Зарегистрирован: 26.05.2017

ИМХО, проблема может быть в нехватке памяти. В Сериал вы выводите свои байты по одному, а на экран выпихиваете весь массив разом. Попробуйте и на экран выводить картинку побайтно, считали один байт - вывели, потом другой.

ss7
Offline
Зарегистрирован: 30.06.2018

Пфф, даже стыдно сказать, я затупил. Перечитал сорцы библиотеки, нашёл место

bool Nokia_LCD::draw(const unsigned char bitmap[],
                     const unsigned int bitmap_size,
                     const bool read_from_progmem)

Ну и как бы всё понятно, нужно было false поставить, чтобы из progmem не читал. Теперь 2 загруженных массива спокойно с картинками одновременно в оперативке и отрисовывается, всё занимает 1593 байт (77%) динамической памяти