● 実験環境
■ 使用マイコン
・マイクロ・チップ社の、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が書かれていますが、本テーマでは使用していません。