Armadilloフォーラム

RS01(RS485 AddonModule) のフロー制御

abem

2015年5月11日 21時59分

お世話になっております。
阿部と申します。

Armadillo-IotとRS01(RS485 AddonModule)の組み合わせで使用しているのですが、
RS485(全二重)で使用した時のデータ非送信時のRTS信号は通常はLoだと思いますが、
データ非送信時もRTS信号をHiに固定する(ドライバを常に駆動する)方法はございますでしょうか。

コメント

溝渕です。

> RS485(全二重)で使用した時のデータ非送信時のRTS信号は通常はLoだと思いますが、
> データ非送信時もRTS信号をHiに固定する(ドライバを常に駆動する)方法はございますでしょうか。

データ受信を正常に行うことができなくなりますが、問題ありませんか?

以下3行をコメントアウトし、

drivers/serial/mxc_uart.c:
static int mxcuart_rs485_config(struct uart_port *port,
                                struct serial_rs485 *rs485)
{
    :(省略)
        /* if ((!!(rs485->flags & SER_RS485_RTS_ON_SEND)) == */
        /*     (!!(rs485->flags & SER_RS485_RTS_AFTER_SEND))) */
        /*      return -EINVAL; */

製品マニュアルに記載の RTS_ON_SEND, RTS_AFTER_SEND 両方に"1"を設定する
と RTS を High に固定できると思います。

http://manual.atmark-techno.com/armadillo-iot/armadillo-iotg-std_produc…

以上、お試しください。

溝渕です。

一点訂正させてください。

> データ受信を正常に行うことができなくなりますが、問題ありませんか?

上記、半二重通信の場合です。質問文を読み違えてしまい申し訳ございません。

前述の手順でも、全二重通信の場合はデータ受信に影響はありません。

ただし、マルチドロップ接続で Armarillo-IoT と出力信号を共有している機器
のデータ送信は正常に行うことができません。

以上です。

阿部です。
早速のご回答有難うございました。

カーネル修正とRS485のパラメータ設定でRTSラインが常にHiレベルに固定されていることを確認しました。

> ただし、マルチドロップ接続で Armarillo-IoT と出力信号を共有している機器
> のデータ送信は正常に行うことができません。

Armadilloのみが出力(TX)ラインを駆動できるシステムとなりますので問題ありません。
今回のシステムとしては相手機器の仕様でレシーバがフェールセーフに未対応の為、
ドライバ側がDisableになるとレシーバ側の終端抵抗を経由して受信差動間の電位差が0Vになり、
スタートビットをうまく検出できない時があるので今回の対策が必要でした。

阿部と申します。
 以前、Armadillo-Iot用アドオンボードRS01のRTS信号の常時ONについて質問させていただきました。
 今回Armadillo-Iot(G2) LinuxKernel3.1.4 -at*とRS01の組み合わせて同等の事を実現させようとしておりますが
 ドライバソースファイルの構成が変更されているようで、どの部分を変更すれば良いかご教示頂けますでしょうか。
 以上、よろしくお願い致します。

> 溝渕です。
>
> > RS485(全二重)で使用した時のデータ非送信時のRTS信号は通常はLoだと思いますが、
> > データ非送信時もRTS信号をHiに固定する(ドライバを常に駆動する)方法はございますでしょうか。
>
> データ受信を正常に行うことができなくなりますが、問題ありませんか?
>
>
> 以下3行をコメントアウトし、
>
>

> drivers/serial/mxc_uart.c:
> static int mxcuart_rs485_config(struct uart_port *port,
>                                 struct serial_rs485 *rs485)
> {
>     :(省略)
>         /* if ((!!(rs485->flags & SER_RS485_RTS_ON_SEND)) == */
>         /*     (!!(rs485->flags & SER_RS485_RTS_AFTER_SEND))) */
>         /*      return -EINVAL; */
> 

>
> 製品マニュアルに記載の RTS_ON_SEND, RTS_AFTER_SEND 両方に"1"を設定する
> と RTS を High に固定できると思います。
>
> http://manual.atmark-techno.com/armadillo-iot/armadillo-iotg-std_produc…
>
> 以上、お試しください。
>

溝渕です。

>  以前、Armadillo-Iot用アドオンボードRS01のRTS信号の常時ONについて質問させていただきました。
>  今回Armadillo-Iot(G2) LinuxKernel3.1.4 -at*とRS01の組み合わせて同等の事を実現させようとしておりますが
>  ドライバソースファイルの構成が変更されているようで、どの部分を変更すれば良いかご教示頂けますでしょうか。

LinuxKernel3.14 -at*のUARTドライバでは、RTS_[ON|AFTER]_SENDの論理が同一であった場合の排他処理を行っていません。

そのため、恐らくRS485の通信設定を行うだけで目的を達成できると思います。

通信設定の変更手順はマニュアルの次の場所をご参照ください。
http://manual.atmark-techno.com/armadillo-iot/armadillo-iotg-std_produc…

注記で、「flagsのRTS_ON_SENDとRTS_AFTER_SENDは初期値を変更しないでください」とありますが、阿部様の用途の場合は問題ありません。

以上、ご確認ください。

溝渕様
御連絡有難うございます。

早速、RS485の設定を行い、RTSラインとTxラインの波形を確認してみました。
結果的にはRTSラインが送信時にHiレベル、未送信時はLoレベルとなっておりました。
RS01のDipSW設定は1(OFF),2(OFF),3(ON)です。

カーネル起動オプション設定
setenv console=ttymxc1,115200 mxc_uart.rs485_uart1=0x17,0,0

ブート時のログ抜粋と波形を添付いたします。

上記設定内容で合っていますでしょうか。
恐れ入りますがご確認をお願い致します。

阿部

> 溝渕です。
>
> >  以前、Armadillo-Iot用アドオンボードRS01のRTS信号の常時ONについて質問させていただきました。
> >  今回Armadillo-Iot(G2) LinuxKernel3.1.4 -at*とRS01の組み合わせて同等の事を実現させようとしておりますが
> >  ドライバソースファイルの構成が変更されているようで、どの部分を変更すれば良いかご教示頂けますでしょうか。
>
> LinuxKernel3.14 -at*のUARTドライバでは、RTS_[ON|AFTER]_SENDの論理が同一であった場合の排他処理を行っていません。
>
> そのため、恐らくRS485の通信設定を行うだけで目的を達成できると思います。
>
> 通信設定の変更手順はマニュアルの次の場所をご参照ください。
> http://manual.atmark-techno.com/armadillo-iot/armadillo-iotg-std_produc…
>
> 注記で、「flagsのRTS_ON_SENDとRTS_AFTER_SENDは初期値を変更しないでください」とありますが、阿部様の用途の場合は問題ありません。
>
> 以上、ご確認ください。

ファイル ファイルの説明
bootlog.txt ブート時のログ抜粋
ch1 rts ch2 tx .png 送信波形(CH1:RTS

溝渕です。

添付いただいた起動ログより、
> No add-on expansion board detected at CON1.
> Atmark Techno RS485/RS422/RS232C board detected at CON2(Rev 2, SerialNumber=2040).
上記は、CON2にRS01が接続されていることを示しています。

製品マニュアルの以下の表記を確認すると、
http://manual.atmark-techno.com/armadillo-iot/armadillo-iotg-std_produc…

CON2に接続したRS01を示すオプション指定子が"imx.rs485_uart1="であることがわかります("mxc_uart."ではなく"imx.")。よって、

> setenv console=ttymxc1,115200 mxc_uart.rs485_uart1=0x17,0,0

setenv console=ttymxc1,115200 imx.rs485_uart1==0x17,0,0

のようにすると、RS485有効/全二重通信、データ送信/非送信時の両方でdata enableがdriveされるようになると思います。

以上、ご確認ください。

溝渕です。

回りくどい表現があったので補足します。

以前ご利用だったArmadillo-IoTと、今回ご利用になっている
Armadillo-IoT(G2)では、Linuxカーネル起動オプションで指定するRS485設定
のオプション指定子が異なります。

Armadillo-IoTでは、次のように指定していました。
CON1: "mxc_uart.rs485_uart4="
CON2: "mxc_uart.rs485_uart1="

Armadillo-IoT(G2)では、次のように指定します。
CON1: "imx.rs485_uart4="
CON2: "imx.rs485_uart1="

仕様変更をお伝えする配慮を欠いたことでお手数をお掛けし、申し訳ございませんでした。

以上、宜しくお願いします。

溝渕様

ご提示頂いた設定"mxc_uart.rs485_uart1" を"imx.rs485_uart1"に変更することで
RTSラインが常時Hiレベルに固定される事を確認致しました。
大変有難うございました。

阿部

> 溝渕です。
>
> 回りくどい表現があったので補足します。
>
> 以前ご利用だったArmadillo-IoTと、今回ご利用になっている
> Armadillo-IoT(G2)では、Linuxカーネル起動オプションで指定するRS485設定
> のオプション指定子が異なります。
>
> Armadillo-IoTでは、次のように指定していました。
> CON1: "mxc_uart.rs485_uart4="
> CON2: "mxc_uart.rs485_uart1="
>
> Armadillo-IoT(G2)では、次のように指定します。
> CON1: "imx.rs485_uart4="
> CON2: "imx.rs485_uart1="
>
> 仕様変更をお伝えする配慮を欠いたことでお手数をお掛けし、申し訳ございませんでした。
>
> 以上、宜しくお願いします。
>