|
|
  |
Управление потоком RTS/CTS, управление RTS/CTS на AT91sam7x256 |
|
|
|
Oct 20 2010, 08:35
|
Группа: Участник
Сообщений: 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’.
Если кто то делал что то подобное (я надеюсь не первый делаю такой вариант), помогите пожалуйста.
|
|
|
|
|
Oct 20 2010, 11:56
|

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
|
|
|
|
|
Oct 20 2010, 12:18
|
Гуру
     
Группа: Участник
Сообщений: 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 буфера солидные)...
|
|
|
|
|
Oct 20 2010, 13:52
|
Профессионал
    
Группа: Свой
Сообщений: 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 программно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|