реклама на сайте
подробности

 
 
> STM32F103 и ч/б RGB интерфейс, реализация передачи ч/б изображения по RGB интерфейсу
Ruslan-maniak
сообщение May 14 2017, 05:52
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 27-12-12
Из: Томск
Пользователь №: 74 999



Приветствую, коллеги. Пытаюсь реализовать на STM32F103 поддержку RGB интерфейса (DATA[24], DataCLK, VSYNC, HSYNC, DataEN) для передачи изображения на матрицу матрицу hsd050idw1-a20. Изображение нужно только черно-белое (не градиент, а именно только черное и только белое), поэтому пытаюсь сделать аналогично данной статье. Также использую SPI для формирования сигналов DATA[24] и DataCLK. Остальные сигналы реализуются просто на GPIO. Длительность этапов отправки данных формируются размером ДМА. То есть сформировал сигналы задал размер дма и запустил его, в прерывании завершения отправки дма переключаю сигналы в новое положение, задаю новый размер дма и запускаю отправку. и т.д. Естественно при каждом таком переходе образуется небольшая пауза в тактировании DataCLK. Собственно код прерывания дма следующий :
CODE
void LcdSpiHandler (void)
{
while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE) == RESET);
while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_BSY) == SET);
switch(lcd->vState)
{
case(eLcdState_PULSE):
{
switch(lcd->hState)
{
case(eLcdState_PULSE):
{
GPIOSet(lcd->gpioHSync);
lcd->hState = eLcdState_BACK_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_BACK_PORCH):
{
lcd->hState = eLcdState_DATA;
DMASetCurrDataCounter(100, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_DATA):
{
lcd->hState = eLcdState_FRONT_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_FRONT_PORCH):
{
if(lcd->hNumber == 2)
{
GPIOSet(lcd->gpioVSync);
GPIOReset(lcd->gpioHSync);
lcd->vState = eLcdState_BACK_PORCH;
lcd->hState = eLcdState_PULSE;
lcd->hNumber = 0;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
}
else
{
GPIOReset(lcd->gpioHSync);
lcd->hNumber++;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
lcd->hState = eLcdState_PULSE;
DMACmd(ENABLE, lcd->spi->dmaTx);
}
break;
}
}
break;
}

case(eLcdState_BACK_PORCH):
{
switch(lcd->hState)
{
case(eLcdState_PULSE):
{
GPIOSet(lcd->gpioHSync);
lcd->hState = eLcdState_BACK_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_BACK_PORCH):
{
lcd->hState = eLcdState_DATA;
DMASetCurrDataCounter(100, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_DATA):
{
lcd->hState = eLcdState_FRONT_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_FRONT_PORCH):
{
if(lcd->hNumber == 28)
{
GPIOReset(lcd->gpioHSync);
lcd->vState = eLcdState_DATA;
lcd->hState = eLcdState_PULSE;
lcd->hNumber = 0;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
}
else
{
GPIOReset(lcd->gpioHSync);
lcd->hNumber++;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
lcd->hState = eLcdState_PULSE;
DMACmd(ENABLE, lcd->spi->dmaTx);
}
break;
}
}
break;
}

case(eLcdState_DATA):
{
switch(lcd->hState)
{
case(eLcdState_PULSE):
{
GPIOSet(lcd->gpioHSync);
lcd->hState = eLcdState_BACK_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_BACK_PORCH):
{
GPIOSet(lcd->gpioDe);
lcd->hState = eLcdState_DATA;
DMASetCurrDataCounter(100, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_DATA):
{
GPIOReset(lcd->gpioDe);
lcd->hState = eLcdState_FRONT_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_FRONT_PORCH):
{
if(lcd->hNumber == 479)
{
GPIOReset(lcd->gpioHSync);
lcd->vState = eLcdState_FRONT_PORCH;
lcd->hState = eLcdState_PULSE;
lcd->hNumber = 0;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
}
else
{
GPIOReset(lcd->gpioHSync);
lcd->hNumber++;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
lcd->hState = eLcdState_PULSE;
DMACmd(ENABLE, lcd->spi->dmaTx);
}
break;
}
}
break;
}

case(eLcdState_FRONT_PORCH):
{
switch(lcd->hState)
{
case(eLcdState_PULSE):
{
GPIOSet(lcd->gpioHSync);
lcd->hState = eLcdState_BACK_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_BACK_PORCH):
{
lcd->hState = eLcdState_DATA;
DMASetCurrDataCounter(100, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_DATA):
{
lcd->hState = eLcdState_FRONT_PORCH;
DMASetCurrDataCounter(5, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
break;
}
case(eLcdState_FRONT_PORCH):
{
if(lcd->hNumber == 12)
{
GPIOReset(lcd->gpioVSync);
GPIOReset(lcd->gpioHSync);
lcd->vState = eLcdState_PULSE;
lcd->hState = eLcdState_PULSE;
lcd->hNumber = 0;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
DMACmd(ENABLE, lcd->spi->dmaTx);
}
else
{
GPIOReset(lcd->gpioHSync);
lcd->hNumber++;
DMASetCurrDataCounter(6, lcd->spi->dmaTx);
lcd->hState = eLcdState_PULSE;
DMACmd(ENABLE, lcd->spi->dmaTx);
}
break;
}
}
break;
}
}
}


Но к сожалению так оно не взлетает. может есть способ как-то поумнее управлять сигналами управления, а не просто переключать в прерывании. К сожалению в вышеприведенной статье об этом не упоминается. Подскажите кто что думает.

Сообщение отредактировал IgorKossak - May 14 2017, 11:09
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение May 16 2017, 18:57
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



В коде из первого сообщения неверная полярность DE - он должен быть в '1' при активных данных. HS и VS вообще не нужны, работайте в DE-mode.
Go to the top of the page
 
+Quote Post
Ruslan-maniak
сообщение May 17 2017, 03:23
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 27-12-12
Из: Томск
Пользователь №: 74 999



Цитата(aaarrr @ May 17 2017, 01:57) *
В коде из первого сообщения неверная полярность DE - он должен быть в '1' при активных данных. HS и VS вообще не нужны, работайте в DE-mode.

В коде с полярностью все верно. По DE подается именно '1' когда передаются данные. Спасибо что натолкнули на DE mode. Не знал про него. Только в даташите на матрицу не указаны параметры для реализации этого режима.

Сообщение отредактировал Ruslan-maniak - May 17 2017, 03:50
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 17 2017, 07:05
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Ruslan-maniak @ May 17 2017, 06:23) *
Только в даташите на матрицу не указаны параметры для реализации этого режима.

Переведите HS и VS в третье стостояние, а DE управляйте как обычно - это и будет DE-mode.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th August 2025 - 17:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016