データシートには、32ビットのデータを取得するために32シリアルクロックを適用する必要があると記載されています。これはArduinoをプログラムしますか?
コメント
回答
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()
です。
byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00);
そしてresult
に必要な32ビットがあります