dsPICと比べてFATが仲介していることもあり、SDCardモジュールの転送速度はかなり遅いです。
音声が全く再生できないくらい。
…でもない。工夫次第では。
たとえば音声再生時にFATが必要なのは
1.ファイル名からポインタ取得
2.ファイル開始アドレス取得
3.EOFは何処か
くらいです。
であるならこれ以外は直にSDCardとSPI通信をすればよいのです。
具体的には
1.sdcard_fs.c(デフォルトだとsdcard_1_fs.cだと思います)の"下請け関数"を直接使うようにする
2.int型変数はSDCard制御時はできるだけ使わない(char型を使う)
3.SDCard読込みはCPU負荷の少ないCMD18(Open-Ended Multiple Block Write)を使う
4.DACはDAC8を使うか、DAC9のTwoByteSignAndMagnitudeでCPU負荷を減らす
を心掛けるとこうなりました。
DAC8_1_Start(DAC8_1_FULLPOWER); SDCard_SendTxData( 0xff ); while( ! (SDCard_bReadStatus() & SDCard_SPIM_SPI_COMPLETE ) ); //transfer complete? SDCard_Cmd(0x40 + 18, 0); //CMD18:Open-Ended multiple block write Start SDCard_GetR1(); while(1){ SDCard_SendTxData( 0xFF ); while( ! (SDCard_bReadStatus() & SDCard_SPIM_SPI_COMPLETE ) ); //transfer complete? Data = SDCard_bReadRxData(); if(Data == 0xFE) // Set check to Single Block Read data token { LP1 = 255; //LP1:Char-type Loop Counter do{ SDCard_SendTxData( 0xFF ); while( ! (SDCard_bReadStatus() & SDCard_SPIM_SPI_COMPLETE ) ); Data = SDCard_bReadRxData(); // 1byteデータリート DAC8_1_WriteStall(Data); //LP1は255までしかカウントできないからもう1回同じコードを繰り返して512byte = 1blockとする SDCard_SendTxData( 0xFF ); while( ! (SDCard_bReadStatus() & SDCard_SPIM_SPI_COMPLETE ) ); Data = SDCard_bReadRxData(); // Read the data byte DAC8_1_WriteStall(Data); }while(LP1-- != 0); SDCard_SendTxData( 0xFF ); while( ! (SDCard_bReadStatus() & SDCard_SPIM_SPI_COMPLETE ) );//Receive CRC SDCard_SendTxData( 0xFF ); while( ! (SDCard_bReadStatus() & SDCard_SPIM_SPI_COMPLETE ) );//Receive CRC } }
※SDCard_は適宜SDCard_1_とかに置き換えて読んでください。
(ワードパッドの置換機能とかで置き換えてから移植すると便利かも)
これで32kHz,8bitモノラルは再生できます。
ADPCMなど圧縮ファイルならステレオでも行けるだろうと。
希望的観測…