[Решено] Проблема ILI9431

Lapgoch
Сб 24 февраля 2018 г., 2:39
Привет.
Я ищу помощь.
У меня есть существующий эскиз, который работает нормально.
Эскиз используется для разблокировки двери с помощью RFID -карты.
Он использует Maple Mini с ENC28J60 и MFRC522 на шине SPI.
Я хотел бы добавить дисплей ILI9431 TFT, чтобы показать несколько сообщений ввода дверей.
Когда я добавляю TFT -дисплей в ту же шину SPI и запускаю только базовый эскиз TFT, TFT -дисплей работает ОК.
Когда я добавляю один и тот же базовый эскиз TFT в свой эскиз для блокировки дверей и запускаю общий набросок, у меня есть проблемы.
Проблема в том, что ENC28J60 и MFRC522 все еще работают нормально, но очень медленно.
Дисплей ILI9431 TFT обновляет только по одному пикселю за раз невероятно медленно.
Кто -нибудь знает, почему ILI9431 противоречит ENC28J60 / MFRC522.
Вот эскиз TFT
// tft screen setup #define CS_TFT PA8 #define DC_TFT PB12 #define RST_TFT PA1 #include #include Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(CS_TFT, DC_TFT, RST_TFT); void setup() { tft.begin(); tft.setRotation(1); } void loop() { tftDisplay(); } void tftDisplay() { tft.setTextSize(1); tft.fillScreen(ILI9341_BLACK); tft.setTextColor(ILI9341_RED); tft.drawString("01234",0,0,7); tft.drawString("56789",0,120,7); delay(1000); tft.setTextSize(2); tft.fillScreen(ILI9341_BLACK); tft.setTextColor(ILI9341_YELLOW); tft.drawString("1234",0,0,7); tft.drawString("Lapgoch",50,140,4); delay(1000); }

