あるシステムから別のシステムへのデータ転送の一般的なプロトコル?


18

あるシステムから別のシステムに情報を送信するための一般的なプロトコルは何ですか?たとえば、ある期間にわたってマイクロコントローラから収集した情報があり、別のマイクロコントローラに送信したいとします。SPIおよびI2Cインターフェイスについて聞いたことがありますが、あるメソッドを別のメソッドよりも使用する場合と、それをどのように実装するかは不明です。SPIおよびI2C以外の一般的な方法はありますか?実装プロセスは異なるマイクロコントローラーで似ていますか?基本的に、受信側のマイクロコントローラーで行っているデータのバイトを解析していますか?


4
あなたがしたい具体的なことは何ですか?
スターブルー

システムの異なる部分を互いに小さなボックスでデータを渡す方法を考えているだけなので、距離は非常に短いと仮定できます。ボックスに異なるピースを配置する理由は、各ピースが独自の機能を持つように関数を単純化するためです(うまくいけば、それは理にかなっています。)
O_O

2
それは人々が通常システムと呼ぶものではありません。これらは、サブシステムとして定義するものです。これらは、単一のタスクセットを実行する単一のシステムと考えることができるものの一部を形成します。それはセマンティクスですが、あなたの答えの多くは、あなたが質問から探しているものの完全な考えを持っていないため、非常に幅広いと思います。
Kortuk

1
Kortukが言ったことに沿って、問題を定義するのに役立ちます。自問すべき重要な質問の1つは、個々のサブシステムを同じ機能の異なる実装に置き換えるかどうか、またはこれが1回限りの設計であるかどうかです。実際のバスを使用し、サブシステムの実装の詳細をCPUに公開する場合、サブシステムの変更にはコントローラーのas / wの変更が必要です。一方、通信インターフェイスを使用する場合、(replacementの実装方法は関係ありません)サブシステム、同じメッセージプロトコルを満たしている限り。
ジャストジェフ

タスクを分離する以外の理由で、機能を複数のデバイスに分割することは簡単ではありません。通信と同期は、同じマイクロ内に2つのプロセスを持つよりも複雑です。現在、これらのプロセスに特に互換性のない遅延プロファイルがある場合(一方は迅速に更新する必要があり、他方はチャンクを完了するのに時間がかかる場合があります)、それらを分割する正当な理由がある場合があります。それでも、より一般的な解決策は、割り込みを使用するか、より長いタスクをさらに分割する方法を見つけることです。あなたが説明したことで、私はあなたがこれを再考すべきだと思うことに傾いています。
ダロン

回答:


10

SPIとI2Cは、システム間で実際にデータを転送するよりも、周辺機器をコントローラーまたはCPUに接続するために実際に使用されるという点で、似ています。USBは、人々が通信システムとして扱うことを望んでいると思われるもう1つのインターフェイスであり、実際には周辺機器接続バスです。

システム間の通信は、デバイスをバスに接続するようなものではありません。バス接続により、プロセッサはデバイス内のレジスタを直接操作できますが、通信インターフェイスを使用するとデータのストリームを送受信できます。通常、バスに接続されたデバイスにはデバイスドライバーが必要ですが、通信では、ホストコンピューターに関する限り、相手側にが接続されていてもかまいません。

もちろん、これは常により境界になりつつあります。PCIやISAなどは間違いなくバスです。I2C、SPI、USBは間違いなくバスです。一方、RS232、RS485、およびイーサネットは間違いなく通信インターフェースです。しかし、CANバスや1553のようなものもあります。これらは間違いなくデータの移動に関するものですが、非常に複雑な方法です。


CANbusは非常に複雑ですが、イーサネットはそうではありませんか?CANは、簡単なメッセージのやり取りを簡単に行うことができます。これらは専用チップであり、ほとんどのファミリはマイクロコントローラーの内部をサポートしています。
-Kortuk

@Kortuk-232のようなものが一種のピアツーピアの対称性を持っている限り、1553またはCANはマスター/スレーブ関係を強制します。はい。私は、イーサネットが単純であると言ったとは思わない、ただそれがエンドポイントにバスコントローラ/バスデバイスの区別を課さないというだけです。
ジャストジェフ

