Использование двух SPI устройств (Nano + SPIFlash + LCD)
- Войдите на сайт для отправки комментариев
К ардуине нано (подходит из-за размера), подключены два устройства:
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);
}
Как использовать оба устройства одновременно правильно?
ИМХО, проблема может быть в нехватке памяти. В Сериал вы выводите свои байты по одному, а на экран выпихиваете весь массив разом. Попробуйте и на экран выводить картинку побайтно, считали один байт - вывели, потом другой.
Пфф, даже стыдно сказать, я затупил. Перечитал сорцы библиотеки, нашёл место
bool Nokia_LCD::draw(const unsigned char bitmap[], const unsigned int bitmap_size, const bool read_from_progmem)Ну и как бы всё понятно, нужно было false поставить, чтобы из progmem не читал. Теперь 2 загруженных массива спокойно с картинками одновременно в оперативке и отрисовывается, всё занимает 1593 байт (77%) динамической памяти