Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Управление потоком RTS/CTS
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
SergeySpbRu
Добрый день!

Использую м/с 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’.

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


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

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


Согласен....
В моем предположении правильнее было бы вместо UART употребить HOST (MPU, MCU, etc.)
Т.е. хост должен перестать передавать данные в UART, а не UART в RS-232 (т.к. RTS/CTS никак не влияют на прием/передачу в самом UART,
а только отображаются в регистрах, по крайней мере в '550)
rx3apf
Цитата(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 буфера солидные)...
sergeeff
Цитата(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 программно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.