на основе imx8mmini evk. Хочу использовать uart1 для rs485. Использую только линии TX и RX. Слышала, что с помощью gpio можно как-то управлять флагом TX_EN, но нигде не могу найти информации. Это делается через dts или необходимо вносить изменения в драйвер? Еще вроде бы можно gpio повесить на rts-pin, но как я понимаю, это несколько иной способ?
Где подробности камрад? Судя по опискам, ты пытаешься из под линукса это делать
Если да - то тебе нужно или свой драйвер писать, который будет работать, и перед началом передачи ножкой дергать или использовать микросхему с автоопределением передачи и не делать себе больно
https://www.compel.ru/lib/54027 например. Гуглить отсюда и до нахождения такого же, но устраивающего по цене. Ключевое слово RS-485 Auto direction
для начала прочитать это: https://www.kernel.org/doc/Documentation/serial/serial-rs485.txt
Не знаю с чем именно вы там будете взаимодействовать, и возможно это не будет проблемой, но вообще в RS-485 весьма жёсткие требования по времени освобождения линии после завершения передачи: линию требуется освободить не более чем за время передачи одного бита для заданной скорости обмена после передачи последнего бита. На приличных скоростях это непросто даже на микроконтроллере, а уж из ядра... хм... поэтому есть риск что сигналом TX_EN вы не сможете управлять достаточно быстро. Но, опять же, зависит от задачи.
Есть ли поддержка в ядре? Я както начал этот вопрос изучать и отложил на моей плате в ядре не было поддержки. Такие дела только на уровне модулей ядра
А, ну и минутка саморекламы: берите плату stm32 bluepill на stm32f103c8t6, шейте туда вот это: https://github.com/r2axz/bluepill-serial-monster втыкайте в usb, цепляйте микросхемы трансиверов rs-485 и будет вам счастье. Причем в тройном размере.
А есть пруфы про длину бита? Я бы ожидал это требование от более высокого уровня
Я в своё время руководствовался вот этим app note: https://www.st.com/resource/en/application_note/cd00249778-managing-the-driver-enable-signal-for-rs485-and-iolink-communications-with-the-stm32s-usart-stmicroelectronics.pdf
Есть прецедент реализации RS-485 на iMX6. Полагаю, уарты в 6 и 8 одинаковы. Управляющий сигнал трансивера переключается с через GPIO на уровне драйвера. Могу только сказать, что это не работает там, где справляется конвертер из USB в RS на CH340/CP210x + трансивере. Вот ссылка для дальнейшего копания: https://community.nxp.com/t5/i-MX-Processors/Does-UART-in-RS485-mode-support-only-9-Bit-mode-for-i-MX6/m-p/699703#M108651
Да, прошивка linux собрана на основе проекта yocto. Я знаю, что сейчас используется max10 для преобразования напряжения и вместе с тем на плисе реализован конечный автомат, который всегда слушает линию tx. Соответвенно tx_en тоже сейчас управляется за счет конечного автомата. Остальная логика отрабатывает через драйвер ядра imx.c; Идея в том, чтобы избавиться от конечного автомата и реализовать это на уровне драйвера. Отдел электроники уже запрограммировал gpio на tx_en и плюсом для дебага накинул на диод. Тупыми запросами set_direction_outpu(gpio, value) у меня получилось оживить диод, что по сути означает что я могу управлять и tx_en. Вопрос в том, нужно ли писать драйвер с нуля или модифицировать тот, что используется? По идее сейчас все это дело работает на rs232, а хочется преобразовать в rs485.
Все же, я не понял, чем тебе вариант с autodirection не ок, если ты хочешь FSM выкинуть из корки. Только нежелательностью изменений в железе
Обсуждают сегодня