Проблемы обработки ошибок по UART в stm32
Проблемы обработки ошибок по UART в stm32
Добрый вечер. Есть плата STM32VL Discovery. Делаю на ней мост.По UART передаю с компа данные, данные принимаются и передаются по SPI дальше и соответственно ответ от устройства принимаю по SPI и передаю по UART в компьютер.
UARTработает на 115200. В принципе программа работает при идеальных условиях(если посылка идет с компа на правильной скорости).Решил сделать обработчик ошибок по UART, если ошибка то просто пропускается байт и соответственно он не запихивается в SPI.
Возникла проблема, что при передаче например на другой скорости, умышленно передаю на 19200 например, то обработка работает как то через раз и не все байты отсекаются.Хотя ,например , на скорости 460800 все прекрасно отрабатывается.
Проект собран IAR 6.21.1. Использую UART1 прерывание по приему(данные в нем отправляю в SPI), SPI1(прерывание по приему,данные отправляются в UART). Может кто увидит где я накосячил. Спасибо
UARTработает на 115200. В принципе программа работает при идеальных условиях(если посылка идет с компа на правильной скорости).Решил сделать обработчик ошибок по UART, если ошибка то просто пропускается байт и соответственно он не запихивается в SPI.
Возникла проблема, что при передаче например на другой скорости, умышленно передаю на 19200 например, то обработка работает как то через раз и не все байты отсекаются.Хотя ,например , на скорости 460800 все прекрасно отрабатывается.
Проект собран IAR 6.21.1. Использую UART1 прерывание по приему(данные в нем отправляю в SPI), SPI1(прерывание по приему,данные отправляются в UART). Может кто увидит где я накосячил. Спасибо
- Вложения
-
- Repeater.rar
- (205.82 КБ) 210 скачиваний
Re: Проблемы обработки ошибок по UART в stm32
Код: Выделить всё
if(USART1->SR & (USART_SR_PE | USART_SR_FE | USART_SR_NE | USART_SR_ORE)){
temp = USART1->SR;
temp = USART1->DR;
temp = USART1->DR;
USART1->SR &= ~USART_SR_RXNE;PE,FE,NE,ORE чистятся вычиткой SR с последующей вычиткой DR.
Вычитка SR уже происходит в if ( ...) .
RXNE чистится вычиткой DR .
Итого :
Код: Выделить всё
if(USART1->SR & (USART_SR_PE | USART_SR_FE | USART_SR_NE | USART_SR_ORE)){
temp = USART1->DR;Re: Проблемы обработки ошибок по UART в stm32
Спасибо.То я подстраховаться так пытался. Поправил, но эффекта нет.Заметил что ставлю скорость больше передачи- все отлично, меньше чем 115200 - проскакивают байты(
Re: Проблемы обработки ошибок по UART в stm32
ХЗ я подобными извращениями не занимался .
Может стоит перенести на F0 , там USART более навороченный с Auto baud rate detection.
И еще - у тебя CMSIS старая , в новой одни хэдеры ...
Может стоит перенести на F0 , там USART более навороченный с Auto baud rate detection.
И еще - у тебя CMSIS старая , в новой одни хэдеры ...
Re: Проблемы обработки ошибок по UART в stm32
Спасибо.Шаблон с этим CMSIS как сделал давно, так и пользуюсь. Контроллер возможности нет менять( Буду пыхтеть дальше.
Re: Проблемы обработки ошибок по UART в stm32
При передаче на скорости отличной от ожидаемой некоторые символы (последовательности символов) вполне могут быть распознаны как нормальные, значение у них будет уже другое, но тем не менее. Введи понятие кадра, определи его границы, используй контрольную сумму и будет тебе счастье.
Re: Проблемы обработки ошибок по UART в stm32
Хотелось бы просто байт принял - байт отослал.Неужели мк не может отследить например ошибку кадра 100%?. Спасибо за совет.
Re: Проблемы обработки ошибок по UART в stm32
Зависит от конкретной аппаратной реализации, но 100% никогда не будет. Лень рисовать картинки, к примеру, значение 0xFF, переданное на скорости 9600, распознается как 0x7F приемником настроенным на скорость 19200. Включение проверки четности позволит отсеять некоторые "коллизии", но не все.
Так что если нужна близкая к 100% вероятность распознавания ошибки, то без усложнений не обойтись (довольно значительных по сравнению с "принял байт, передал байт", но тем не менее вполне реализуемых).
Так что если нужна близкая к 100% вероятность распознавания ошибки, то без усложнений не обойтись (довольно значительных по сравнению с "принял байт, передал байт", но тем не менее вполне реализуемых).
Re: Проблемы обработки ошибок по UART в stm32
Значит буду допиливать...