また、完全な開示-CANに関する私の意見は、完全に接線方向の露出によるものです。私が取り組んだいくつかのシステムでは未使用のオプションの周辺機器でしたが、ドキュメントを何百回もパスした後、浸透だけで未使用のオプションについて少し吸収します。そのため、CANはコントローラー/制御デバイスタイプのアーキテクチャーであるという前提の下で作業しています。
ジャストジェフ

バスは文脈によって意味が異なると思います。回路図レベルでは、複数の信号を持つインターフェースはバスと見なすことができます。抽象度を高めてより高いレベルに移動すると、バスの意味が変わります。少し高いバスは、通常、複数のデバイスが存在するか、複数のデバイスが関与する可能性があることを意味します。たとえば、RS485マルチポイントは間違いなくバスです。Linuxデバイスの観点から見ると、RS485は再び通信インターフェースになり、バスから降格されます...その上に独自のプロトコルレイヤーを追加してバスに戻すまで。各レベルでの意味は異なります。
ダロン

11

データを送信する方法は1つではありません。距離、データレート、環境、アプリケーションに応じて、さまざまな通信方法があります。

最下層は物理層で、実際にビットを移動します。

  • SPIとI²Cは、伝送を妨害する可能性のあるノイズがあまりないデバイス内の短距離用です。

  • 数十メートルまでの距離であまり速くない通信には、RS-232を介したシリアル通信が適切な選択です。

  • RS-485などでは、ノイズが多い場合や距離の長い差動信号が使用されます。より高速なデータ伝送のために、イーサネットがあり、これはますます普及しています。

  • また、さまざまなワイヤレス規格もあります。

物理層の上部には、データの送信方法を整理する層があり、伝送エラー、ネットワーク内のルーティング、その他多くのエラーを検出および修正します。たとえば、インターネットプロトコルは、通常はイーサネットプロトコルの上にある、いくつかの層のかなり複雑なスタックです。


7

シンプルなシリアルUARTを使用でき(1つのTxラインと1つのRxラインが個別のクロックなしで)、オプトアイソレーターまたは磁気アイソレーターを使用して異なる電位(一次および二次回路も含む)を簡単に横断するように適合できます。

プロトコルに関する限り、定義されたコマンドバイトと何らかのチェックサムスキームを備えたものはすべてうまく機能します。あらゆる種類の通信に適合するカバーオール標準プロトコルは実際にはありません。I2Cには信号の標準(アドレス指定、停止、開始などの定義)がありますが、実際に通信されるプロトコルは開発者次第です。

たとえば、PMBusは、物理メディアとしてI2Cを使用する電源通信プロトコルです。


6

実際には「一般的な」プロトコルはありません。使用するものはアプリケーションに大きく依存します。より良い回答を提供するために、お客様の要件をもう少しよく理解する必要があります。サブシステムとして互いに通信する個別のマイクロコントローラーを持ちたいとおっしゃいました。

このアプリケーションに関するいくつかの質問:

  1. このプロジェクトには2つ以上のマイクロコントローラーがありますか?
  2. 速度とスループットの要件は何ですか?情報がそこに到達するのにどれくらいの速さが必要ですか?また、データをどのくらいの頻度で送受信していますか?

質問1でNOと答えた場合:

このプロジェクトにmicrco-controllersが2つしかない場合、間違いなくそれらの間でUARTを使用できます。両方が通信を開始する必要がある場合は、フロー制御を使用します。そうでない場合は、データを一方向に送信するのは簡単です。ほとんどの場合、より高いボーレートのいずれかを選択すると、「十分に高速」になります。I2CとSPIは通常、マスター/スレーブアーキテクチャにのみ適しています。

質問1でYES(2つ以上のコントローラー)と答えた場合:

  • プロジェクトに3つ以上のマイクロコントローラーがある場合、どちらが通信を開始しますか?マスターコントローラーは1つだけですか(マスタースレーブアーキテクチャ)。または、サブシステムのいずれかがいつでも話すことができますか?
  • サブシステムのいずれかが相互に通信する必要がありますか?例:デバイスA、B、Cの場合:AはBとCに送信でき、BはAとCの両方に送信できます。

そのため、アドレス指定可能なデバイスを共通バスにドロップできる、よりスケーラブルなものが必要です。これらのフォローアップの質問に対する回答は、I2CとSPI(マスタースレーブ)またはCAN(マルチマスター)のようなものを決定するのに役立ちます。

