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

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


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

Группа: Участник
Сообщений: 84
Регистрация: 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
Эдди
сообщение May 14 2017, 06:22
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 550
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



А если FSMC использовать? Или на крайняк ногодрыг через DMA?
И да, для начала попробуйте просто повыкидывать все библиотечные функции из тела обработчика прерывания. Переключайте напрямую регистрами. Я с этой проблемой столкнулся, когда 1-wire делал. Если вызывать функции (я тогда opencm3 пользовался), то получались заметные выбросы, а если делать по-человечески, все было четко.

Сообщение отредактировал Эдди - May 14 2017, 06:24


--------------------
Я: на гитхабе, на stackexchange, в ЖЖшке
--------------------------------
In the world, only two things are the worst: Windows and Poettering.
Go to the top of the page
 
+Quote Post
Ruslan-maniak
сообщение May 15 2017, 02:57
Сообщение #3


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

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



Цитата(Эдди @ May 14 2017, 13:22) *
И да, для начала попробуйте просто повыкидывать все библиотечные функции из тела обработчика прерывания. Переключайте напрямую регистрами.

Переход на работу с регистрами к сожалению не исправил положение. FSMC тоже вряд ли поможет, там ведь также придется отдельно работать с сигналами управления. Остается попробовать ногодрыг через дма.
Go to the top of the page
 
+Quote Post
Ruslan-maniak
сообщение May 15 2017, 12:34
Сообщение #4


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

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



А может кто-нибудь поделиться примером ногодрыга из дма по таймеру? Адекватных работающих примеров я не нагуглил.
Go to the top of the page
 
+Quote Post
Ruslan-maniak
сообщение May 16 2017, 16:45
Сообщение #5


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

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



Соорудил все на ногодрыге из дма по таймеру. Но все равно матрица ничего не выдает. Такое ощущение что она вообще не воспринимает сигналы с стм. То есть без разницы включаю я питание и подаю сигналы или просто включаю питание логики без сигналов - реакция матрицы идентична: появляются некоторые вертикальные цветные линии. К сожалению нет под рукой логического анализатора, но то что можно увидеть по осцилографу - все как по даташиту матрицы.

Сообщение отредактировал Ruslan-maniak - May 16 2017, 16:46
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 16 2017, 18:57
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 125
Регистрация: 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
Сообщение #7


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

Группа: Участник
Сообщений: 84
Регистрация: 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
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 125
Регистрация: 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
Ruslan-maniak
сообщение May 17 2017, 08:14
Сообщение #9


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

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



Цитата(aaarrr @ May 17 2017, 14:05) *
Переведите HS и VS в третье стостояние, а DE управляйте как обычно - это и будет DE-mode.

Третье состояние - это оставить в воздухе? Все так и сделал. Глянул осцилом - все как надо. Но все равно результат не изменился. Надо искать логический анализатор.
Go to the top of the page
 
+Quote Post
Ruslan-maniak
сообщение May 17 2017, 18:14
Сообщение #10


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

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



Оказалось что сигнал клока не заходил в шлейф. Исправил. Теперь в DE mode все работает как надо.
Go to the top of the page
 
+Quote Post

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

 


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


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