adafruit_ili9341_stm для spi2

Мадиас
Солнце 17 апреля 2016 г., 19:03
Привет,
Потому что мне нужен был TFT на SPI2, я переписал библиотеку и переименовал ее в ADAFRIT_ILI9341_STM_SPI2, чтобы она мог легко сосуществовать со стандартной LIB, поэтому, если вам это нужно, вы можете запустить два независимых ILI9341. Лучшим примером будет использование с другим устройством на SPI1, например NRF24 (как и я) или SD-карта. Преимущество - использовать оба канала DMA для SPI. Другое преимущество - вы не позаботитесь о том, какой SPI вы принимаете в эскизе, все функции ILI9341 автоматически на SPI2.
Использование просто: просто поместите линии SPI модуля TFT в SPI2, остальные выводы могут быть изменены программным обеспечением.
Все примеры должны включать "#include <Adafruit_ili9341_stm_spi2.час>", DMA успешно проверилась (мне не нужно было ничего менять« DMA », связанный в коде, из -за библиотеки Smart SPI, надеюсь, что это правильно), поэтому он заканчивается из коробки.

Werecatf
Солнце 17 апреля 2016 г., 19:40
Это довольно неуклюжий подход. Почему бы просто не добавить еще один конструктор класса в исходный ADAFRIT_ILI9341_STM, который позволяет указать SPI-BUS для использования? Как e.глин. Adafruit_ili9341_stm (uint8_t _spibus, int8_t _cs, int8_t _dc, int8_t _rst = -1)? Это гораздо более чистый подход и не требует нескольких копий библиотеки.

Mrburnette
Солнце 17 апреля 2016 г., 21:48
WereCatf написал:Это довольно неуклюжий подход. <...>

Werecatf
Солнце 17 апреля 2016 г., 22:05
Mrburnette написал:Играть хорошо.

Mrburnette
Солнце 17 апреля 2016 г. 22:10
WereCatf написал:Mrburnette написал:Играть хорошо.

Мадиас
Пн 18 апреля 2016 г. 16:16
Хорошо, игнорируя приведенные выше комментарии, я понял, что DMA на SPI2 не работает, как следует. Похоже, это только «нормальная» передача. На первых тестах я только видел, что все в порядке, но это медленнее, чем на SPI1. У меня был быстрый взгляд в библиотеку SPI, и кажется, как все каналы DMA активны с момента начала реализации. Нужно проверить это дважды, или мне нужен вход.
Рэй: Реализация DMA была сделана Виктором, я только перенес библиотеку (как я помню).

Кстати: установка разных портов SPI для меня немного размыт:
http: // www.STM32duino.com/viewtopic.PHP ... SPI2#P3923

Я думаю SPIClass SecondSPI(2); SecondSPI.setClockDivider(SPI_CLOCK_DIV32);

Mrburnette
Пн 18 апреля 2016 г., 16:25
Мадиас написал: <...>
Рэй: Реализация DMA была сделана Виктором, я только перенес библиотеку (как я помню).

Martinayotte
Пн 18 апреля 2016 г. 16:27
Это заставляет меня думать, что мы не слышали что -то от Виктора с некоторое время ...

Mrburnette
Пн 18 апреля 2016 г., 16:35
Martinayotte написал:Это заставляет меня думать, что мы не слышали что -то от Виктора с некоторое время ...

Werecatf
Пн 18 апреля 2016 г., 16:35
Мадиас написал:Хорошо, игнорируя приведенные выше комментарии, я понял, что DMA на SPI2 не работает, как следует. Похоже, это только «нормальная» передача. На первых тестах я только видел, что все в порядке, но это медленнее, чем на SPI1.

Racemaniac
Пн 18 апреля 2016 г., 17:46
WereCatf написал:Мадиас написал:Хорошо, игнорируя приведенные выше комментарии, я понял, что DMA на SPI2 не работает, как следует. Похоже, это только «нормальная» передача. На первых тестах я только видел, что все в порядке, но это медленнее, чем на SPI1.

Werecatf
Пн 18 апреля 2016 г., 17:58
Реданьяк написал:WereCatf написал:Мадиас написал:Хорошо, игнорируя приведенные выше комментарии, я понял, что DMA на SPI2 не работает, как следует. Похоже, это только «нормальная» передача. На первых тестах я только видел, что все в порядке, но это медленнее, чем на SPI1.

Мадиас
Вт 19 апреля 2016 г. 6:16
Спасибо за совет с более медленным SPI2, я постараюсь опустить разделитель.
Я пришел к другой проблеме, но это принадлежит почти каждой библиотеке с SPI:
Предположим, что у вас есть два устройства SPI на одном порту:
Сенсорный контроллер (xpt2046 в качестве примера)
ILI9341
ILI9341 работает с низким перегородкой (SetClockDivider (2))
XPT2046 нуждается в по крайней мере SetClockDivider (4) (если не 8)
Таким образом, в обеих библиотеках вам нужна строка setclockdivider () перед каждым выполнением SPI.
(Приведенный выше пример является плохим примером, потому что я не использую библиотеку SPI XPT2046, но Utouch -> http: // www.rinkydinkelectronics.com/библиотека.PHP?ID = 55 Эта либера

Rogerclark
Вт 19 апреля 2016 г., 9:52 утра
У меня есть проблемы с NRF905, а также на SPI с Div2, поэтому, поскольку у меня есть доска с NRF905 и ILI9341, мне просто нужно изменить разделитель SPI до и после того Div4)

Добавление призыва к изменению разделителя в каждом из кода ILI9341 (или LIB) NRF905, вероятно, немного замедлит ситуацию.

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

Мадиас
Вторник 19 апреля 2016 г., 10:30 утра
Поэтому я думаю, что это мудрый идея «объединить» устройства SPI с одним и тем же перегородом на определенной SPI:
Например: NRF и/или XPT2046 на SPI1 и ILI9341, SD-CARD, Winbond EEPROM'S ON SPI2
Наверняка было бы лучше использовать «высокоскоростные устройства SPI» на SPI1, но я не буду переписать библиотеку Radiohead (если кто -то код этого LIB код, знайте, что я имею в виду...)

Rogerclark
Вт 19 апреля 2016 г. 10:38 утра
Привет, Матиас

Я избегал использования Radiohead, так как он выглядит как огромное количество кода. Это, вероятно, займет годы до порта, и я только в конечном итоге использовал его 10%.

Я нашел простую библиотеку NRF905 и много взломал ее, чтобы заставить ее работать на STM32 (но, как это взлом, я не добавляю ее в качестве библиотеки, так как код теперь довольно грязный)

Но это работает нормально ;-)

Мадиас
Вторник 19 апреля 2016 12:25
Я также использую библиотеку Manicbug NRF24, кто -то разместил здесь время назад... Но это также черт "#ifdef" из -за сопутствующего (тоже) многих платформ. Я фанат легких отдельных библиотек для каждой платформы, я не вижу смысла в «поддержке всего» в одной либе.

Mrburnette
Вт 19 апреля 2016 г. 13:03
Мадиас написал: <...>
Я не вижу смысла в «поддержке всего» в одной либе.

STM32USER
Чт 18 января 2018 г., 7:04
@madias
Прежде всего, спасибо за библиотеку.

Я не мог отображать изображения на экране со следующими подключениями.

SPI работает на канале 1.
Я проверял соединения снова и снова, и экран остается белым.

#include "SPI.h" #include #include // STM32 DMA Hardware-specific library #define TFT_CS PB4 #define TFT_DC PA15 #define TFT_RST PB3 Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC, TFT_RST); // Use hardware SPI

Стивестронг
Чт 18 января 2018 г., 7:27 утра
@stm32user
Вы можете использовать библиотеку по умолчанию из репо Роджера (или моего), это была реализована возможность передать экземпляр SPI в качестве входного параметра в библиотеку.
Таким образом, вы можете определить, какой интерфейс SPI вы хотели бы использовать, а также частоту, если она отличается от 36 МГц: #include // no need to include SPI.h SPIClass mySPI(2); // use SPI2 Adafruit_ILI9341_STM tft(TFT_CS, TFT_DC, TFT_RST); void setup() { ... tft.begin(mySPI); // this will set the SPI clock to 36MHz. /* alternative: uint32_t frequency = 18000000; tft.begin(mySPI, frequency); */ ... }

STM32USER
Чт 18 января 2018 г. 11:19
@stevestrong Спасибо за ответ.

STM32USER
Чт 18 января 2018 г. 11:56 утра
#include "SPI.h" #include #include // STM32 DMA Hardware-specific library #define TFT_CS PB4 #define TFT_DC PA15 #define TFT_RST PB3 SPIClass mySPI(2); // use SPI2 Adafruit_ILI9341_STM tft(TFT_CS, TFT_DC, TFT_RST); void Setup(){ tft.begin(mySPI); tft.fillScreen(ILI9341_BLACK); }

