● 実験環境

  ■ 使用マイコン
    ・マイクロ・チップ社の、16bitマイコン_PIC24F,PIC24H,dsPIC30F等
  ■ 基板製作
    ・基板CADを使ってパターンを起こしたいところだが、金欠病なので、全てユニバーサル基板にて
     手作業で製作
    ・2011年10月より、基板CAD:EAGLEによるパターン化を始めました。
  ■ 回路図CAD及び、シンボルエディタ
    ・水魚堂の、「Bsch3V052」、「LCoV」
  ■ 開発言語
    ・C言語

  ■ 
コンパイラ
    ・
マイクロ・チップ社の、「MPLAB C30」
  ■ プログラマ

    ・マイクロ・チップ社の、「PICkit2」

  ■ 測定器
    ・テスター2台(内1台は、10MHzまでの周波数計付き)

    ・ソフト・オシロ2(フリーのソフトで、100Hz〜5kHz位ならFFT解析も含めて十分実用になります。)

    ・自作オシロ: PIC24H使用(1CHのみですが、1Hz〜40kHz位まで十分実用になります。)
    ・自作周波数カウンタ(パルス発生器付): PIC24F使用(10Hz〜50MHz, 出力は、0.1Hz〜3MHz)
    ・自作ファンクション・ジェネレータ: dsPIC30F使用(10Hz〜50kHz, 正弦波・三角波・矩形波・鋸波)



● 実験テーマ1

「PIC24F_MP3プレーヤ」の顛末記

■ 2011.01.08
  <ハード案>

  ・CPUは、PIC24FJ64GA002を使用
  ・記録メディアとして、SDカードを使用
  ・MP3ファイルのデコーダICとして、VS1011Eを使用
  ・デバッグ用にRS232Cポートを設ける。

  <機能案>
  ・とりあえず、下記の通リ、PICの大御所、後閑哲也氏の「電子工作の実験室」の製作例に準拠する形
   で進めようと思う。

   @ 電源ONで任意の「*.mp3」ファイルあるいは、「*.wav」ファイルを見つけて再生を始める。
   A そのままにしておくと、SDカード内にあるMP3ファイル及び、WAVファイルを順番に再生し全部終
      わるとまた最初から再生しなおすので永久に再生する。
   B 曲をスキップしたい時は、スキップSWを押すと直ぐ次の曲に移動する。
   C その他のSWとしては以下を予定するが、とりあえずハード的に用意しておくだけにする。
      SW1,2:音量のアップダウン(とりあえず音量は固定値)
      SW4 : 低音ブースト(とりあえず低音ブーストOFF固定)

  <プログラム作成計画>
  ・とりあえず、SDカード抜きで、VS1011e単体のチェックとしてVS1011eに内蔵された正弦波発生のテス
   トモードを動かしてみようと思う。

   テストシーケンスの超概略は下記に示す通りである。
   @ SW1が押されるまで待機
   A 押されたら、正弦波発生のテストモードを駆動

   B テストが終了したら、SW1_ON待機に戻し繰り返す。




 

 


■ 2011.02.19
  ※ 2011.01.08〜2011.02.19までに起きた様々な顛末を、
「ここらで結果総括」ということでまとめて
    みました。
(この時点では、SCLK=1M(設計は4M)でのMP3ファイルの再生が出来ませんでした。)
 1.これまでの結果まとめ
  (1) 再生できたファイル形式等
    @ WAVファイルの再生時間が本来より長くなってしまうのは、SCLK周波数が高かったのが原因
       していた。(4MHzを1MHzに落したらOKになった。)
      A 問題のWAVファイル:16bit, ステレオ, 48kサンプルは再生不可だが、以下のフォーマットの

       WAVファイルは再生できる。
       ・8bit, モノラル, 44.1kHzサンプル(時々波形崩れ確認)
       ・8bit, モノラル, 48kHzサンプル(時々波形崩れ確認)
       ・16bit, モノラル, 22kHzサンプル(楽曲再生)
       ・8bit, ステレオ, 22kHzサンプル(楽曲再生)
    B MP3ファイルは、SCLK=1MHzのままでは、突発ノイズのひどい、早送りのような音のなり、再生
       不可。但し、
