1

Linux MCU(Raspberry Pi)にインストールされ、さらに別のMCU(自分で作成する自家製のもの)からシリアルデータを読み取るプログラムを作成しようとしています。

私はこれを行う方法を研究し、「全体像」を持っていると思いますが、それでもいくつかのことが欠けています。1つは、カーネルモジュールを有効にして、デバイスにアクセスできるようにする必要があります。

sudo modprobe spi_bcm2708
sudo chown `id -u`.`id -g` /dev/spidev0.*

そこから、この有名なCファイルを使用してSPI接続をテストできます。

これで接続は確立されましたが、シリアルデータを読み取る必要があります。このSOの質問への回答によると、私は次のことを行う必要があります。

...読み取り用に関連するポートを開き、を使用read()してデータを取得します。

ただし、その回答のコードスニペットは、SPI経由ではなく、デバイスドライバー経由でポートを開いているようです。

私の理解では、SPIを使用して接続されたMCUデバイスからデータを読み取ることができ、そのデバイス用に独自のデバイスドライバーを作成する必要はありません。これは本当ですか?もしそうなら、私はSPI接続からどのように読み取るのでしょうか、そしてそのコードは上記のリンクされた質問への回答のコードとどのように異なるのでしょうか?

そして、私の理解が正しくなく、デバイスドライバーを「通して」読んだ場合、そもそもなぜドライバーが必要なのですか?それはSPIが回避したいと望んでいることではありませんか?前もって感謝します。

4

3 に答える 3

6

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の速度は、通常、グランドプレーンと短いトレースを備えた多層基板で実現されます。

于 2012-12-11T07:07:11.070 に答える
4

Unixではすべてがファイルです

spi_bcm2708ドライバが正しくインストールされている場合は/dev/whatever、デバイス用のファイル(またはさまざまな方法でデバイスにアクセスするためのファイル)が必要です。

自動的に作成されなかった場合は、mknodを使用してエントリを作成できます

ユーザースペースコードは、他の通常のファイルであるかのようにファイルを開き、/dev/whateverそこからデータを読み書きするだけです。それがUnixの要点です。

編集:それはリンクされた質問のコードが行っていることとまったく同じです。それは、/dev/ttyS0open()を使用してターミナルをファイルとして開き、読み取り/書き込みを行います。

于 2012-12-10T19:25:33.490 に答える
1

SPIのLinuxドキュメントを見つけましたか?

いくつかの良いドキュメントがあります:spi-summaryとspidev。

ファイルspidev_fdx.cにも例がありread()、SPIデバイスに使用されます。

ただし、通常、SPIからの読み取りはioctl()関数によって処理されます。

于 2012-12-11T08:15:43.380 に答える