SPIモードのSDカードはチップセレクト/スレーブセレクトを尊重しますか?アプリケーションでリセットされているようです


9

16ビットSPIを介してFPGAに接続されているマイクロコントローラー(NXP LPC1343)があるアプリケーションがあります。同じSPIポート(MISO / MOSI)を使用しているが、CS / SSピンが異なるSDカードもあります(どちらもSPI仕様に従ってアクティブLOWです)。FAT32使用して、FPGAからSDカードのファイルにデータを書き込む必要があります。これがマイクロコントローラーの仕事です。マイクロコントローラーはFatFSを実行しています。これは、自分で確実に動作するようになっています。

マイクロコントローラーには少量のRAMしかないため、一度にバッファーできるのは少量のデータだけです。したがって、マイクロはFPGAからバッファーを読み取り、SPIモードを8ビットに変更してから、そのデータをFATFSに書き込む必要があります。SDカードをSPIモードに構成するには、SPIバスが400 kHzで動作しているときにコマンドを送信する必要があり、ある程度の待機が発生することを思い出してください。したがって、初期化を1回だけ実行したいと思います。

ただし、SDカードでCSをHighに保持しながらFPGAでトランザクションを実行すると、SDカードが奇妙な状態になり、初期化をやり直す必要があるようです。もちろん、これは望ましくありません。4kB程度のデータを書き込むために、初期化には数ミリ秒かかる可能性があるためです(これも、私のマイクロの小さなRAM機能によって制限されます)。数メガバイトをできるだけ早く書き込む必要があるため、これによりパフォーマンスが約500 kB / sから100 kB / s未満に低下します。

SDカードは技術的に完全にSPIに準拠していないことは承知していますが、この問題を解決するにはどうすればよいですか?


私の知る限り、それはそれを尊重するはずです。別のSDカードを試してみませんか?
マルコ2013年

これは素晴らしい質問です。質問(および回答)していただきありがとうございます。
2013年

回答:


7

わかりました、私は実際にそれを理解しました。私はもう少しググったほうがいい。MMC / SDCの使用方法に従ってバスを共有する場合、SDカードはSPIデバイスとまったく同じようには動作しないことがわかります。

SPIバスでは、各スレーブデバイスは別々のCS信号で選択され、複数のデバイスをSPIバスに接続できます。汎用SPIスレーブデバイスは、CS信号によってDO信号を非同期に駆動/解放して、SPIバスを共有します。

ただし、MMC / SDCはSCLKに同期してDO信号を駆動/解放します。これは、バスがMMC / SDCおよびSPIバスに接続されているその他のSPIスレーブと競合する可能性があることを意味します。右の画像は、MMC / SDCの駆動/解放タイミングを示しています(バスの状態を確認するために、DO信号が1/2 V ccに引き下げられています)。したがって、MMC / SDCがDO信号を解放するには、CS信号がディアサートされた後にマスターデバイスが1バイトを送信する必要があります。

SDカードとFPGAの両方がDOを駆動しようとした可能性があり、SDカードが失われたため、リセットされました。余分なバイトを送信することで修正されたようです。


これにより、FPGAとカードを切り替えることができます。また、データ転送中に中断して再開できることもわかりましたか?elm-chanに書かれていることから、それは不可能のように見えますが、あなたがそれを確認したのか反証したのか知りたいです。
krs013 2015年

1
はい、FPGAとSDを交互に切り替えても期待どおりに機能しますが、FatFSの呼び出し間の転送を中断することはできません。少なくとも私はそれを機能させることができませんでした。つまり、(たとえば)ファイルの書き込み中の割り込みに応答したり、共有SPIバスを使用してセンサーから読み取ることはできません。
Zuofu 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.