Мэнни
Сб 24 февраля 2018 г., 11:57
Взгляните мне, что RFID читает для Целевая работа непрерывно подбрасывает ресурсы, он должен выглядеть примерно так из папки примеров библиотеков
void loop() { if ( ! mfrc522.PICC_IsNewCardPresent()) return; // check if rfid card is present if ( ! mfrc522.PICC_ReadCardSerial()) return; // read rfid card mfrc522.PICC_HaltA(); // stop reading rfid card if (rfid.uid.uidByte[0] != nuidPICC[0] || rfid.uid.uidByte[1] != nuidPICC[1] || rfid.uid.uidByte[2] != nuidPICC[2] || rfid.uid.uidByte[3] != nuidPICC[3] ) { for (int i = 0; i < 4; i++) { // setup loop to read 4 bytes from rfid card readCard[i] = mfrc522.uid.uidByte[i]; // read card ID byte stringReadCard[i] = String(readCard[i], HEX); // save card ID byte as hex data } // convert rfid hex data to rfid string String readID = stringReadCard[0] + stringReadCard[1] + stringReadCard[2] + stringReadCard[3]; if (readID != "") checkAccess(readID); tftDisplay(); } }

Mrburnette
Сб 24 февраля 2018 г., 22:52
Я согласен с Мэнни. Вам действительно нужно использовать Millis () и профилировать дельта-время для функций в цикле по сравнению с общим временем для выполнения 1 полного цикла. Узнайте, что подталкивает ваш код.

Луча

Lapgoch
Солнце 25 февраля 2018 г. 7:55 утра
Спасибо, ребята.
Я сейчас в Испании.
Поэтому я попробую ваши предложения, когда вернусь через пару недель.

Lapgoch
Чт, 8 марта 2018 г., 17:29
Привет, ребята.

Я попробовал ваши предложения, и, к сожалению, это не имело никакого значения.
Я обнаружил, что если я удалю весь код RFID в основном цикле и просто оставлю в коде TFT, то он все равно не работает.
Если я тогда прокомментирую MFRC522.Pcd_init (); В цикле установки TFT работает нормально.
Есть еще идеи ?

Mrburnette
Чт, 08, 2018, 17:57
Я не большой поклонник этой логической структуры:
void loop() { if ( ! mfrc522.PICC_IsNewCardPresent()) return; // check if rfid card is present if ( ! mfrc522.PICC_ReadCardSerial()) return; // read rfid card mfrc522.PICC_HaltA(); // stop reading rfid card

Стивестронг
Чт, 08, 2018, 8:21 вечера
В последнее время я помню, что в другом случае была проблема с ILI9341 LIB в репо Роджере, я не помню точно, какой из них.

Вы можете попробовать ILI9341 LIB из моего репо (www.GitHub.com/stevstrong/arduino_stm32).

Lapgoch
Пт, 09 марта 2018 г., 7:43
Привет, Рэй.
Я не могу переделать код, так как я снял весь код считывателя карт, и дисплей TFT все еще не работал.
Это было только тогда, когда я удалил MFRC522.Pcd_init (); Из цикла настройки, который работал TFT -дисплей.

Привет, Стив.
Я сделаю вашу библиотеку позже.
Спасибо.

Lapgoch
Пт, 09 марта 2018 г., 11:18
Привет, Стив.

Когда я использую вашу библиотеку arduino_stm32, я получаю следующее сообщение об ошибке компиляции.

ARM-None-Eabi-G ++: Ошибка: (сборка.флаги.оптимизировать): нет такого файла или каталога

В исходной библиотеке arduino_stm32 нет этой ошибки.
Любая идея, что может быть неправильно ?

Стивестронг
Пт, 09 марта 2018 12:24
Вы взяли только файлы LIB ILI9341 или полное ядро?
Без полного журнала окна сообщения Arduino IDE (словесное включено) не может его понять.

Lapgoch
Пт 09 марта 2018 12:51
Привет, Стив.

Я использовал весь ядро.
Я сделаю библиотеку ILI9431.
Спасибо.

Стивестронг
Пт, 09 марта 2018 12:56
Вот путь: https: // github.com/stevstrong/arduino_s ... Li9341_stm

Lapgoch
Пт, 09 марта 2018 13:37
Привет, Стив.

Когда я использую только библиотеки ILI9341_STM и GFX_AS, я получаю немного дальше, но сбой при другой ошибке.
\DOCUME~1\ADMINI~1\LOCALS~1\Temp\build4c2071f28635de9ec1f5b1d3003eb191.tmp\sketch\demo.ino.cpp.o" In file included from C:\arduino-1.6.9\portable\sketchbook\maple\demo box\demo\demo.ino:29:0: C:\arduino-1.6.9\portable\sketchbook\hardware\Arduino_STM32\STM32F1\libraries\Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h: In member function 'void Adafruit_ILI9341_STM::spiwrite16(uint16_t)': C:\arduino-1.6.9\portable\sketchbook\hardware\Arduino_STM32\STM32F1\libraries\Adafruit_ILI9341_STM/Adafruit_ILI9341_STM.h:148:48: error: 'class SPIClass' has no member named 'write16' inline void spiwrite16(uint16_t c) { mSPI.write16(c); } // 8 bit mode ^ Using library SPI at version 1.0 in folder: C:\arduino-1.6.9\portable\sketchbook\hardware\Arduino_STM32\STM32F1\libraries\SPI Using library UIPEthernet-master at version 2.0.6 in folder: C:\arduino-1.6.9\libraries\UIPEthernet-master Using library rfid-master at version 1.2.0 in folder: C:\arduino-1.6.9\portable\sketchbook\libraries\rfid-master Using library Adafruit_GFX_AS in folder: C:\arduino-1.6.9\portable\sketchbook\hardware\Arduino_STM32\STM32F1\libraries\Adafruit_GFX_AS (legacy) Using library Adafruit_ILI9341_STM in folder: C:\arduino-1.6.9\portable\sketchbook\hardware\Arduino_STM32\STM32F1\libraries\Adafruit_ILI9341_STM (legacy) exit status 1 Error compiling for board Maple Mini.

Стивестронг
Пт, 09 марта 2018 13:48
На первом взгляде кажется, что вы используете нестандартную установку.
Структура файла arduino_stm32 должна быть расположена под: C:/пользователи/<пользователь>/Документы/arduino/hardware/. где ваши наброски обычно расположены под: C:/пользователи/<пользователь>/Документы/arduino/ За исключением примеров конкретных библиотек.

Кроме того, я рекомендую использовать Arduino IDE версию 1.8.5 в отдельном каталоге (например: c:/users/<пользователь>/Загрузки/).

Кроме того, я вижу, что вам также нужна моя библиотека SPI, которая содержит некоторые дополнительные функции по сравнению с ядром Роджера.

Lapgoch
Пт, 09 марта 2018 г., 14:16
В итоге у меня была портативная версия Arduino, потому что у меня были проблемы с компиляцией любого эскиза.
My Arduino IDE работает на виртуальной машине XP.
Я не могу вспомнить точное сообщение об ошибке компиляции, но это было связано с тем, что путь к файлу слишком длинный.
Я не хочу обновлять свою Arduino IDE в данный момент, так как я мог бы представить еще больше проблем.
Мне просто нужно будет продолжать гуглую свою проблему.
Еще раз спасибо за вашу помощь.

Стивестронг
Пт, 09 марта 2018 г., 14:19
В качестве альтернативы вы можете в конечном итоге использовать SPI1 для только TFT, а остальные устройства на SPI2.

Lapgoch
Пт, 09 марта 2018 г., 16:42
Да, это другой способ.
К сожалению, я уже сделал печатную плату со всем, подключенным к SPI1.
Я связывался с библиотекой MFRC522 и обнаружил, что если я прокомментирую следующие строки в MFRC522.Pcd_init (); Затем работает TFT -дисплей.

Pcd_writeregister (tmodereg, 0x80); // tauto = 1; Таймер начинается автоматически в конце передачи во всех режимах связи на всех скоростях
Pcd_writeregister (tprescalerreg, 0xa9); // tprescaler = tmodereg [3..0]: tprescalerreg, т.е. 0x0a9 = 169 => f_timer = 40 кГц, т.е. период таймера 25 мкс.
Pcd_writeregister (Treloadregh, 0x03); // перезагружать таймер с 0x3e8 = 1000, т.е. за 25 мс до тайм -аута.
Pcd_writeregister (treloadregl, 0xe8);
Pcd_writeregister (txaskerg, 0x40); // по умолчанию 0x00. Заставьте модуляцию 100 % ASK независимо от настройки регистра MODGSPREG
Pcd_writeregister (modereg, 0x3d); // по умолчанию 0x3f. Установите заданное значение для CRC Coprocessor для команды Calccrc на 0x6363
Pcd_antennaon (); // Включить контакты драйвера антенны TX1 и TX2 (они были отключены с помощью сброса)

Очевидно, что читатель RFID больше не работает.
Любые мысли о том, почему написание этих значений для чтения карт RFID вызовет проблемы с дисплеем TFT ?

Стивестронг
Пт, 09 марта 2018 г., 16:50
Возможно, это только последний вызов функции, который позволяет несколько выводов.
Пожалуйста, проверьте сопоставление выводов, может быть, между ними и выберите TFT CHIP или другой PIN -код, зарезервированный для TFT.

Lapgoch
Пт, 09 марта 2018 г., 17:08
Привет, Стив.
Не могли бы вы взглянуть на мой оригинальный пост, есть обзор того, как он подключен.
Вы можете заметить что -нибудь не так?

Стивестронг
Пт, 09 марта 2018 г., 17:15
Ах, хорошо, теперь я вижу картирование твоего булавки.
Мне это выглядит нормально.
У меня действительно есть ощущение, что официальный ILI9341 LIB не ошибочно обрабатывает чип.
Для тестирования, пожалуйста, постарайтесь добавить после каждой функции TFT группы вызова A TFT_CS Line: tft.funct1(); // pseudo code tft.func2(); // pseudo code digitalWrite(TFT_CS, HIGH); // real code

Lapgoch
Пт, 09 марта 2018 г., 17:31
Попробовал это и до сих пор не радости.
Похоже, мне придется вернуться к чертежной доске с этим.
Еще раз спасибо за вашу помощь.

импульс
Сб 10 марта 2018 г., 5:10 утра
На других платформах я видел аналогичные проблемы, когда поддержка транзакций SPI не была включена.
Я не заглянул в ядро ​​STM32 достаточно, чтобы узнать, будет ли это применимо, но отметил, что STM32FX/Libraries/SPI/SRC/SPI.час Поддержка транзакций отключена по умолчанию.
#define SPI_HAS_TRANSACTION

Стивестронг
Сб 10 марта 2018 г. 8:27 утра
Даже если это определение не активно, я всегда использую SPI.начало транзакции (...) Когда участвует SPI. Оно работает.
Но это не имеет ничего общего с первоначальной проблемой.

Lapgoch
Пт 23 марта 2018 г., 19:14
Привет.

После долгих мест создать новую виртуальную машину Win7 с Arduino IDE 1.8.5 со стандартной установкой .
У меня все еще была такая же проблема, считыватель карт MFRC522 и дисплей ILI9431 просто не работали вместе на одной и той же шине SPI.
Я наконец бросил библиотеки <Adafruit_gfx_as.час> и <Adafruit_ili9341_stm.час> и просто использовал <Adafruit_gfx.час> и <Adafruit_ili9341.час>
Они работали отлично, медленно, но хорошо для моего применения.
Таким образом, кажется, что конфликт с библиотекой Adafruit STM и библиотекой MFRC522.
Быть простым смертным, я понятия не имею, как исправить конфликт.
Может быть.

Стивестронг
Пт 23 марта 2018 г. 22:50
Есть PR на GitHub о проблемах с функциями библиотеки графики, покидающих шину SPI в 16 -битном режиме, что, скорее всего, является причиной этой проблемы.
Вы можете попробовать выполнить SPI.beginTransaction(SPISettings(18000000, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT));

Lapgoch
Сб 24 марта 2018 г., 6:43
Привет, Стив.

Большое спасибо, ты звезда.
Теперь все отлично работает.
Я играл со всеми различными настройками для SPI.BegintransaStion без радости.
Я не знал о настройках 8/16 бит.

Также спасибо Роджеру Кларку за то, что у него были подобные проблемы с несколькими устройствами SPI и изучили его.

3.97 Большой дисплей 240x400 ST7793

STM32F429 SRAM + EXT SRAM + TFT 16BIT с DMA