ご使用のマイクロコントローラーにはUART周辺機器が搭載されている可能性が高く、その他(特にCAN)はより高性能なチップでのみ使用できます。どちらの場合でも、これらの周辺機器を使用してバイトを移動する方法に関するドキュメントがたくさんあるはずです。


5

@Jonが述べたように、通信インターフェースを選択する際の1つの問題は、1つのエンティティが常に通信の開始に責任を負うか、複数のエンティティがその責任を負うかどうかです。関連する問題は、1つのエンティティが常に未承諾の通信を受信する準備ができているかどうかです。SPIは、片側が常に通信を受信する準備ができているアプリケーションで頻繁に使用されます。たとえば、74HC595シフトレジスタのようなものが「ビジー」になることはありません。SPIはマイクロコントローラとマイクロが制御することになっているハードウェア間の通信には適していますが、2つのマイクロコントローラ間の通信には実際には良くありません。I2Cハードウェアを搭載した2つのプロセッサが通信に使用する場合、ソフトウェアは(非常に寛大な制約の範囲内で)何が起こっているのかを処理するのに必要な限り、データ損失を引き起こすことなく。プロセッサが各着信バイトを処理するのに100マイクロ秒かかると、スループットが大幅に制限されますが、送信側は受信側が追いつくのに十分なほど遅くなります。SPIで一般的に発生する唯一の方法は、ハンドシェーク用に別のワイヤがある場合です。

I2Cは本当に素晴らしいプロトコルです。考えられる最も完璧なプロトコルであることを妨げる最大の制限は次のとおりです。

  1. その速度は多少制限されています。SPIははるかに高速に動作し、UARTでさえ少し高速に動作することがあります
  2. (2)I2Cに必要なのは2本のワイヤのみであるのは非常に便利ですが、両方のワイヤは双方向のオープンコレクタ通信が可能でなければなりません。これにより、リピーター経由でI2Cを送信することが難しくなります。

個人的には、コントローラベンダーがハンドシェイクを含むSPIの3線式バリアントをサポートすることを望んでいます。しかし、私はそうするコントローラーを知りません。


おもしろいことにこれを言及する必要があります...私は、SPIインターフェースを非双方向I2Cのようなインターフェース(最初のバイトはアドレス)に変えて、チップ選択よりも多くのデバイスがバスに参加できるようにする必要があります。スレーブデバイスがすべてFPGAである場合に機能します。:)私も、これら2つの主要な同期標準の間に何かがあることを望んでいました。
ダロン

ああ、スレーブの出力イネーブルはアドレスバイトが受信されるまでアサートされず、シングルチップセレクトがディアサートされるまでオンのままになることを明確にする必要があると思います...したがって、明らかに通常のSPI +高レベルとは若干異なりますプロトコル。ただし、マスターデバイスの観点からは標準SPIと完全に互換性があります。(マイクロプロセッサのような)
ダロン

