|
|
  |
Обработка USART в прерывании, когда их много |
|
|
|
Jan 30 2017, 07:27
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Ну, все как всегда - "Дело было не в бобине, раздолбай сидел в кабине") 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); и все зашевелилось
|
|
|
|
|
Feb 1 2017, 07:16
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(toweroff @ Feb 1 2017, 08:23)  Конечно, флаг PE молчит При нарушении фрейма до четности дело не доходит. Так что: 1) Проверяете установки четности и разрядости. 2) два стопбита на передающей стороне установите для поверки. Цитата(uriy @ Feb 1 2017, 06:48)  Биты четности и стоп биты одинаково настроены на приемнике и передатчике? Стопбиты относятся только к передатчику, так что говорить об одинаковости настроек не приходится вообще.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 1 2017, 07:42
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Цитата(zltigo @ Feb 1 2017, 10:16)  Стопбиты относятся только к передатчику, так что говорить об одинаковости настроек не приходится вообще. Framing error на приемнике как раз и сигнализирует, что во время стоп-битового интервала начался новый фрейм. Это может быть следствие как разных настроек количества стоп-битов, так и разных скоростей. Поэтому, когда на передаче задано 2 стоп-бита, а на приеме один - работать будет, а вот наоборот не всегда.
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Feb 1 2017, 12:07
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Цитата(uriy @ Feb 1 2017, 14:59)  Почти согласен, но по-моему в обратную сторону никогда работать не будет. Отчего же, если пауза между фреймами более 1 битового интервала, то работать будет - приемник воспримет эту паузу как продолжение стоп-бита, только и всего.
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Feb 1 2017, 14:14
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(gerber @ Feb 1 2017, 14:07)  Отчего же, если пауза между фреймами более 1 битового интервала, то работать будет - приемник воспримет эту паузу как продолжение стоп-бита, только и всего. Именно так. "Стоп" это гарантированная минимальная пауза между посылками для компенсации разбега скоростей. Максимальная абсолютно любая, хоть 100 лет по времени. Так что если UART работает с одним стопом, то будет работать и с полутора и с двумя и с 200000000 в любых комбинациях.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|