Стивестронг
Чт 18 января 2018 12:17
Попробуйте это: #include #include #include #define TFT_CS PB4 #define TFT_DC PA15 #define TFT_RST PB3 SPIClass mySPI(2); // use SPI2 Adafruit_ILI9341_STM tft(TFT_CS, TFT_DC, TFT_RST); void setup() { Serial.begin(9600); while ( !Serial ); delay(1000); Serial.println("ILI9341 Test!"); tft.begin(); } void loop() { tft.fillScreen(ILI9341_BLACK); delay(1000); tft.fillScreen(ILI9341_RED); delay(1000); tft.fillScreen(ILI9341_GREEN); delay(1000); tft.fillScreen(ILI9341_BLUE); }

STM32USER
Чт 18 января 2018 12:21
Я использую Stlink
Этот код не сработал !

тфу.начать (myspi);
Я также пытался сделать

Стивестронг
Чт 18 января 2018 г. 13:45
Понятно, что он не работает, если вы используете Stlink и не определяете serial_usb.

Сколько лет вашей репозитории локальная копия?
Поскольку PB3/PB4/PA15 используются интерфейсом отладки, они ранее были зарезервированы для отладки и не доступны в качестве обычных выводов ввода -вывода.

С этот патч Эта проблема была решена, поэтому вы должны обновить локальную копию от GitHub.

А потом попробуйте это: #include #include #include #define TFT_CS PB4 #define TFT_DC PA15 #define TFT_RST PB3 SPIClass mySPI(2); // use SPI2 Adafruit_ILI9341_STM tft(TFT_CS, TFT_DC, TFT_RST); void setup() { tft.begin(); } void loop() { tft.fillScreen(ILI9341_BLACK); delay(1000); tft.fillScreen(ILI9341_RED); delay(1000); tft.fillScreen(ILI9341_GREEN); delay(1000); tft.fillScreen(ILI9341_BLUE); delay(1000); }

STM32USER
Чт 18 января 2018 г. 14:13
my @file wirish/stm32f1/wirish_debug.cpp void enableDebugPorts(void) { afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY); }

Стивестронг
Пн 22 января 2018 г., 9:48
Что если вы используете другие булавки в качестве контрольных булавок? Вы пробовали?

минимальный
Солнце 03 июня 2018 11:33
STM32USER

Кстати, вы работали ?.

минимальный
Пн 18 июня 2018 г., 4:51 утра
Я использую до даты официального репо с Arduino 1.85 // spi2 #define TFT_CS PB12 #define TFT_DC PB11 #define TFT_RST PB10 HardwareTimer pwmtimer(1); const int pwmOutPin = PA8; /*----------------ROTARY_ENCODER2 ----------------*/ // timer4 as encoder 1 #define CLK1 PB6 #define DT1 PB7 #define SW1 PB11 /*----------------ROTARY_ENCODER2 ----------------*/ // timer3 as encoder 2 #define CLK2 PA7 #define DT2 PA6 #define SW2 PB12

Стивестронг
Пн 18 июня 2018 г. 8:24 утра
Вы сопоставляете как TFT_CS, так и SW2 с PB12.
И TFT_DC и SW1 до PB11.

Проверьте еще раз, какие булавки вы наносите на карту, для какой функции.

РЕДАКТИРОВАТЬ
Это работает над моим чертежом: // spi2 #define TFT_CS PB12 #define TFT_DC PB11 #define TFT_RST PB10 //SPIClass SPI_2(2); // use SPI2 Adafruit_ILI9341_STM tft(TFT_CS, TFT_DC, TFT_RST); void blink(void) { digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); } void setup() { pinMode(LED_BUILTIN, OUTPUT); Serial.begin(); while (!Serial); delay(10); SPI.setModule(2); // use SPI2 tft.begin(SPI, 9000000); // set direct frequency value in MHz } void loop() { Serial.println(millis()); blink(); tft.fillScreen(ILI9341_BLACK); delay(250); tft.fillScreen(ILI9341_RED); delay(250); tft.fillScreen(ILI9341_GREEN); delay(250); tft.fillScreen(ILI9341_BLUE); delay(250); }

минимальный
Вт 19 июня 2018 г. 3:25 утра
Стивестронг

Большое спасибо, это сработало очень хорошо, я хотел бы просто желать, чтобы остальные мужчины «скорее всего, как я узнал здесь, в течение 2 лет, я сомневаюсь, что они когда -либо узнают, что дает», просто узнайте у своего великого Замечательный ум. Еще раз спасибо.

Я работаю над проектом, где у меня есть Lora SX1276 на SPI 1 и TFT ILI9341 на SPI2. с 2 линиями ввода/вывода для CS.

Когда я запускаю код на одном SPI, он работает, но когда я инициализации оба нет.

Есть ли способ, которым могут работать SPI ?