@darron:かっこいい。業界がワイヤを積極的に高低に駆動するオープンスタンダードの3線式通信バスの使用を開始するには、何が必要になるのだろうか?パッシブプルアップを回避することと、デバイスが割り込みを通知できるようにすることとの間にはわずかな矛盾があると思いますが、マスターに配線できる割り込みピンを追加することで解決できるかもしれません(スレーブの私の現在の実装プロトコルにはスレーブが1つしかないため、データリターンワイヤを使用して、サービスが必要なときに非同期で信号を送ることができます。
-supercat

@darron:チップ選択ピンを使用する必要を回避するために、マスターはクロックが低い間にデータワイヤで2つの立ち上がりエッジを送信することでコマンドの開始を通知します。スレーブは、クロックとデータが両方ともロー(アイドル)のときにステータス値を出力することにより、最後のデータバイトが有効かどうかを示すことができます。それ以外の場合、クロックが低くデータが高いときに注意が必要であることを示します。私はこのプロトコルのためのマスターのハードウェアを設計していた場合、私は、データ線がクロックをミラーリング8つのクロックパルスを送信する機能を追加し、スレーブハードウェアで非同期時の立ち上がりエッジの数のカウント...含まれる
supercatを

@darron:...データバイト。5以上の場合、バイトは無視されます(スレーブは、マスターがデータのバイトの受信に関心があると想定しますが、実際に言いたいことは何もありませんでした)。ただし、クロックが低いときにスレーブが最後のバイトのステータスを報告するので、スレーブは準備ができていなかったことをマスターに知らせることができるので、それほど重要ではありませんそして最後の「取引の機会」を逃していた
supercat

3

順不同で、同じボックス内の2つのCPUの最も一般的な物理層インスタンスは次のように見えます:

  • デイジーチェーンSPI(JTAGで使用されるなど)
  • スレーブごとのワイヤ選択SPI
  • 「TTLレベルのRS-232」(別名「非同期のスタート/ストップシリアル通信」)(1つのCPUのUART TXピンを別のCPUのUART RXピンに直接接続)
  • I2C
  • 8ビットデータ+ストローブ(IEEE 1284プリンターポートパラレルポートなど)
  • 共有メモリ(一度に1つのCPUのみがアドレス/データ/制御バスを駆動します)

これらの物理層インスタンス(および別々のボックスにある2つのCPUのその他の物理層インスタンス)は、通常、通信システムの上位レベルを実装するソフトウェアにバイトストリームを提供します。

スマートプログラマーは、ハードウェア担当者が1つの物理層インスタンスを削除して完全に異なる物理層インスタンスに置き換えることを決定したときに、バイトの出力ストリームを供給するためにいくつかの関数を書き換えるだけでソフトウェアを記述します。ハードウェアに送信し、ハードウェアからバイトのストリームを読み戻します。すべての高レベルのプロトコルは変更されずに動作し続けます。

1つのCPUから別のCPUに情報を送信するプロトコルでは、ほとんどの場合、バイトストリームを一連のパケットとして解釈します。

  1. 前文
  2. ヘッダ
  3. (おそらくエスケープされた)シリアル化されたデータ
  4. トレーラー

一部の人々は、(2)多くの種類のヘッダー構造の1つと(3a)多くの種類のシリアル化データの1つ、(3b)多くの種類の1つ、 (4)多くの種類のトレーラーの1つを使用して、シリアル化されたデータをエスケープします。

データをパケットにカプセル化するための最も簡単なプロトコルには次のものがあります。

データをパケットにカプセル化するためのやや複雑なプロトコルには次のものがあります。

プロトコルの長いリストがあります

プロトコル設計の誤りを説明するRadia Perlmanによる「Protocol Design Folklore」をお楽しみください 。


3

単一の「一般」プロトコルはありません。選択は(たとえば)次のものに依存します。

  • 距離
  • 必要なスループット
  • 特別な周辺機器の可用性
  • 騒音レベル
  • 光学的分離の必要性
  • 重大度(許容故障率)
  • 両端で利用可能なCPUパワー
  • 両端で利用可能なI / Oピン

多くの場合、物理層(信号レベル)とデータリンク層を区別する必要があります(+/-データのエンコード方法)(OSIモデル、下位2 ..4層を確認します)。可能なフィスカル層は、たとえば次のとおりです。

  • シンプルな5Vまたは3.3Vまたは1.8V TTL
  • プッシュプルの代わりにオープンコレクター以外の上記のいずれか
  • バランスのとれたlov電圧信号(FPGAでよく使用されます)
  • バランスのとれたハイガー電圧(RS485、RS432)
  • シングルエンドの高電圧(RS232)
  • バランスのとれたtrafo結合(さまざまなイーサネットバージョン、PDIFオーディオ)
  • 光学(光学イーサネット、トスリンク)

1行を使用してデータとクロック情報を伝達したり、これを複数の行に分割したりできます。後者は一般的に使用されていましたが、最近ではほとんどの新しい/高速プロトコルが1つの回線(または1つの回線として機能する1組の回線)を使用する傾向があります。

Therは、回線上でデータとクロックをエンコードする多くの方法です。RS232は伝統的にNRZを使用します。Machesterエンコーディングがあり、さまざまな形式が2.7 RLLという奇妙な名前のハードディスクで使用されています。

要約すると、システム間で通信を行うには膨大な数の方法があります。また、コネクタや、エラーの検出と回復、データのエンコード、圧縮、暗号化などの高レベルの側面についても言及していません...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.