問題タブ [spi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
3686 参照

arm - OMAPSPIコントローラー

OMAP3でspiデバイスを制御するためのアプリケーションを開発した人はいますか?spiドライバ「mcspi」をロードできますが、使い方がわかりません。

0 投票する
4 に答える
3914 参照

c - 非常にメモリに制約のある組み込みシステムで大規模なデータ転送をどのように処理しますか?

PC シリアル ポート (115200 ボー) から大きなファイルをダウンロードし、SPI (~2 MHz) 経由でシリアル フラッシュ メモリに書き込む必要があるマイクロコントローラーがあります。フラッシュ書き込みは、書き込みコマンドとページ アドレスが先行する 256 バイト ブロック内にある必要があります。システムで使用可能な RAM の合計は 1 kB で、スタック サイズは 80 バイトです。

これは現在、UART から 256 バイト バッファを埋めてから、別の 256 バイト バッファにピンポンすることで機能しており、フラッシュがビジー書き込みで書き込まれている間に、RX バッファ準備完了信号の割り込みによって埋められています。バッファのスワッピングは、操作が完了するまで繰り返されます。

個別の循環バッファーで動作する SPI ポートと UART ポートの両方に TX/RX 割り込みハンドラーをセットアップすることをお勧めします。したがって、新しいバイトをポーリングして操作が完了するのを待つ代わりに、単純に TX バッファーを埋めて割り込みを有効にするか、着信データのバッファーをチェックすることができます。これにより、周辺機器を待機する代わりに、実際の作業により多くのクロック サイクルが提供されます。

128 バイトの循環バッファーを使用して IRQ を実装した後、UART RX バッファーでデータをポーリングし、すぐにそれを SPI TX バッファーに配置してファイル転送を行います。このアプローチで私が抱えている問題は、バッファ用に十分な RAM がなく、データをフラッシュ送信バッファに転送するよりも早く PC 受信バッファがいっぱいになることです。明らかに、転送速度は問題ではありません (入力 115.2 kHz、出力 2 MHz) が、256 バイトのページが送信されるたびに書き込みサイクルの待機が発生します。


頻繁な SPI 割り込みが UART 割り込みの一部をブロックし、バイトが失われているようです。私が選択した解決策は、UART 受信割り込みにリング バッファーを使用し、データを 256 バイトのページ バッファーにフィードすることでした。このページ バッファーは、バイト転送と書き込み完了をポーリングすることによってシリアル フラッシュに送信されます。128 リング バッファは、SPI 書き込み中のオーバーフローを防ぐのに十分な大きさです。

0 投票する
2 に答える
3150 参照

sunspot - SunSPOT で TTL、SPI、または I2C を推奨しますか

次のプロトコル TTL、SPI、または I2C をサポートする外部コンポーネント (Skyetek M1 Mini または M1 RFID スキャナー) とのインターフェイスを試み始めています。これらのルートのうち、どのルートをお勧めするかを考えています。その場で実行されているアプリは、多くの処理時間 (継続的に実行されるジェスチャ マッチング アルゴリズム) を必要とし、かなりのリソースを消費します。

トピックに関するリンクまたはソースは大歓迎です。

私が見つけた役立つリンク:

TTL:

ご協力いただきありがとうございます。


編集:

それが私が接続しようとしているデバイスに役立つ場合は、Skyetek M1およびM1 miniです。プラットフォーム/CPU は Sun SunSPOTです。

0 投票する
2 に答える
445 参照

embedded - 45DB161 データフラッシュと 89LP4052 コントローラーのインターフェース

データ フラッシュを 89lp 4052 コントローラと接続しようとしています。Crysal は 11.0592 MHz を使用しました。このコントローラには spi バスが組み込まれています。CPHA と CPOL のすべての組み合わせを試しました。モード 0 とモード 3 を試しました。ステータス レジスタを読み取ることができません。レジスタを読み取る場合もありますが、フラッシュからコードを ff するだけの場合もあります。

私のコードは次のとおりです。

;;============================================== ==============================

WRITE_FLASH: MOV 20H,#0D7H ;コマンド LCALL SEND_CLOCK_ONE LCALL READ_FLASH CLR SCON.1 MOV A,21H MOV SBUF,A JNB SCON.1,$ CLR SCON.1 ;;============= ================================================== ======== SETB CS CLR SCLK LCALL DELAY2 CLR CS ;再度選択 MOV 20H,#84H LCALL SEND_CLOCK MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#33H LCALL SEND_CLOCK LCALL DELAY2 SETB CS LCALL DELAY2 CLR SCLK CLR CS ;再度選択 MOV 20H,#0D4H LCALL SEND_CLOCK
MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#00H LCALL
SEND_CLOCK ,#00H LCALL SEND_CLOCK_ONE

;;============================================== ====================== SEND_CLOCK_ONE: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C, 05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SEND
MOV C,00H MOV DOUT,C LCALL PULSE_SEND_LAST RET ;;=================================== ===================================== READ_FLASH: LCALL PULSE_SEND MOV C,DIN MOV 0FH,C LCALL PULSE_SEND MOV C、DIN MOV 0EH、C LCALL PULSE_SEND MOV C、DIN MOV 0DH、C LCALL PULSE_SEND MOV C、DIN MOV 0CH、C LCALL PULSE_SEND MOV C、DIN MOV 0BH、C LCALL PULSE_SEND MOV C、DIN MOV 0AH、C LCALL PULSE_SEND MOV C,DIN MOV 09H,C LCALL PULSE_SEND MOV C,DIN MOV 08H,C LCALL PULSE_SEND RET ;;================================= ==================================== SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDDIN MOV 08H,C LCALL PULSE_SEND RET ;;======================================= ============================= SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT、C LCALL PULSE_SENDDIN MOV 08H,C LCALL PULSE_SEND RET ;;======================================= ============================= SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT、C LCALL PULSE_SENDC LCALL PULSE_SEND RET ;;========================================== ========================== SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDC LCALL PULSE_SEND RET ;;========================================== ========================== SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDMOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDMOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDC LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDC LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SEND
MOV C,00H MOV DOUT,C LCALL PULSE_SEND RET

;;============================================== ========================== DELAY2: mov 56H,#0FFH DJNZ 56H,$ mov 56H,#0FFH DJNZ 56H,$ RET ;; ================================================= ================= PULSE_SEND: SETB SCLK LCALL DELAY2 CLR SCLK LCALL DELAY2 RET ;;=================== ============================== PULSE_SEND_LAST: SETB SCLK LCALL DELAY2 RET ;;========== ========================================== PULSE_READ_FIRST: CLR SCLK LCALL DELAY2 SETB SCLK LCALL DELAY2 RET ;;========================================== ===============

終わり

0 投票する
1 に答える
2028 参照

microcontroller - SPI でアクセスするための SD ファイル システム

次のサイトを見つけました: http://www.pjrc.com/tech/8051/ide/fat32.html 基本的に、FAT32 ファイルシステムの優れた概要です。これまでのところ、非常に理解しやすいことが証明されています。

さまざまな Linux ファイルシステムに関する同様のドキュメントやハウツーを誰かが知っているかどうか疑問に思っていました。ドライブにデータを保存する方法に興味があります。

etx3の仕様などについてGoogleからいくつか検索しましたが、それ以上のものは見つかりませんでした。基本的にはジャーナリングを備えたetx2です...などであり、データの編成方法やアクセス方法の説明ではありません

助けてくれてありがとう。

0 投票する
3 に答える
26416 参照

embedded - SPI の問題で SD カードを初期化する

Stack Overflow question Initialization of a microSD card using an SPI interfaceを見てきましたが、私の問題 (つまり、まだ試していないこと) に一致する回答はありませんでした。

マイクロコントローラーの SPI インターフェイス (具体的にはHC908 )を介して SD カードにアクセスしようとしている同様の問題があります。Physical Layer Simplified Specification v2.00 のフローチャートに従ってみましたが、Transcend 1 GB & 2 GB および AE&C 1 GB カードで正しく初期化されるようです。しかし、カメラで使用した古いカードの隠し場所から、他の 3 枚のランダムなカードで問題が発生しています。

私のコードはすべて HC908 アセンブラーです。SPI クロック ラインを調べたところ、初期化中に約 350 kHz で実行されました (100 ~ 400 kHz のウィンドウ内に収まる私の低い MCU クロック速度で HC908 が提供する唯一の速度乗数)。

初期化ルーチンを完了していない 3 つのカードの結果を次に示します (すべて、コードやタイミング パラメーターを変更せずに連続して実行されます)。

不正コマンドフラグが立っていませんか?そのフラグをクリアするためにCMD8の後に何かをする必要がありますか?

なぜ OCR はすべて F なのですか? まったく適切ではないようです。また、ACMD41 と CMD1 が不正なコマンドに応答するのはなぜですか? 不正なコマンド応答があっても、カードが CMD55 の後に有効な ACMD を待機しているため、CMD1 が失敗していますか?

あのカードの何が悪いんだ?

同期している場合もあれば、そうでない場合もあります。(上記のパターン繰り返し可能です。) 私はこれを調査しましたが、MOSI/MISO 転送間で異常なクロック サイクルが発生することはありません。

0 投票する
1 に答える
1238 参照

embedded - AT91SAM7X512のSPIペリフェラルは、SPI_TDRへの書き込み時に無効になります

AT91SAM7X512のSPIペリフェラルは、書き込みを行うX時間(Xは変化します)で無効になりますSPI_TDR。その結果、プロセッサはでTDREフラグをチェックするwhileループでハングしSPI_SRます。このwhileループはSPI_Write()、ATMELが提供するソフトウェアパッケージ/ライブラリに属する​​関数にあります。問題は任意に発生します。すべてが正常に機能する場合もあれば、繰り返し試行しても失敗する場合もあります(試行=同じバイナリをMCUにダウンロードしてプログラムを実行する)。

構成は次のとおりです(書き込み順に定義)。

  1. SPI_MR
    • MSTR= 1
    • PS= 0
    • PCSDEC= 0
    • PCS= 0111
    • DLYBCS= 0
  2. SPI_CSR[3]
    • CPOL= 0
    • NCPHA= 1
    • CSAAT= 0
    • BITS= 0000
    • SCBR= 20
    • DLYBS= 0
    • DLYBCT= 0
  3. SPI_CR
    • SPIEN= 1

構成を設定した後、コードはSPIENSフラグをチェックすることにより、SPIが有効になっていることを確認します。

次のようにバイトの送信を実行します。

質問:

  1. 書き込み時にSPIペリフェラルが無効になる原因は何SPI_TDRですか?
  2. レジスタSPI_Write()を読み取る行のコメントを解除する必要がありますか? つまり、次のコードの4行目:( 4行目は元々コメントとしてマークされています)SPI_RDR

    /li>
  3. 5バイトのデータを送信する上記のコードに何か問題がありますか?

ご注意ください:

  • NPCS行番号。3はGPIOライン(つまり、PIOモード)であり、SPIコントローラーによって制御されません。必要に応じてChipSelect#3(NPCS3)ピンをデ/アサートすることにより、コード内でこの行を自分で制御しています。私がそうしている理由は、SPIコントローラーにこのピンを制御させようとしたときに問題が発生したためです。
  • 私はPDC/DMAコントローラーを使用せず、使用しないことを好みました。
  • SPIペリフェラルを2回リセットしませんでした。これは、リセットを実行した場合にのみエラッタが2回リセットするように指示しているためです。これは実行しません。正誤表の引用:

    ソフトウェアリセット(SPI制御レジスタのSWRST)を実行すると、SPIが正しく動作しない場合があります(チップセレクトの前にクロックが有効になります)。
    問題の修正/回避策
    SPI制御レジスタフィールドのSWRST(ソフトウェアリセット)は次のようになります。正しく設定するために2回書き込まれます。

  • レジスター(in )への書き込みの前に遅延を設定すると、コードが完全に機能し、通信が成功する場合があることに気付きました。SPI_TDRSPI_Write()

便利なリンク:

SPIを初期化し、5バイトの転送を実行する例は、高く評価されており、役に立ちます。

0 投票する
4 に答える
5618 参照

embedded - SPI を使用した SD カードの初期化

MMC/SD カードに関する多くの情報を見て、これを読み取るためのライブラリを作成しようとしました ( Procyon AVRlibを変更します)。

しかし、ここでいくつか問題があります。私は元のコードを変更せず、ここで試しました。私の問題は、SD カードの初期化に関するものです。256 MB と 1 GB の 2 つがあります。

CMD0、CMD55、ACMD41、CMD1 の順に init コマンドを送信します。

しかし、256 MB の SD カードは、各コマンドに対して 0x01 応答しか返しません。CMD1 を何度も送信すると、256 MB の SD カードは常に 0x01 のみを返し、0x00 を返すことはありません。

1 GB SD はもっとクレイジーです... CMD0 は 0x01 で戻ります。いいのですが、CMD55 コマンドは 0x05 で応答します。それ以外の場合は 0xC1 で応答し、次のインタラクションで 0x5F とともに 0xF0 で応答することもあります...

インターネットの周りには情報と例がありますが、少し混乱しています。ここで私のプロジェクトでは、1 GB カードを使用する必要があり、SD アダプター付きの microSD カードを使用しようとしています (これは問題ではないと思います)。

この問題を解決するにはどうすればよいですか?

PS: 私の問題は Stack Overflow の質問Initializing SD card in SPI issuesの問題に似ていますが、解決策は私の問題を解決しませんでした。1 GB SD カードは 0x01 しか返さない... :cry:

0 投票する
1 に答える
627 参照

hardware - SPIとGDO、GDOの頭字語は何ですか?

SPIバスに関連して、通常、SPI接続のマスターまたはスレーブに割り込むために使用される多数のGDOピンがあります。しかし、GDOの頭字語は何ですか?

0 投票する
1 に答える
6633 参照

initialization - SPI インターフェイスを使用した SD カードの初期化

SD カード (CMD8、CMD55、および CMD41) から無効な応答コードを受け取ります。

初期化ルーチン:

コメントで応答コードを読むことができます。

への応答コードは可能CMD8です0xC1か? ビット 7 は 0 のはずですよね?

ハードウェアエラーですか?