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

 
 
> Управление потоком RTS/CTS, управление RTS/CTS на AT91sam7x256
SergeySpbRu
сообщение Oct 20 2010, 08:35
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 22-10-09
Пользователь №: 53 129



Добрый день!

Использую м/с AT91sam7x256. Требуется принимать/передавать байты от PC по RS-232 с использованием протокола RTS/CTS.

Сначала сделал программное управление потоком, т.е. устанавливал сигнал RTS в ‘1’ (TTL на AT91sam7x256) когда входной буфер занят на 80%, но PC при неактивном сигнале CTS продолжала слать еще несколько байт с данными.

Вторым вариантом использовал пример ‘basic-usart-hw-handshaking-project’ IAR 5.4, там используется PDC с буфером 1 длинной байт, но при приеме каждого байта ‘скачет’ сигнал RTS на короткое время пока не вызовется функция ‘USART_ReadBuffer’.

Если кто то делал что то подобное (я надеюсь не первый делаю такой вариант), помогите пожалуйста.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
rezident
сообщение Oct 20 2010, 09:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Сигналы квитирования RTS/CTS являются "уведомительными", а не "запретительными". То бишь они не привязаны аппаратно к запрету/разрешению передачи потока в UART COM-порта ПК (там обычно клон или аналог 16С550 применяется). Поэтому (с учитом наличия FIFO) следует понимать: после выдачи "уведомления" с помощью RTS нужно быть готовым, что успеют "прилететь" еще несколько байт размером с FIFO передатчика.
Go to the top of the page
 
+Quote Post
Victor®
сообщение Oct 20 2010, 10:29
Сообщение #3


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Цитата(rezident @ Oct 20 2010, 12:30) *
Сигналы квитирования RTS/CTS являются "уведомительными", а не "запретительными". То бишь они не привязаны аппаратно к запрету/разрешению передачи потока в UART COM-порта ПК (там обычно клон или аналог 16С550 применяется). Поэтому (с учитом наличия FIFO) следует понимать: после выдачи "уведомления" с помощью RTS нужно быть готовым, что успеют "прилететь" еще несколько байт размером с FIFO передатчика.


По моему UART при получении CTS должен закончить передачу байта и остановиться в ожидании разрешения на передачу.


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Oct 20 2010, 10:35
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Victor® @ Oct 20 2010, 14:29) *
По моему UART при получении CTS должен закончить передачу байта и остановиться в ожидании разрешения на передачу.

Если в выходном FIFO еще что-то есть - вовсе не обязательно. А, возможно, байты уже лежат во входном (у применяемого камня есть хоть какой входной FIFO ?), тогда передатчик-то прекратит передавать, а с UART будут поступать. В любом случае, после деактивации RTS/CTS несколько байтов вполне имеют право пройти.
Go to the top of the page
 
+Quote Post
Victor®
сообщение Oct 20 2010, 11:56
Сообщение #5


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Цитата(rx3apf @ Oct 20 2010, 13:35) *
Если в выходном FIFO еще что-то есть - вовсе не обязательно. А, возможно, байты уже лежат во входном (у применяемого камня есть хоть какой входной FIFO ?), тогда передатчик-то прекратит передавать, а с UART будут поступать. В любом случае, после деактивации RTS/CTS несколько байтов вполне имеют право пройти.


Согласен....
В моем предположении правильнее было бы вместо UART употребить HOST (MPU, MCU, etc.)
Т.е. хост должен перестать передавать данные в UART, а не UART в RS-232 (т.к. RTS/CTS никак не влияют на прием/передачу в самом UART,
а только отображаются в регистрах, по крайней мере в '550)


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Oct 20 2010, 12:18
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Victor® @ Oct 20 2010, 15:56) *
В моем предположении правильнее было бы вместо UART употребить HOST (MPU, MCU, etc.)
Т.е. хост должен перестать передавать данные в UART, а не UART в RS-232 (т.к. RTS/CTS никак не влияют на прием/передачу в самом UART,
а только отображаются в регистрах, по крайней мере в '550)

Я не интересовался, как это реализовано в 16550, при таком раскладе да, только когда хост узнает, а в FIFO передатчика уже может лежать и все 16 байтов, соответственно, приемный буфер должен иметь солидный запас. При работе с FT232 деактивация квитирования прекращает передачу сразу, пролетает максимум то, что уже начало передаваться и что лежит в приемном FIFO (один, может быть, два байта,а иначе бы было тяжко, у FT232 буфера солидные)...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 20 2010, 13:52
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(SergeySpbRu @ Oct 20 2010, 12:35) *
Добрый день!

Использую м/с AT91sam7x256. Требуется принимать/передавать байты от PC по RS-232 с использованием протокола RTS/CTS.

Сначала сделал программное управление потоком, т.е. устанавливал сигнал RTS в ‘1’ (TTL на AT91sam7x256) когда входной буфер занят на 80%, но PC при неактивном сигнале CTS продолжала слать еще несколько байт с данными.

Вторым вариантом использовал пример ‘basic-usart-hw-handshaking-project’ IAR 5.4, там используется PDC с буфером 1 длинной байт, но при приеме каждого байта ‘скачет’ сигнал RTS на короткое время пока не вызовется функция ‘USART_ReadBuffer’.

Если кто то делал что то подобное (я надеюсь не первый делаю такой вариант), помогите пожалуйста.



Если вы отключите FIFO в свойствах COM-порта (на PC), то увидите, что все правильно заработает. Проблема в том, что RTS блокирует передачу данных портом, но не блокирует FIFO. Посему на Atmel'e установите normal mode для USART и сами отслеживайте потенциальное переполнение своего приемного буфера устанавливая/снимая RTS программно.
Go to the top of the page
 
+Quote Post

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

 


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


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