読者です 読者をやめる 読者になる 読者になる

Lynx-EyEDの電音鍵盤 新館

広帯域制御屋の駄文とか

とりあえず動くみたい

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_とかに置き換えて読んでください。
(ワードパッドの置換機能とかで置き換えてから移植すると便利かも)

f:id:Lynx-EyED:20080803172400j:image

これで32kHz,8bitモノラルは再生できます。
ADPCMなど圧縮ファイルならステレオでも行けるだろうと。

希望的観測…