いよいよ、SDカードからの再生にチャレンジしました。FAT32限定で、ショートファイル名を指定して再生できるようになりました。
SDカードはChanさんのサイトにある「MMCの使いかた」を参考にさせていただきました。Chanさんに感謝。
曲名の指定等はすべてシリアル通信経由にしました。あと、本家VLSIで公開されているスペクトラムアナライザーのコードを導入してみました。通信画面のカーソル左横にあるのがそれです。標準だと14バンドごとに0~31(3dBステップ)の値が得られるようになっているので、簡単です。
ちなみに、ハマった点がいくつか。SDカードのVS1011eへの書き込みコマンドや読み込みコマンドの直後、DREQが一旦Lになったあと、Hに戻るのを確認しなければなりません。(ちゃんとデータシートにも書いてありました)。それを確認せずに次のコマンドを実行しても、無視されてたり、値が違っていたりします。
それと、SDカードに直接は関係ないですが、MBR(マスタブートレコード)のファイルシステムタイプが要注意でした。今回はFAT32のみ対応のつもりだったのですが、FAT32でフォーマットしたはずのSDカードで、MBRのファイルシステムタイプが0x06(FAT16)となっていました。フォーマットしたときにMBRを書き換えてない可能性が高いですね。パーティションを分ければ当然MBRの編集がかかるはずですが。(でもSDカードでパーティション分けてる例を見たことがないです(笑))。そうなると、ファイルシステムタイプはチェック対象に入れない方がいいような気がしました。
それにしても、メモリが少ないのはつらいですね。今回使っているATmega168では1KBなので、スタック等で最低限必要な分を除くと、2セクタ入らないんです。やっぱり効率的なSDカードアクセスには、FATやディレクトリエントリを読むためのバッファと、MP3のデータを読むバッファの最低2つは確保したいところ。しかも、MP3の再生と同時にSDカードの別ファイルを開くとかとなると、音切れ防止のためにはMP3データバッファがいくつも欲しいです。
秋月で最近扱い始めたATmega644Pを注文したので、届いたら切り替えてみます。メモリが4KBなので、それなりに色々出来るんじゃないかな…。