SCLKを4MHzから166kHzまで下げると、それまで早送りのように聞こえていた楽音
       が正しい再生時間になり楽音として判別できるようになるが、突発ノイズや途切れが発生しとて
       も実用にならない。

  (2) これまでやってきた試行結果
    @ VS1011e内蔵のサイン・テスト・モードを5kHzに設定して動かすと、ヘッドフォン出力に綺麗な
       サイン波が出力されピー音が鳴る。
    A SCI(コマンド転送)は、ライト/リードともに問題ないことを確認した。(BASS及び、VOLUME
       設定値をSCIで書込んだ後、SCI_BASS, SCI_VOLレジスタを読込むと期待通りの値が読める。)
    B SDI(データ転送)は、WAVヘッダ情報の、ライト/リードに関しては問題ないことを確認した。
      (デコード中に、SCI_AUDATA, SCI_HDAT0, SCI_HDAT1レジスタを読込むと、それぞれ期待した
       通りの値(AUDATA=0xBB81(48001), HDAT0=0x7761, HDAT1=0x7665)が読める。)
    C VS1011eが破損しているのではと思い新品に交換したが症状は同じ。
    D 最初に出くわした症状で、「音が出ない」は、SCLKラインに22pのコンデンサを追加することに
       より解決。(22pが最適値であった。)
    E Dの現象は、SIに対するセットアップ時間が、きわどいことによる誤動作と考えられるので、
       HC4050ゲート分の遅れでも試したが改善は見られなかった。
    F PICとVS間のPCMデータ転送のハンドシェーク信号であるDREQのレベルが不足気味のように
       感じたので、PIC内部プルアップ10kをやめ、外部プルアップの2.2kに変更したが改善見られず。
      (レベルは確かに上がったが...)
    G 1度に転送するバイト数に関係しているのかと思い、256Byteを512,1024,2048に変更しても
       症状変わらず。
    H 32Byte毎に、DREQ(xBusy or Ready)状態監視を試すが、症状変わらず。

  (3) ハードウエアFIXの実施理由
    @ SPIラインにバッファIC追加
     → アイドル時のPCノイズの影響を極力少なくするため。

       (聞いた感じ、若干の改善が見られた。)
        22pの追加だけでは波形が鈍るだけなので波形整形の意味で入れた。

        またDREQに関しても同様である。

  (4) 推定原因
    @ WEBプログの例にあるように、PIC24FのSPIバグによるものかもしれない。
      (2008年版PIC24Fでは問題なく、2009年以降のPICで問題あり。
       さらに不可解なことに問題のない2008年版のPICはSPIにバグがあり、2009年版のPICでそれが
       改善されている矛盾があること。またこれを試そうと2008年版のPICを注文できるか問合せをした
       ところロット指定での注文はできないとのことで試行はしてない。)
    A WAVヘッダは正常にSPI転送できているのに、再生音がおかしくなるのは、PCMデータ部になると

       SCLKとSIの同期が微妙にずれてくるのではないかと考えるが、何せ高速オシロが無いのでその
       辺の検証が出来ない。(フリーのソフトオシロ2で、SCLKを極端に低速にしてSIとのタイミングを見
       ると、ちゃんと立上がりに同期しているように見える。)

  (5) これからの予定
    @ 当面WAVファイルのみで使うことにする。
    A ファイル名表示バージョンとしてソースを整理
    B 次期テーマとしてファイル表示+WAVフォーマット表示のバージョンを作成

  (6) その他バグ修正メモ
    @ SKIPスイッチを速く押すとハングアップ
     → 232C転送時、CN割込みを禁止することにより解決
    A SKIPスイッチを速く押すと、2曲先に進むことあり。
     → 状態変化割込みルーチンにチャタリング防止遅延追加で解決
    B CN割込みの最後で割込みフラグをクリアすると、エッジ変化割込みにならずレベル割込みになって
       しまう。
     → CN割込みの頭で割込みフラグをクリアすることにより解決
    C 最後の曲を再生中にSKIP_SWを押した時、最初に戻るが再生しない。
     → リピート再生と同様に、後閑氏のソース(CN割込みルーチン)に下記の誤記と思われる箇所あり。
      <誤記と思われる部分>
       リピート部の最初のファイルサーチのところで、
       // File End Then Repeat from First
       FindFirst("*.*", ATTR_ARCHIVE, rptr);
       とやっているだけで、resultに戻り値を入れてなく、result=0でのファイルオープンが抜けていた。

      <以下のように修正しOKを確認した>
       // First File Search (A Precondition: Loute Only Be MP3 File)
       result= FindFirst("*.*", ATTR_ARCHIVE, rptr);
       if (result == 0) {
         pfile= FSfopen(Record.filename, "r"); // File Open (Read Mode)


■ 2011.03.06
  
※ 「最終結果総括」として、今迄の顛末をまとめてみました。
 1.問題点と、その原因、対策を解明した順に列記
  (1) 問題点1: SINE_TESTとWAV再生で時々音が鳴らない。
     原因: PIC24FのSPIタイミングがきわどい為の誤動作
         SCLKのSIに対するセットアップ時間が規格上ギリギリである。
         (VS側の要求:-26nSminに対し、PIC側のSCLKの立上りから、SDOデータ出力有効までの
         時間規格は、30nSなので要求を満たさない。)
     対策: SCLKラインに22pFのコンデンサを入れSIに対しSCLKエッジの位置を遅らせた。
         Cだけだと波形が鈍るだけなので、安定化のため波形整形も兼ねHC4050のバッファICを挿入
         尚、他のSPI信号(SO, SI)にもタイミングバランスを取る為、バッファIC挿入した。
         (Cだけでも動くことは動く。)

  (2) 問題点2: SCLK=4MHzでは、WAV,MP3ともに再生時間が合わない。
           具体的には、WAVは再生時間が長くなり、逆にMP3は短くなって早送りのような音になる。
           (WAVに関しては、SCLKを1MHzまで下げると再生時間が合うようになり再生音も正常に
           なるが、MP3はさらに166kHzまで下げないと再生時間が合わず突発ノイズがひどく実用
           にならない。)
     原因: 回路図CADでの新規シンボル作成時、VS1011eのシンボルに32pinのてSTpinが抜けていた
         ことに気が付かず、配線もしておらずTESTpinがオープンになっていたため外部ノイズでこの
         端子に割込みが入り突発ノイズが発生していた模様。
         またTESTピンがオープン時にVS1011eの初期設定が終了した後、DREQをテスターで測定
         すると、1.48V(また周波数レンジでは何故か6.14Mを示す)しかなくDREQが正しく出力され
         てなかったせいでDREQの状態を正しく判断できず、PICからのデータ転送タイミングがずれて
         いたため再生時間が合わなかったと考えられる。
     対策: 
VS1011eのマニュアルに従いtestピンをDVDDに接続した。その結果、
         @ SPI転送速度4MHzで、MP3ファイルが再生できた。
         A SPI転送速度4MHzで、WAVファイルが再生できた。

            但し、データ量の多い16bit, ステレオ, 48kサンプルのファイル再生は相変わらず音が
            断続的になる。 
         B アイドル時の、DREQのレベルが正常に3.23Vまで上がった。

  (3) 問題点3: アイドル時のノイズが多い。
     原因: DGNDと、AGNDの配線に問題(両者分離されておらず、結果1点接続になってなかった。)
     対策: 配線引回しを修正しデバイス直近で1点接続した。
         その結果、アイドル時のノイズは殆ど気にならないほど減少した。

  (4) 問題点4: データ量の多い16bit, ステレオ, 48kサンプルのWAV再生音が断続的になる。 
     原因: 1kHzサイン波発生のWAVファイルで考えると、次のように説明できる。
         ビットレートが増えるほど、1cycle当りのバイト数が増
えるのでPIC側のBufferサイズ:256byte
         の容量で1度に転送できる1kサイン波のサイクル数が減少するためにVS1011e側への新規
         データの転送が間に合わなくなって途切れが発生すると思われる。
         試しに、
現在のハード+ファームで再生できるWAVファイルの限界ビットレートは、いったいどの
         位なのか、リサンプリングソフトで様々なビットレートの
サイン波1kHzを発生するWAVファイルを
         作り実験してみた。
         → 結果、限界は512kbyte(8bit, ステレオ, 32kサンプル)であった。

         また現在のSDリード→VS側へのSPI転送を繰り返す直列方式の処理では、SDリードの間、VS
         側への転送が途切れるので、PICからのデータ転送が間に合わなくなる状態がさらに起こりやす
         くなると思われる。
     対策: 直列処理でなくダブルバッファ等による並列処理を検討する。
         例えば、バックグランドでSDリードしフォアグランドでSPI転送するイメージをなんとなく考えている
         これは次のテーマにしようと思っている。

  (5) その他
    ・DREQは、PIC-VS間の重要なハンドシェーク信号で高速に動いているようなので、現ハードではここ
     にもバッファICを入れバッファ出力に強めの2.2kプルアップ(PIC内蔵プルアップは未使用)を接続して

     ある。

     またバッファICなしの実験ができるようにバッファスルーのプラットフォームも用意した。

     (ちなみにバッファなしでも動く。) 


※ 全体の最終回路図はこちらから→「PIC_MP3プレーヤ回路図_110308」
  尚、本回路図には、Line入力アンプと液晶I/Fが書かれていますが、本テーマでは使用していません。


← TOP PAGEに戻る    実験テーマ2へ →