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

 
 
> STM32F0 и FT232, Flow Control работает не так как ожидалось.
Wasserati
сообщение Aug 30 2017, 07:52
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 1-06-13
Пользователь №: 77 044



Есть МК STM32F030C8 подключенный к ПК через FT232.
Настройки USART: 8 бит данных, 2 стоп бита, скорость - 3М, RTS/CTS включены.

Чего я ожидал от Flow Control.
USART принимает байт, устанавливает флаг RXNE, устанавливает на выходе RTS 1. FT232 приостанавливает передачу пока на линии RTS не установится 0.

Что получается в действительности.
USART принимает байт, устанавливает флаг RXNE, устанавливает на выходе RTS 1. FT232 передает еще один байт, а уже потом приостанавливает передачу пока на линии RTS не установится 0. Как итог, USART ловит overrun ошибку. DMA, который работает с RX линией, по этой причине, периодически виснет.

Скриншот этой ситуации из лог. анализатора.
Прикрепленное изображение


1. Flow Control так и должен работать, или где-то есть ошибка?
2. Как избежать потери данных в этом случае? Вручную забирать данные из RX регистра, пока DMA неактивен?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Wasserati
сообщение Aug 30 2017, 13:53
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 1-06-13
Пользователь №: 77 044



Спасибо всем за советы.
Проблему пока что решил использовав кольцевой буфер.
Изначально я использовал более запутанную схему буферов, поэтому перезагрузка DMA занимала довольно много времени, за которое USART успевал принять 2 лишних байта и поймать overrun.

Неприятно что ST такую ситуацию не предусмотрело.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 30 2017, 18:05
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Wasserati @ Aug 30 2017, 16:53) *
Изначально я использовал более запутанную схему буферов, поэтому перезагрузка DMA занимала довольно много времени, за которое USART успевал принять 2 лишних байта и поймать overrun.

А какая у Вас системная частота? 1 МГц? Уже при паре десятков МГц тактовой 3 мкс должно с лихвой хватать на любые перезагрузки DMA.
А насчёт ST: более важно если бы оно предусмотрело возможность задания приоритета доступа к шине для DMA-контроллера выше чем у CPU. Это решило бы все проблемы.
"Неуспевание" перезагрузки DMA может быть следствие как раз например того, что CPU крутится в цикле в коде, находящемся в том же банке ОЗУ (или очень часто выбирает данные из этого банка) и без кеша. И имеет приоритет доступа к шине выше чем у DMA. Вследствие чего происходит постоянное обращение CPU к памяти и занятие им шины. Некоторые МК позволяют задать приоритеты доступа разных bus-master-ов к шине.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 10:15
Рейтинг@Mail.ru


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