ArduinoSPIを使用してデータを読み取る方法

データシートには、32ビットのデータを取得するために32シリアルクロックを適用する必要があると記載されています。これはArduinoをプログラムしますか?

コメント

  • SPIライブラリの例を開いて確認することをお勧めします。とにかく、コードは次のようになります。 byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00);そしてresultに必要な32ビットがあります
  • 私はすでにそれをしましたが、エネルギーチップ私が使用しているのはSTPM10であり、MOSIが接続されていないシンプレックス同期SPIを使用する必要があることを示唆しています。バイトの読み取りと書き込みから切り替えるタイミング図があります。SPI.transfer()を使用した場合、データは安定していて信頼できないと思います
  • 信頼できないとはどういう意味ですか?ペリフェラルは全二重であり、動作方法によると、データを受信する唯一の方法はダミーデータを送信することです。MOSIが接続されていません、まあ、それは重要ではありません' ;ただし、'他のタスクにMOSIピンを使用することはできないことに注意してください。ちなみに、他の周辺機器のスレーブ選択ピンを正しく設定したことを覚えていますか? arduinoボードまたは別のボードのSSピンを使用しましたか?

回答

4回、適切なビットシフト後に戻り値を変数に保存するたび。

uint32_t val; val = SPI.transfer(0xff); //0xff is a dummy val |= (uint32_t)SPI.transfer(0xff) << 8; val |= (uint32_t)SPI.transfer(0xff) << 16; val |= (uint32_t)SPI.transfer(0xff) << 24; 

最下位と見なしますバイトが最初に受信されます。データシートに示されているように、SPIモードが正しいモードであることを確認してください。

スレーブがバイト間のディアサートを処理できない場合(これがSPI.transfer()トランザクションの最後に実行されます)、st2000のハードウェアSPIアプローチを試すか、shiftIn()でビットバンSPIを使用できます。

コメント

  • これが機能するかどうかはわかりません。 SPIスレーブがどのように反応するかを想定する前に、SPIスレーブがどのように機能するかを知る必要があります。また、チップセレクトラインが8ビットSPIトランザクションごとにアサートおよびデアサートされる場合、SPIスレーブはどの程度適切に設計されていますか?つまり、このようなSPIスレーブはSPIマスターと簡単に同期しなくなる可能性があります。具体的には、実際に読み取っている8ビットバイトをどのように保証しますか?
  • @ st2000 OPは、十分な詳細を提供しないのに適していると考えました。
  • 私が見たすべての例'は、SPI.transferではなくSPI、transfer(0)を使用してデータを読み取ります。 (0xff)。また、データの書き込みにもSPI.transferを使用します。 '実際にデータを読み取っているときに、SPIが0または0xffで何をするのかまだわかりません。これはスレーブに送信されますか?
  • @ S.Imp 'はダミーバイトです。送信したいものは何でも送信できますが、データにお金を払っても、相手側のデバイスはそれらを破棄します。 SPI.transfer()は、SPIの本質的な全二重性のため、および(最初の要因の結果として)ほとんどのMCUがSPIペリフェラルを実装する方法のために、常に使用されます。クロックが実行を開始すると、MOSIおよびMISOラインには常に" data "があります。'は、バス上の各参加者がそれを読み取るかどうかを決定し、" data は意味があるかどうか。
  • 'できると言ってもまったく間違っていません' SPIバスに書き込むことなく実際に読み取ること、およびその逆も同様です。したがって、ユースケースを一般化するために、1つのレジスタでバイトを受け取り、8サイクル後に別の(または同じ)レジスタでバイトを返すペリフェラルを単純に設計することは理にかなっています。次に、'ユーザーの'アプリケーションが、'であるかどうかを判断します。最初に書き出されたバイト(TX)、読み戻されたバイト(RX)、またはその両方(TXとRX)にのみ関心があります。また、読み取りと書き込みの両方の役割を果たしているため、あいまいな名前transfer()です。

回答

Sparkfunには、SPIとは何かについての適切な説明があります:
https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi

Arduino IDEには、IDEに付属のSPIライブラリがあります。
http://www.arduino.cc/en/Reference/SPI

ライブラリには2つの例があります。
SPIを使用した気圧センサーの読み取り
SPIを使用したデジタルポテンショメータの制御

回答

目的は、を使用して32ビットを読み取ることです。 (不明な)デバイスのSPIポート。

デバイスがSPIチップセレクトラインアクティビティ(8ビットバイトの読み取りごとに非アクティブからアクティブ、非アクティブに移行)を許容する場合、4つの連続した8を実行することで、必要な32ビットのデータを取得できるはずです。ビットSPI読み取り。

ただし、デバイスが上記のSPIチップセレクトラインアクティビティを許容しない場合(つまり、デバイスが32ビットSPIトランザクション全体でSPIチップセレクトをアクティブにする必要がある場合)、 SPIチップセレクトラインを制御せずに、32ビットトランザクションを4つの個別の8ビットSPIトランザクションに分割することはできません。次のコード例は、これがどのように行われるかを示しています。

void loop(){ //transfer 0x0F to the device on pin 10, keep the chip selected SPI.transfer(10, 0xF0, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, keep the chip selected SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response1, keep the chip selected byte response1 = SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response2, deselect the chip byte response2 = SPI.transfer(10, 0×00); } 

上記の例は、 ArduinoSPIライブラリからのものです。 Webページであり、16ビット(32ビットではない)転送です。 32ビット転送をコーディングするには、SPI_CONTINUEパラメータを使用してSPI.transferメソッドを呼び出し続けます。

後で追加…

DueExtendedSPIメソッドの使用を推奨していないようです。 。そして、SPISettingsとSPI.beginTransaction()を使用しますか?その場合、このページは、コードがSPIチップセレクトラインを明示的に制御しているサンプルコードを示しています(slaveAPin &を探してくださいslaveBPin)。コードがスレーブAから24ビットを読み取り、スレーブBに8ビットを書き込む方法に注意してください。24ビットではなく32を読み取るには、コードのセグメントを(他のいくつかのサポートする変更とともに)次のように変更する必要があります。

... SPI.beginTransaction(settingsA); digitalWrite (slaveAPin, LOW); // reading only, so data sent does not matter val0 = SPI.transfer(0); val1 = SPI.transfer(0); val2 = SPI.transfer(0); val3 = SPI.transfer(0); digitalWrite (slaveAPin, HIGH); SPI.endTransaction(); ... 

コメント

  • さらに構成するには、スレーブSPIデバイスの仕様を確認する必要があります。具体的な回答。
  • STPM10評価ボードを使用しています。接続はシンプレックス同期SPIであり、ArduinoのMOSIは何にも接続されていません。読み取り専用から書き込み専用に切り替えるタイミング図があります。私の問題は、チップのレジスタからデータを読み取る方法です。 SPI.transferを使用しましたが、'データが信頼できるとは思いません。
  • 11ページにあるSTPM10タイミング図'の仕様は標準のSPIトランザクションのようには見えません。 ArduinoSPIライブラリは使用できないと言いたいです。代わりに、これを完全にソフトウェアでビットバンする必要があるかもしれません。たとえば、標準のSPIバスに" SYN "回線があるとは思いません。また、' SPIトランザクションが終了する前にチップセレクトラインがハイになるとは思いません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です