Linux MCU(Raspberry Pi)にインストールされ、さらに別のMCU(自分で作成する自家製のもの)からシリアルデータを読み取るプログラムを作成しようとしています。
[ MCUは使用するのに適切な用語ではありません。Raspberry PiはSoC(System on a Chip)を使用します。マイクロコントローラーは、SoCよりも安価でシンプルなデバイスになります。TLAを使用する場合は、SBC、シングルボードコンピューターを使用してください。]
[「シリアルポート」と「シリアルデータ」という用語を誤用しています。今日、PCが普及しているため、「シリアルポート」はEIA/RS-232非同期シリアル接続のみを指すようになりました。SPI。USB。I2C、TWI、SATAなどは、それらがどのように機能するかを説明していない限り、「シリアル」接続と呼ばれるべきではありません。]
Linuxでは、SPIデバイスドライバーは文字ドライバーではなく*プラットフォームドライバーとして実装されることがよくあります。したがって、このようなドライバーには、 open()、read()、write()、またはclose( )を実行するためのファイル操作またはfopsがありません。)。このような操作は、プラットフォームデバイスがシステムに接続するターゲットデバイス用です。その結果、プラットフォームデバイスには、ターゲットデバイスのようにデバイスノードがありません。SPIはUSBおよびPCIと同じカテゴリにあり、すべてバスです。通常、プラットフォームドライバーとして実装されます。/dev
私の理解では、SPIを使用して接続されたMCUデバイスからデータを読み取ることができ、そのデバイス用に独自のデバイスドライバーを作成する必要はありません。これは本当ですか?
答えは、使用するカーネルに、ユーザープログラムが使用できるように公開されているSPIcharデバイスがあるかどうかによって異なります。ただし、SPIドライバーがプラットフォームドライバーである場合は、カスタムSBC用のデバイスドライバーを実装する必要があります。このターゲットデバイスには/dev
、メジャー番号とマイナー番号が割り当てられたノードと、それらの番号に関連付けられたドライバーが必要です。このドライバーは、SPIドライバーが提供するプラットフォーム操作を利用するか、LinuxSPIAPIを使用して転送を実行します。SPIとそのドライバは、このプロセッサとターゲットデバイス間でデータを転送するための単なる導管です。SATAやPCIと同様に、ユーザーは周辺機器をコンピューターに接続するこれらの(内部)バスに気付くことはめったにありません。
linux/drivers/spi/spi_bcm2708.c
プラットフォームドライバーです。open()、read()、write()、またはclose()操作をサポート/実行するための機能はありません。自身をSPIマスターとして登録するため、他の(ターゲット)ドライバーはそのサービスにSPIAPIを使用できます。
IMOは、RPIとカスタムSBCの間にEIA/RS-232リンクを実装する方がよいでしょう。非正規(raw)転送が使用された場合、SPI接続に変換/アップグレードすると、作成したコードの99%が再利用可能になる可能性があります。フロー制御のない3線式シリアル接続は、SPI接続に似ていますが、マスター/スレーブ階層が課されておらず、HWインターフェイスが単純で、ケーブル長が長くなっています。
どんなケーブルを使用しても、SPI距離が長いと高速伝送速度を達成できない場合があることに注意してください。SPIの数十Mbpsの速度は、通常、グランドプレーンと短いトレースを備えた多層基板で実現されます。