rfujigaya
2021年10月7日 19時38分
お世話になっております。藤ヶ谷です。
Armadillo-640 の UART2 を使って、RS-485 にて機器との通信をしようとしています。
Armadillo と機器との間には、こちらで製作した拡張ボード(RS-422/RS-485 インターフェース IC)があり、
Armadillo の全二重通信を RS-485 の半二重通信に変換しています。
Armadillo から拡張ボードの DE 端子に繋いでおり、GPIO でソフトウェアで HI/LO を切り替えて送信制御をしておりましたが、
送信した後、機器から Armadillo への返答データがうまく受信できない場合があり解決策を探しています。
まさに別スレッドの「RS485の半二重シリアル通信について(https://armadillo.atmark-techno.com/forum/armadillo/6759)」と同じ状況ですので、
そちらのスレッドと同じように UART ドライバの RS485 機能を試したくカーネルをビルドしたのですが、送信ができていない状態です。
デバイスツリーを次の通り変更したのですが、適切な内容となっていますでしょうか?
<armadillo-640.dts> ※標準の dts ファイルに下記の記載を追記
&uart2 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart2>; rts-gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>; rs485-rts-active-high; rs485-enabled-at-boot-time; status = "okay"; }; (・・略・・) &iomuxc { (・・略・・) pinctrl_uart2: uart2grp { fsl,pins = < MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX 0x00008 MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX 0x1b0b1 MX6UL_PAD_NAND_DATA05__GPIO4_IO07 0x00008 >; }; (・・略・・) };
※ CON9-26 を拡張ボードの DE および !RE に接続しています。
※ 今回の回路構成では CTS に相当する端子を接続していませんので、
uart-has-rtscts は指定せず、RE 用のピン設定も不要との認識ですが合ってますでしょうか?
念のため「fsl,uart-has-rtscts;
」を追加して確認してもみましたが、
何回か送信処理した後、Armadillo 側のプログラムが応答なしとなりました。
※ 上記スレッドでは、DMA の無効化パッチの言及がありますが、
こちらの件でもパッチの効果はありそうでしょうか?
ベースの imx.c が異なっているようで適用できておりません。
よろしくお願いいたします。
コメント
rfujigaya
お世話になります。藤ヶ谷です。
ご返答ありがとうございます。
dts ファイルを修正してみましたが、やはり送信できませんでした。
プログラムでエラーとなったため、次の手順でも確認しましたが Armadillo から送信されていないように見えますがいかがでしょうか?
<確認内容>
・通信設定
# stty -F /dev/ttymxc1 raw -echo 19200 cs8 parenb -parodd -cstopb crtscts
・データ送信
# echo -n "20" >/dev/ttymxc1
⇒ コマンド実行後、数秒ブロックされてシェルに応答が戻る。
・送信バイト数を確認
# cat /proc/tty/driver/IMX-uart serinfo:1.0 driver revision: 0: uart:IMX mmio:0x02020000 irq:18 tx:7369 rx:1 brk:1 RTS|DTR|DSR|CD 1: uart:IMX mmio:0x021E8000 irq:52 tx:0 rx:0 DSR|CD 2: uart:IMX mmio:0x021EC000 irq:53 tx:0 rx:0 4: uart:IMX mmio:0x021F4000 irq:54 tx:0 rx:0 DSR|CD
⇒ ttymxc1 の tx は 0 のまま変わらず。
⇒ 送信されていないように見受けられます。
※ echo -n "20" >/dev/ttymxc1
が実行されている間に
IMX-uart を確認すると、フラグが DTR|DSR|CD となっており、
コマンドが終了するとまた、DSR|CD に戻ります。
※ echo コマンドが実行されている間も終了した後も、
CON9-26 の電圧をテスターで測ったところ LO(0V 付近)のままのようです。
<armadillo-640.dts(修正後)> ※標準の dts ファイルに下記の記載を追記
&uart2 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart2>; uart-has-rtscts; rts-gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>; rs485-rts-active-high; rs485-enabled-at-boot-time; rs485-rts-on-send; status = "okay"; }; (・・略・・) &iomuxc { (・・略・・) pinctrl_uart2: uart2grp { fsl,pins = < MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX 0x00008 MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX 0x1b0b1 MX6UL_PAD_NAND_DATA05__GPIO4_IO07 0x00008 >; }; (・・略・・) };
>> ※ 上記スレッドでは、DMA の無効化パッチの言及がありますが、
>> こちらの件でもパッチの効果はありそうでしょうか?
>> ベースの imx.c が異なっているようで適用できておりません。
>
>そちらは、linux-4.9-atの不具合であり、Armadillo-640で使用している
>linux-4.14-atでは問題ありませんので、パッチを適用して頂く必要はありま
>せん。
DMA のパッチ不要の旨承知いたしました。
at_akihito.irie
rfujigaya
at_akihito.irie
rfujigaya
お世話になっております。藤ヶ谷です。
通信設定を次の通り、「crtscts」の指定を削除しましたところ、送信・受信ともにできました。
ありがとうございました。
・通信設定
# stty -F /dev/ttymxc1 raw -echo 19200 cs8 parenb -parodd -cstopb
・送信バイト数を確認
# cat /proc/tty/driver/IMX-uart serinfo:1.0 driver revision: 0: uart:IMX mmio:0x02020000 irq:18 tx:7433 rx:1 brk:1 RTS|DTR|DSR|CD 1: uart:IMX mmio:0x021E8000 irq:52 tx:280 rx:105 DSR|CD 2: uart:IMX mmio:0x021EC000 irq:53 tx:0 rx:0 4: uart:IMX mmio:0x021F4000 irq:54 tx:0 rx:0 DSR|CD
⇒ ttymxc1 の tx、rx 共にカウントされている。
相手先機器でも受信インジケータが点灯しており、想定通りの通信ができていることを確認できました。
at_akihito.irie
2021年10月12日 14時49分
入江です。
> デバイスツリーを次の通り変更したのですが、適切な内容となっていますでしょうか?
DEがactive highならば、rs485-rts-on-sendが必要であり、
DEがactive lowならば、rs485-rts-after-sendが必要です。
> ※ 今回の回路構成では CTS に相当する端子を接続していませんので、
> uart-has-rtscts は指定せず、RE 用のピン設定も不要との認識ですが合ってますでしょうか?
uart-has-rtsctsは必要です。
> ※ 上記スレッドでは、DMA の無効化パッチの言及がありますが、
> こちらの件でもパッチの効果はありそうでしょうか?
> ベースの imx.c が異なっているようで適用できておりません。
そちらは、linux-4.9-atの不具合であり、Armadillo-640で使用している
linux-4.14-atでは問題ありませんので、パッチを適用して頂く必要はありま
せん。