toweroff 1 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба Боярины, вот ведь какая затыка вышла Со всякими STM вроде как работало, но огульный (почти) копипаст ввел в ступор. Несколько UART на одном прерывании (с 3 по 8) сколько видел примеров - оно вот так (явно для одного): Функция передачи 1. Смотрим на шайтан-флаг, если нормально: пишем в регистр, устанавливаем флаг прерывания. Если нет - кладем в буфер(если есть, куда положить). Шайтан-флаг в "мы запендюрили". Вернуни ок/плох Прерывание 1. Есть в буфере? Отлично, отправляем. 2. Буфер пуст? Шайтан-флаг взлетел. Запретили прерывание у меня каждый USART со своими буферами описан, унифицированно но вот хрень - у какого-то USART закончилась очередь передачи - так он из той же уни-функции и запретит прерывание остальным пните ногой у кого есть, сегодня совсем день тяжелый... победить быстро нужно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба но вот хрень - у какого-то USART закончилась очередь передачи - так он из той же уни-функции и запретит прерывание остальным Запрещать надо не общее прерывание, а прерывание по TXE данного UART-а. Думаю, что такой флаг обязан быть, если несколько UART-ов на одном прерывании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 29 января, 2017 Опубликовано 29 января, 2017 · Жалоба Ваш шайтан-флаг фактически есть инверсия TXEIE. Функция передачи 1. кладем в буфер, TXEIE = 1 (разрешаем прерывания от TXE) Прерывание 1. RXNE установлен? 1.1 кладем принятый байт во входной буфер 2. TXE установлен? 2.1 Есть в буфере? Отлично, отправляем. 2.2 Буфер пуст? TXEIE=0, запретили прерывание Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 29 января, 2017 Опубликовано 29 января, 2017 · Жалоба А надо ли вам вообще эти прерыания? Что насчет DMA? На прием DMA в circular mode и проверять буффер либо по таймеру либо когда делать нечего либо по IDLE. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 30 января, 2017 Опубликовано 30 января, 2017 · Жалоба Ну, все как всегда - "Дело было не в бобине, раздолбай сидел в кабине") AHTOXA, у меня и выключался/включался TXEIE, тут порядок. Что-то я зациклился на этом общем прерывании, но флаги-то эти разные для каждого USART SSerge, а ведь и правда. Переделал, спасибо. Кусок, похоже, тянулся от LPC, там такой фокус не получался, насколько я помню uriy, спасибо за наводку. Почитаю DMA а дело было в том, что функция передачи, если буфер полон, сидела и ждала сигнала от прерывания, что в буфере есть место if (COM_BUF_FULL_OUT(*COM)) { osSignalWait(TASK_USART_TRSMT_FLAG, osWaitForever); } так просто банально задачу-то, которая должна схватить флаг, я не указывал :) if (COM_BUF_FULL_OUT(*COM)) { COM->taskT = osThreadGetId(); osSignalWait(TASK_USART_TRSMT_FLAG, osWaitForever); } ну и в прерывании, соответственно if (COM->taskT != 0) osSignalSet(COM->taskT, TASK_USART_TRSMT_FLAG); и все зашевелилось Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 31 января, 2017 Опубликовано 31 января, 2017 · Жалоба Не буду новую тему плодить, спрошу здесь Постоянно (процентов 90-95%) при приеме ловлю флаг FE (ISR, Bit 1 FE: Framing error) UART->BRR = APB/baudrate Тестовые условия -USB-232, который постоянно мне шлет короткие посылки по 5 байт на 9600 8E1 ST3232 с 0.1мкФ емкостями Осциллом увидеть сейчас не могу, но хоть в какую сторону посмотреть, что проверить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 1 февраля, 2017 Опубликовано 1 февраля, 2017 · Жалоба Биты четности и стоп биты одинаково настроены на приемнике и передатчике? Купите вот эту штуку вместо осцила https://www.aliexpress.com/item/New-USB-SAL...f2-622949730f91 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 1 февраля, 2017 Опубликовано 1 февраля, 2017 · Жалоба Биты четности и стоп биты одинаково настроены на приемнике и передатчике? Конечно, флаг PE молчит Купите вот эту штуку вместо осцила https://www.aliexpress.com/item/New-USB-SAL...f2-622949730f91 Видел такую. Но нацелился на другой вартант, там внутренней памяти больше и триггерные события можно задавать поинтереснее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 1 февраля, 2017 Опубликовано 1 февраля, 2017 · Жалоба Конечно, флаг PE молчит При нарушении фрейма до четности дело не доходит. Так что: 1) Проверяете установки четности и разрядости. 2) два стопбита на передающей стороне установите для поверки. Биты четности и стоп биты одинаково настроены на приемнике и передатчике? Стопбиты относятся только к передатчику, так что говорить об одинаковости настроек не приходится вообще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 1 февраля, 2017 Опубликовано 1 февраля, 2017 · Жалоба Стопбиты относятся только к передатчику, так что говорить об одинаковости настроек не приходится вообще. Framing error на приемнике как раз и сигнализирует, что во время стоп-битового интервала начался новый фрейм. Это может быть следствие как разных настроек количества стоп-битов, так и разных скоростей. Поэтому, когда на передаче задано 2 стоп-бита, а на приеме один - работать будет, а вот наоборот не всегда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 1 февраля, 2017 Опубликовано 1 февраля, 2017 · Жалоба Поэтому, когда на передаче задано 2 стоп-бита, а на приеме один - работать будет, а вот наоборот не всегда.Почти согласен, но по-моему в обратную сторону никогда работать не будет. Для STM оказывается можно даже задавать половинную длительность стоп бита. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 1 февраля, 2017 Опубликовано 1 февраля, 2017 · Жалоба Почти согласен, но по-моему в обратную сторону никогда работать не будет. Отчего же, если пауза между фреймами более 1 битового интервала, то работать будет - приемник воспримет эту паузу как продолжение стоп-бита, только и всего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 1 февраля, 2017 Опубликовано 1 февраля, 2017 · Жалоба В общем воткнул в аппаратный COMport - никаких ошибок. Китайский шнур выбросил в помойку Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 1 февраля, 2017 Опубликовано 1 февраля, 2017 · Жалоба Отчего же, если пауза между фреймами более 1 битового интервала, то работать будет - приемник воспримет эту паузу как продолжение стоп-бита, только и всего. Именно так. "Стоп" это гарантированная минимальная пауза между посылками для компенсации разбега скоростей. Максимальная абсолютно любая, хоть 100 лет по времени. Так что если UART работает с одним стопом, то будет работать и с полутора и с двумя и с 200000000 в любых комбинациях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться