https://disk.yandex.ru/d/oo45QorV5BC5ow
(Новую сбросил, та не работает)
Эдуард, плата на контроллере STM32H743VIT6 (ссылка)
Экран (ссылка)
Подключения: шина spi2, выводы DC, RS и CS обозначены в файле (gc9a01a.h)
Файл инициализации от контроллера экрана "gc9a01a", с ним работает. Инициализация spi в двух местах добавлены "костыли", чего они делают не знаю но без них не работает.
Криво, но заработало. Будет "прямо" если вызов "повесить" на прерывание, что бы время не тратить )
По разбирался немного с темой "Указатели на функции" )
Переделал подпрограмму вывода на экран (через DMA). "Засунуть" бы эту функцию в прерывания. Но не понимаю (по крайней мере пока) почему не получается указывать (да и вообще вызывать) ScreenBuff из любой другой подпрограммы ? Даже если её указать, при прорисовке изображения экран чёрный, как будто буфер пустой ?
void GC9A01A_Update() { //static uint16_t ScreenBuff [GC9A01A_Height * GC9A01A_Width]; //uint16_t *pBuff; GC9A01A_SetWindow(0, 0, GC9A01A_Width - 1, GC9A01A_Height - 1); DC_HIGH(); CS_LOW(); uint32_t len = GC9A01A_Width * GC9A01A_Height; //SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) ScreenBuff, len, SendPart2); // uint16_t // (uint8_t*) & ScreenBuff[240*130] - это начальная точка вывода массива //----------------------------------- /* // 240x260 SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[0], 240*130, 0); while(!dma_spi_fl) ; //dma_spi_fl = 1; dma_spi_fl = 0; SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[240*65], 240*130, 0); while(!dma_spi_fl) ; //dma_spi_fl = 1; dma_spi_fl = 0; SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[240*130], 240*130, 0); while(!dma_spi_fl) ; //dma_spi_fl = 1; dma_spi_fl = 0; SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[240*195], 240*130, 0); //while(!dma_spi_fl) ; //dma_spi_fl = 1; //dma_spi_fl = 0;*/ // 240x280 SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[0], 240*140, 0); while(!dma_spi_fl) ; //dma_spi_fl = 1; dma_spi_fl = 0; SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[240*70+1], 240*140, 0); while(!dma_spi_fl) ; //dma_spi_fl = 1; dma_spi_fl = 0; SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[240*140+1], 240*140, 0); while(!dma_spi_fl) ; //dma_spi_fl = 1; dma_spi_fl = 0; SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[240*210+1], 240*140, 0); }
@aleksej-6 Привет.
Посмотрел я код. Я ничем помочь в этом случае не могу.
Этот код с Narodstream. Я вам советую бежать от этого сайта как от огня.
Он выдаёт много инфы, зачастую неправильную. Его примеры, по большей части, работают только у него.
Делает много непростительных ляпов.
Я делаю драйвера для всего на классах. Так намного удобнее. На этот дисплей у меня есть драйвера.
Переписывать под HAL у меня нет времени.
Если заинтересует программирование на классах, на этом сайте в блогах есть статьи, как всё это делается с нуля.
Для этого МК ядра нет, но начать писать его не так и сложно.
Эдуард хорошо, пока оставлю свою библиотеку в таком виде. Потихоньку попробую разбираться с "классами"
Доброго времени !
Эдуард а вы не разбирались с spi на stm32h743 ? Через регистры передача у меня идёт, а на получение ничего не выходит (даже тактирование по sck нету на приём)...
@aleksej-6 Привет.
Нет ещё. Возьмите мой драйвер от F4xx.
Там практически всё одинаково.
Может только придётся некоторые регистры подправить. И тактирование там по другому сделано.
Написание дров по этот чип я только начал. Сейчас с тактированием RCC разбираюсь.
На F4 у меня есть программа, на H7 названия регистров переправить то не проблема...
Второй день сижу, толку 0
@aleksej-6 Тактирование там сложное. Может в этом проблема.
Нужно под отладчиком смотреть. Все ли регистры правильно пишутся.
Шаги:
1. Подать тактирование на порт в котором используются выводы SPI.
2. Включить альтернативную функцию нужных выводов. Список смотрим в даташите.
3. Подать тактирование на SPI. Проверить под отладчиком, что тактирование подано. Это будет видно. Регистры SPI обнулены. При подаче тактирования, некоторые регистры будут изменены.
4. Включить SPI в нужный режим.
Так же тактирование можно проверить записав в какой нибудь регистр, используемый для настройки, какое либо значение, если изменится, тактирование есть, если не изменится, нет.
while (!(SPI1->SR & SPI_SR_TXP)); // Ждать завершения передачи *(volatile uint16_t *) &(SPI1->TXDR) = address; while(!(SPI1->SR & SPI_SR_RXP)); // Ждать завершения приёма rf_data = *(volatile uint16_t *) &(SPI1->RXDR);
Передача идёт, а с приёмом ерунда какая то.
При такой записи ответ от ведомого устройства идёт но принимается не верно.
Не могу понять как выставить правильно "DSIZE", что бы настроить верное срабатывание RXP флага. Как настроить FTHLV[3:0] в регистре SPI_CFG1 ...
Необходимо выставлять размеры отправляемых данных, что бы правильно срабатывал флаг RXP на приём данных..
Криво, но по крайней мере знаю что на H7 spi может "физически" работать )
Чтение и отправка идёт через буфер, надо понять как правильно его настроить...
// передача while (!(SPI1->SR & SPI_SR_TXP)); *(volatile uint16_t *) &(SPI1->TXDR) = addres; // приём while (!(SPI1->SR & SPI_SR_RXP)); // Ждать завершения приёма rf_data = *(volatile uint8_t *) &(SPI1->RXDR); rf_data = *(volatile uint8_t *) &(SPI1->RXDR);
Я ещё с тактированием разбираюсь.
Что то в этом коде глаз режет.
Почитайте статью. Может поможет.
Обратите внимание на ожидание приёма.