V-USBはATmega328pのビルトインSPIをどのようにねじ込むことができますか?


14

ATmega328pを使用してキーボードとして表示されるV-USBプロジェクトに取り組んでいます。USB部分はうまく機能しています(最初のV-USBプロジェクトではありません)が、でV-USBスタックを開始した後usbInit()、SDカードライブラリへのすべての呼び出しが失敗します。以前usbInit()に同じ関数を呼び出した場合、すべてが完全に機能します。

Diavolinoと呼ばれるArduinoクローンを使用していますが、Arduino / wiringフレームワークは使用していません。USBをデジタルI / O 2および3に接続し、SDカードを10-13(内蔵SPIライン)に接続しています。

SDカードライブラリを調べたところ、以外の割り込みまたはレジスタを使用してその兆候は見つかりませんでしたSPxx。私もgrepV-USBコードを使いましたが、SPxxレジスターにさえ触れません。

問題の最初の兆候は、SDカードにアクセスすることになっているときにデバイスが切断されたときでした。それから私は置きますusbPoll()wdt_reset()、すべてのSDカード処理ループて呼び出しますが、書き込みの場合、カードは最後の2バイト(CRC-16)を送信した後、カードからの確認応答を永久に待機します。

私が使用するSDカードライブラリはsd_raw、Roland Riegelによるものです。


2
V-USBは非常にCPUに負荷がかかり、SPIルーチンに許容できない遅延が発生する可能性があることを理解しています。通常、SPI操作はタイミングに敏感ではありませんが、SPI FLASHでの書き込みおよび消去操作は間違いなく重要です。
デイブツイード

問題は、読み取り操作でさえほとんどの時間機能しなかったということです。私が読んだように、実行中のコードによってデータおよび制御レジスタが設定されるとすぐにSPI通信が独立して行われます。
dnet

@DaveTweed-はい、カードを待たなければならないという点では時間に敏感ですが、プログラムをカードを待たせ続けることができないという点では??
クリスストラットン

2
起こりえない、または検出できない何かを待っている可能性があります。たとえば、I / Oピンが再構成されて入力でなくなったり、カードに不要なデータ/クロックが送信されてカードが望ましくない状態になった可能性があります。また、SDライブラリが必要な遅延を達成するメカニズムが破損または加速していないことを確認してください。
クリスストラットン

3
ノイズや電源の問題もあります。スコープでレールをチェックし、ロジックアナライザでSDラインをチェックして、何が起こっているのかを確認します。
ジム・パリ

回答:


1

USARTでそのような問題が発生しましたが、ウォッチドッグの設定を変更することで解決しました。ご存じのとおり、V-USBはウォッチドッグを使用し、1つの操作に余分な時間をかけると、ウォッチドッグがアクティブになります。ウォッチドッグを非アクティブにしてみて、すべてがうまくいく場合は、ウォッチドッグ時間を変更するか、干渉コード(ケースのSDカードコード)を小さな部分に分割し、それらの間でウォッチドッグを「リセット」できます。ただし、デバッグ後にウォッチドッグを再アクティブ化することを忘れないでください。それなしでV-USBを使用することは推奨されません。


質問では、wdt_reset()呼び出しがSDコードに挿入されることに言及していることに注意してください。もちろん、これはどこでも行われなかった可能性があります。
クリスストラットン

1
はい。ただし、ウォッチドッグを無効にしてコードを試すことは本当に価値があります。特に、返されるデータが割り込みルーチンで処理されると、コードがそこでスタックし、リセットされる前にウォッチドッグがアクティブになることがあります
8月
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.