Кто-то любит пирожки, а кто-то - нет.
Я хотел всё написать про протокол DMX на STM32. Я всё же сделал это>< Протокол сей используется большей частью в освещении (в театрах и типа того) и подобных некритических к потерям пактов областям. Один пакет DMX содержит информацию о уровнях 512 каналов (0-255), посылается он 44 раза в секунду, если без перерывов.
В качестве физической линии используется стандарт RS-485 (дифференциальная линия), программно же это последовательный асинхронный протокол (UART) со скоростью передачи данных 250 кбит/сек с двумя стоповыми битами и без контроля чётности.

читать дальше

@темы: arm, программизмы, электроника, stm32f4discovery, stm32

Комментарии
06.09.2017 в 17:09

teplofizik, Zdrastvujte, nemnoga nejasno, kakimi funcijami otpravit znacenije dapustim "channal - 1 value - 255" ???? escio v programirovanije neocen prodvinut, nemogu razobrat, no skompilirevat udalos, pakety idut :)
06.09.2017 в 17:19

Кто-то любит пирожки, а кто-то - нет.
Jerioma, вот функция, где задаётся новое значение отправляемых данных:


dmx_Update копирует данные из передаваемого массива в буфер отправки. Индекс 0 массива — это первый канал DMX. И дальше по нарастающей. То есть чтоб задать первому каналу значение 255 надо написать вместо Buffer[0]++; Buffer[0] = 255. Если хотим, например, задать каналу 100 значение 123, то пишем: Buffer[99] = 123;
06.09.2017 в 20:10

Rabotajet, spasibo bolsoje :)
07.09.2017 в 22:31

teplofizik, Escio tupoj vopros, kak priniat sias ? :D

dmx_Init(uint32_t Port);
dmx_Receive(uint32_t Port);

tak my nastrajevajem


A v cikle uze kakto etoj komandoj prinimajem?

dmx_SetHandler(DMX, TDMXEvent Event, void * Handler);

Event i Handler cto tuda vpisyvat?
08.09.2017 в 11:11

Кто-то любит пирожки, а кто-то - нет.
Jerioma, dmx_SetHandler вызывается при инициализации один раз и говорит библиотеке, какие функции при каких событиях вызывать. Для приёма есть пример:
dmx_SetHandler(DMX, DMX_EVENT_ONRECEIVE, &test_onDMXReceive);

Когда будет принят пакет DMX, будет вызвана функция test_onDMXReceive:
static void test_onDMXReceive(const uint8_t * Data, uint16_t Length)
{

}
10.10.2017 в 09:27

teplofizik, здравствуйте! Поясните пожалуйста, как работает строка void (* onReceive)(uint8_t *, uint16_t) в структуре TDMXState. Это функция? Если функция, то не вижу ее самой.
10.10.2017 в 09:55

Кто-то любит пирожки, а кто-то - нет.
pvman123, это указатель на функцию формата void UserFunc(uint8_t* data, uint16_t length). Ему присваивается указатель на функцию, написанную пользователем библиотеки, с помощью функции dmx_SetHandler, и вызывается при получении данных. Если там 0, то не вызывается ничего.

Концепция callback, функций обратного вызова.
10.10.2017 в 10:20

Спасибо за ответ, примерно так и думал, но конструкция была до конца непонятной )
Еще вопрос, разбираю прием пакета, не увидел условия " Если нулевой байт равен нулю, то это пакет DMX". Вижу что в прерывании проверяется USART_ISR_RXNE, затем если также возвелся USART_ISR_FE, то States.Index = 0.
Если USART_ISR_FE не возвелся, то идет прием пакета, а условие по приему первого байта на равенство нулю, что то не увидел. Может подскажете где смотреть?
10.10.2017 в 20:35

Кто-то любит пирожки, а кто-то - нет.
pvman123, в dmx_Main, но, наверное, лучше это делать в другом месте.