2016-04-04 12 views
4

私は、接続された複数のデバイスでRS485バスを介して通信するために、作業している産業用Linuxコンピュータに問題があります。私が遭遇したのは、RS485のUSARTドライバによって使用されるIOピンが、RS485のアイドル/トライステートに行くのではなく、起動時に異なるレベルに設定されていることです。その結果、デバイスが起動している間にバス上の他のデバイスが30秒以上ブロックされ、あらゆる種類の外部問題が引き起こされます。イベントの経過は、付属の画像で見ることができます。ここでは、起動時にオシロスコープで出力電圧を測定しました。組み込みLinuxデバイスが起動時にRS485バスをブロックする

私の推測では、実際のドライバは電圧レベルがトライステートレベル(たとえば、このデバイスでは約2.2V)に達するまで開始されないと考えられます。その後、すべてが期待通りに機能します。

ブート時にピンのデフォルトのIOレベルを設定するための設定ファイルを見つけようとしましたが(ブートローダによって設定されている可能性があります)、無駄です。

また、DATA-highを設定するために起動スクリプトを "早く"実行しようとしましたが、問題のデバイスはこれらのピンを通常のGPIOとして制御できるインターフェースを私ができる限り提供していません教えてください。

ご質問、ご意見、ご感想などありがとうございます。

編集:私は経験豊富なLinux開発者ではありませんので、重要な詳細を省略したかどうかを強調してください。

一部仕様:Linuxの2.6

    • ARM920TのREV 0(V41)CPU
    • 独自のディストリビューションは、Busyboxのに
    • アトメルUSARTドライバ
    • から

    エキスを使用しますブートログ:

    Linuxバージョン2.6.28.10(ルート@)(gccのバージョン4.1.2)#94 PREEMPT火10月29日10時22分19秒CET 2013
    CPU:ARM920T [41129200]リビジョン0(ARMv4Tでは)、CR = c0003177
    /...
    ... /ポートは/ dev/ttyS3ため
    RS485モードは
    (私は〜30秒が経過ここで推測している)...
    /...
    を有効に... ./
    atmel_usart.3:MMIO 0xfffcc000(ir​​q = 9)のttyS3はATMEL_SERIALです。
    atmel_serial.3:パッティングRS485 RTSピンダウン
    /...
    ...
    .../

    フル・ブートログ:https://drive.google.com/file/d/0B2XYl1mNCa8jNUZ5V0Nic1hkU0U/view

    同様の問題:

    おそらく同様の問題UART initialisation: Prevent UART to pull RTS high
    しかし、私は提案された解決策を進める方法がわかりません。

    RS485 output during startup from my device

  • +0

    どのドライバを使用していますか?外部コントローラ/トランシーバにバスが接続されていますか?ハードウェアに関する情報があればさらに役立ちます。 – user2205930

    +0

    こんにちは! OPにいくつかの仕様を追加しました。私はファイルシステムのAtmelドライバを見つけましたが、HWドライバ(トランシーバ)は不明です。私はケーシングを開けることができ、周囲を見渡すことができたが、それは封印されているので、むしろそうだった。私は回路図を持っていたが、それは製造業者によって提供されていないことを望む。 – Stenis

    +0

    @ user2205930どのARMを使用していますか? – KernelPanic

    答えて

    1

    これは野生の推測よりも少しですが、それは、デバイスにNULL文字をエコースタートアップスクリプトを追加する価値があるかもしれません(例:は/ dev/ttyS1のか、何でも)できるだけ早い段階中起動。これは、ハードウェアを初期化するためにドライバを蹴るのに十分かもしれません。

    また、Linuxソースでドライバを見つけて、起動方法を調べることもできます。

    +0

    良いアドバイスありがとう。しかし、私はこれを早期に行う方法を見つけられませんでした(例えばrcsの起動スクリプトから試しました) – Stenis

    +1

    これらはカーネル起動後にも起こります。つまり、10-20秒です。 –

    +0

    @SamratDasあなたが正しいと思われます。 Qに挿入したボットログを参照してください。ブート中にすべてのことが起こることを示しています。 – Stenis

    1

    おそらく、あなたはソースコードにアクセスできるので、そのGPIOを誰がいつうまく混乱させるかを調べることができます。 atmel gpioコントローラのポートアドレスのカーネルソースをgrepするだけで何が起こるか把握してください。あなたが運が良ければ、カーネルのコマンドラインオプションがあります。カーネルのコマンドラインオプションは、ブートローダから渡して、必要なものを前もって設定することができます。

    1

    この回答は、あなたのボードの に記載されている必要なものを見つけることができます。

    また、PWMについても同じ問題が発生しました。そこでは、私のブートローダーが同じ責任を負っていることがわかりました。私はブートローダーの設定が変更され、正常に動作し始めました。

    ボードベンダーまたはサードパーティが提供するBSPをチェックしてください(ソースがある場合)。ブートローダがU-bootの場合は、U-boot-(source)/include/configs/(your-board).hの中にあり、そこにRS484の設定があります。ボードのデータシートごとに、同じピンに多重化されている他のものを確認し、ブート時に必要でない場合は無効にしてRS485を有効にすることができます。

    enabling/disablingあなたの設定に応じて値0, 1 or 2を変更することによって行うことができます。単に、//をコメントアウトするだけで、何も無効にすることもできます。

    +0

    残念ながら、私はU-bootを持っていないようです(しかし、私は本当に何があるかは分かりません)。そのようなディレクトリは存在せず、* .h-filesのためにgrepさ​​れていません。 ご協力いただきありがとうございました。 – Stenis

    関連する問題