CS дергать не нужно. При отправке команды выставляется DC, и при отправке данных наоборот. Этого хватает.
Еще у вас слишком запутана работа DMA, размазана по коду слишком тяжело отслеживать настройки периферии.
Отправку данных и команд с помощью DMA для служебной настройки пользы дают ноль, быстрее через SPI сливать.
DMA имеет резон на потоках. Лучше всего это иметь фреймбуфер в памяти ОЗУ, строить всю графику и сливать одним разом.
В общем случае чтение вообще не требуется.
Драйвер никуда не годиться, переписывать однозначно.
Посмотрите сравните работу заливки области, как это сделано у меня одной функцией.
Шрифт я у себя тоже ускорил, шрифт рисуется в буфере, а потом буфер сливается в нужный квадрат.
Шрифты у меня пропорциональные. Для генерации виндовых шрифтов написал утилиту для генерации подключаемого файла шрифта.
Так же можно и строки буферизировать, это дает хороший выигрыш в скорости.
CS нет необходимости дёргать, когда нет другой переферии на SPI. Зачем нужна библиотека, если работать будет только дисплей?
Хотя если работать с прерываниями, например от тача - CS передёргивается на него, пока читаем только.
DMA инициализируется в dma.c, пины для SPI и его параметры устанавливаются в core.c. - тут должно быть всё прозрачно, лучше - только через классы, но c++ = жир, пробовал =)
Да, есть одно потенциальное место, где можно не понять, что происходит с настройками DMA - это процедуры передачи/приёма.
Сначала при инициализации применяется функция определения параметров DMA по умолчанию, затем при передаче на 16бит данных например устанавливается битность, направление работы DMA и остальные параметры, меняющиеся в пределах работы библиотеки.
Сделано это таким образом, чтобы не делать при каждой транзакции повторную инициализацию - лишние такты процессора на дёргание полей структуры, а при DMA_DeInit() - не только это.
Про отправку команд согласен, через DMA делать - нет смысла, но отправка данных начиная с > 1 единицы уже должна давать прирост в скорости (инициализацию тоже ускорит).
Про буферизацию:
хранить весь фрейм не получится, RAMы не хватит.
Да и оно не особо нужно, по кускам отправляется вполне быстро.
Шрифт да, тоже планирую буферизовать построчно, отображать, если получится, максимально большими регионами.
Для чего нужно использованить чтение:
* отрисовка сложных и затратных примитивов - круг. Можно взять регион, на котором нужно будет сделать отрисовку, затем забить в нуужном месте буфер нужными пикселями, а потом пачкой отдать дисплею
* отрисовка PNGшек например с прозрачностью, полупрозрачностью
* отрисовка шрифта поверх сложного фона (без заливки фоном).
Ну и в итоге получаем, что переписывать нужно только отправку команд, а инициализацию режимов DMA отладить.
Ну и да, для отладки попробовать использовать SPI без DMA, чтобы исключить неправильность работы с DMA.
Тут дело еще в том что сильно не разбежишся с фантазиями, типо PNG, прозрачность и прочее. Упретесь в быстродействие, ОЗУ, ФЛЕШ микроконтроллера. Это не компьютер.
Ставить STM32F4 с 1мб? Так там уже дисплеи другие, параллельные и с аппаратным ускорением.
Поэтому на этом дисплее нужен как можно меньше размером драйвер, высоким быстродействием и самым необходимым API.
Самый танец пойдет когда нужно будет связывать с ОС все это в параллельных задачах.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
С PNG вроде как проблем не должно быть, если там не рисовать картины, так, иконки..
Формат PNG как раз предполагает построчное чтение. Даже отображение, если например схемы отображать, можно фигачить прям поцветно - быстро, правда не так эффективно =)
ОЗУ мониторить придётся, с инлайнами играться тоже..
Пока с включённой оптимизацией -O3 "ничего не работает" =)
Ещё вопрос: почему может не проходить инициализация дисплея на больших прескалерах?
На прескалере 2 всё норм, на прескалере 16 инициализация не проходит, а если врубить дебаг по USART - заводится
Может флаги обрабатываю не так? Или отправку делать нужно с проверкой флага до неё самой?
Hardware NSS некорректно работает с чтением. Нужно использовать software.
Для DMA вместо ожидания сброса переменной из прерывания нужно до сброса CS ждать, пока SPI воркает =)