Пробую опрашивать rs485 по модбас, устройство /dev/ttyS7,
получаю ошибки при каждом обращении при любых настройках соединения и любом номере слейва. Опрашиваемое устройство обращения вроде видит, мигает диодом. Софт рабочий, проверено не раз на другом железе.
У rs485 есть driver enable, PB18, может нужно как то пин PB18 настраивать ?
Да, PB18 программно настроен в DTS нормально.
Запускались со сниффером, вроде разобрались, в чем ошибка.
У вас контакт enable рисивер в микросхеме rs485 всегда ON.
Получается, я делаю модбас исходящий мастер запрос, и его же получаю как входящий ответ... и он естественно ошибочный, по правилам модбас. Работаем через библиотеку libmodbus, она почти промышленный стандарт.
Сделали следущее: отпаяли контакт enable рисивер микросхемы от контактной площадки и соединили его соплёй с соседним контактом enable драйвер. Всё сразу заработало.
Вопрос, можно ли сделать тоже самое без перепайки, может программно ?
Доброго дня. Подскажите, пожалуйста.
Плата SK-A40i-NANO-2E. Использую UART3 и UART4, пины PI13 для UART3 и SPI1_CLK (PI17) для UART4в качестве управляющих сигналов DIR RS-485.
В dts добавляю:
&pio {
uart3_rs485_pin: uart3-rs485-pin {
pins = "PI13"; // пин для DIR UART3
function = "gpio_out";
drive-strength = <20>;
bias-disable;
};
uart4_rs485_pin: uart4-rs485-pin {
pins = "PI17"; // SPI1_CLK пин для DIR UART4
function = "gpio_out";
drive-strength = <20>;
bias-disable;
};
};
&uart3 {
pinctrl-names = "default";
pinctrl-0 = <&uart3_pg_pins>, <&uart3_rs485_pin>;
rts-gpios = <&pio 8 13 GPIO_ACTIVE_HIGH>; // Банк I (8), пин 13 (PI13)
linux,rs485-enabled-at-boot-time;
status = "okay";
};
&uart4 {
pinctrl-names = "default";
pinctrl-0 = <&uart4_ph_pins>, <&uart4_rs485_pin>;
rts-gpios = <&pio 8 17 GPIO_ACTIVE_HIGH>; // Банк I (8), пин 17 (PI17)
linux,rs485-enabled-at-boot-time;
status = "okay";
};
Правильно ли я делаю? Просто не нашел, где в DTS инициализируется SPI, чтоб отключить использование этого пина.
да - оба варианта отключат CAN и можно использовать его пины.
Чтобы использовать пин как gpio его не надо переключать самому - достаточно просто указать его.
Пины описывают когда надо использовать их как функцию периферийного контроллера, например tx/rx uart описаны, если бы rts использовался аппаратный его тоже надо было бы дописать, но в данном случае rts-gpios т.е. управляет им драйвер програмно через интерфейс gpio, так что описывать не надо.