USB Mass Strorageでディスクの残り容量が間違っている原因がわかりました。MSCに関連するUSBの処理の方を中心に見ていましたが、原因はSDカードからの読み取りの方にありました。いままで短いテキストファイルを読み出す程度の試験しかしていなかったので気づかずにいましたが、ATMELのライブラリコードがちょっとおかしいようです。
まずは、問題の症状から。参考にしたATMELのライブライのコードでは、SD/MMCからの読み出しにCmd18 (Read Multiple Block)を使っています。例えば、ブロック#200から2ブロックを連続して読みだすと、合計1024バイトを連続して読みだします。
ところが、この2ブロックを1ブロックづつに分けて読み出すと。。。
なんと、2ブロック目であるブロック#201の最初の部分が読めていないではありませんか。そこで、もう一度#201を読み出してみると、
今度はちゃんと読めています。こんな怪しい動きをしていたのが影響してちゃんとFATを読めていなかったようです。
トレースからもわかるように、連続したブロックを2度に分けて読み出した時には、新たなコマンドは投入されていません。Cmd12を入れるまではCmd18が生きていますので、ライブラリの設計者は最初のブロックの読み出し終了時にいったん止めておいたクロックを再投入してやれば、読み出しの続きができるだろうと考えたようです。ところが、実際には最初のブロックの読み出し終了後、SDカードにはクロックがいくつか送られてしまいデータが読み捨てられてしまっているのではないかと思われます。
ここは素直に、一度に複数ブロックを読むのであればCmd18を、1ブロックしか読まないのであれば、Cmd17を使うようにしてやれば問題は修正できるでしょう。ソースを読むと、書き込みも同じ処理になっているので、こちらも修正が必要なようです。FatFsを使って音声を録音した際にも同じ問題が発生していたのかもしれませんが、クラスタ単位で連続して書きこんでいるために音声のとびには気が付きにくかったのかもしれません。
まずは、問題の症状から。参考にしたATMELのライブライのコードでは、SD/MMCからの読み出しにCmd18 (Read Multiple Block)を使っています。例えば、ブロック#200から2ブロックを連続して読みだすと、合計1024バイトを連続して読みだします。
ところが、この2ブロックを1ブロックづつに分けて読み出すと。。。
なんと、2ブロック目であるブロック#201の最初の部分が読めていないではありませんか。そこで、もう一度#201を読み出してみると、
今度はちゃんと読めています。こんな怪しい動きをしていたのが影響してちゃんとFATを読めていなかったようです。
トレースからもわかるように、連続したブロックを2度に分けて読み出した時には、新たなコマンドは投入されていません。Cmd12を入れるまではCmd18が生きていますので、ライブラリの設計者は最初のブロックの読み出し終了時にいったん止めておいたクロックを再投入してやれば、読み出しの続きができるだろうと考えたようです。ところが、実際には最初のブロックの読み出し終了後、SDカードにはクロックがいくつか送られてしまいデータが読み捨てられてしまっているのではないかと思われます。
ここは素直に、一度に複数ブロックを読むのであればCmd18を、1ブロックしか読まないのであれば、Cmd17を使うようにしてやれば問題は修正できるでしょう。ソースを読むと、書き込みも同じ処理になっているので、こちらも修正が必要なようです。FatFsを使って音声を録音した際にも同じ問題が発生していたのかもしれませんが、クラスタ単位で連続して書きこんでいるために音声のとびには気が付きにくかったのかもしれません。