AVRのUSARTでPCMオーディオ音が出た!
STM32F103を調べ始める(1/6/09)
SDカードPCMプレーヤーの開発はAVRでは挫折した。しかし、やりかけたら、とことんまでやらないと気がすまない性分である。このまま引き下がるわけには行かない。DACチップは結局動かさずにプロジェクトは中断している。チップにはまだデータが一度も流されていない。何とか音を出してやらないとこのままではDACチップが可哀そうだ。
で、当然、AVRに替わるターゲットは、例の雑誌付録(デザインウエーブ2008年5月号)のSTマイクロのARMプロセッサー、STM32F103ということになる(H8はMMCインタフェースが遅すぎて無理)。この基板は、SDカードをつけ、USBのマスストレージが動くところまで確認したが、その後は手をつけていない。クロック72Mhzの32ビットプロセッサーである。オーディオではなくビデオ関連の開発機として考えていたのだが、オーディオの出番がまわってきた。
こいつは、18MhzのSPIを2つ持っているし、DMAもある。スペック的には全く問題ない。しかし、何と言っても未経験であり、雑誌についていた開発環境すらまだインストールしていない状態だ。無償版の開発環境はフラッシュが32KBに制限されているが、当面は問題ないだろう。gccが、雑誌の後の号で紹介されているが、これは開発環境そのものをビルドするだけでも相当な手間がかかりそうなので先の話だ。
具体的な目標が出来たので、改めて雑誌の記事をもう一度詳しく読み直した。このARMに関する記事は、4号にわたって、かなり詳しく出ている。このうち3冊までは買ってある。しかし、自分の知りたいことは何も書かれていないことがわかった。開発環境のインストールや、DFUというUSBからファームを書き込むライターのインストール手順は詳しく出ているがその先がない。
少しまともなプログラムを開発をするために必要な具体的な情報が殆どないのだ。ソースが出ているのはLEDを点滅させる10行足らずのサンプルプログラムだけである。32ビットプロセッサーだけに豊富なペリフェラルがついている。これを使いこなすにはライブラリが必須だと思うが、記事には、その一覧表があるだけで、利用する手順は一切省略されている。せめて"Hello World"をどこかに出すくらいのソースコードでもあれば、ライブラリの使用例が見えるのだが、それもない。
この基板を使おうかというレベルの読者には何のたしにもならないSDカードソケットのハンダ付けの方法が何故か詳しく写真付きで解説してあったり、別売りの拡張基板の紹介にはページが沢山割かれているが、どうも何かずれている。せめてUSBの仮想COMポートのAPIの紹介くらいないか隈なく記事を探したが、それもない。やれやれ、ソースを見ろと言うことか。
記事はあてにならないことがわかったので、CD-ROMにあるサンプルプログラムのVirtualComPortのソースを調べ始めた。これは、ComPortになったUSBインタフェースからの送受データを、標準UARTのひとつとやりとりしているソフトである。例の長ったらしい変数と関数名をひとつひとつ調べて動きを追う。その結果、プログラムの構造がデバイス単位の割込み駆動になっており、これを母体に必要な処理を各割り込みルーチンに入れていけば、PCコンソールとのコマンドのやりとりで動くモニター程度は作れそうなことがわかった。
さらに7月号のフォトフレーム製作記事を読むうち、FATライブラリーもあることがわかった。早速ソースコードを出版社のサイトからダウンロードする。記事には説明がないので、これも、ソースからの解析が必要だ。いやいやAVRと同じような状況にするまでにはまだ相当時間がかかりそうである。
ブログのコメントでAVRに戻る(1/8/09)
いよいよSTARMでの開発を始めようかと考えていたとき、ブログに「Mega168にはSPIにもなるUSARTがあるはず」というコメントが上がった。確かにその通りだが、このUSARTはデバッグ用に既に使っており、データシートのボーレートの表を見ても、みな2Mbpsどまりなので諦めていた(ボーレートはクロックの1/8)。しかし、このコメントを見て、もういちどデータシートを詳しく調べ直してみたら、これは非同期のときで、SPIにすると、何と速度は、クロックの1/2までの速さで動くと書いてあるではないか。
これは、これは、気がつかなかった。ここに宝物が埋まっていた。SPIがあればDACのデコードは直打ちに比べ圧倒的に早くできる。光が差してきた。
STARMの研究を中断し、AVRに戻る。プログラムのデバッグ用のUARTを別のGPIOで組み直す作業に着手した。 初期に作ったソフトUARTが役に立つときである。空いているPORTCの適当なピン2つを送受ピンにしてソフトUARTを移植する。単純に移植できると考えていたが、そう簡単ではない。このソフトUARTはISPピン用でデータが正論理になっている。これを本来の負論理に替える開発が残っている。
これが結構、難物だった。年のせいでプログラムの中の細かいロジックをみんな忘れているのである。まず送信が出来ない。たいして複雑なコードではない。データの負論理化は上手く行っているのに、どうしても正しいデータがPCに来ない。悩んだ挙句、ロジアナのお世話になる。タイミングチャートを見ていてデータラインの初期値がLowであることに気がついた。UARTは非同期(スタートストップ式)の負論理なので、初期値はHighにしておかなければいけない。スタートビットがわからなくなる。
受信側も手こずった。アセンブラールーチンにばかり気をとられて、Cで書いた割込みプログラムのチェックを忘れていた。ピンチェンジ割り込みは、あらゆるピンの変化で割り込みが起きるので、特定の割込みだけに反応するようにCのプログラムでフィルターをかけている。ここでもスタートビットの論理を逆にすることに気がつくのにえらい時間がかかった。結局、UARTの移設は半日仕事になった。
遅くなった理由は他にもある。久しぶりに新しいサブノートPCを新調したのだ。ネットブック(EeePC S101)である。それとこれにつけるポータブルDVDドライブ(DVSM-P58U2)。10インチディスプレイのサブノートPCが6万円台で買えてしまう時代である。このあたりの技術は、少しフォローを怠っている間に、驚異的な進歩を続け、追いつくのに大変だ。DVDはいつのまにか2層の8GBになっているし、無線LANどころか、Bluetooth、ウェブカメラまでが、標準でついている。Let'sNoteの初期のサブノートを30万近く出して買ったのは、10年ちょっと前の話だ。久しぶりのPCまわりの買い物に電子工作のほうが少しご無沙汰になった。
遂にPCMオーディオの再生に成功。しかしひどい音(1/9/09)
去年の暮から取り組んでいたSDカードから読むPCMオーディオファイルの再生に遂に成功した。音はまだ歪みだらけのとても聞けたものではないが、とにもかくにもMega168とDACチップだけで、SDカードを読んで、16ビットステレオDACが動いた。いや嬉しい。
きっかけは、前にもお世話になったブログのkugaさんのコメントである。デバッグ用のUARTがソフトUARTを使って他のピンで動いたので、空いたUSARTをデータシートどおりMSPI(マスターSPI)に変更した。Atmelのデータシートは、この部分がかなり詳しく書かれており、設定はとても楽だった。設定さえ出来れば、割込みルーチンのコードはもっと簡単である。SPIのデータレジスターに2バイト放り込んだ後、送信終了を確かめることなく直ちに本体に帰るだけである。LRCKのトグルは、割込み直後に行う。サンプリング周期を厳密に守るためと、一刻も早く割込みを抜けてオーバーヘッドを減らすためである。送ったデータのデコードは次のサンプリングで行われ、ファイルアクセスとDACデコードは同時に動くことが可能になる。
出力ピンをロジックアナライザーに接続し、動かしてみる。おお、やった、やった。見事にデータが想定どおり出力され、WAVファイルも最後まで読んだ。割込みのオーバーヘッドはどうだ。うむ、バッファーにデータを放り込むだけなので、1.8μsしかかかっていない。これは優秀だ。LRCKのトグルとデータ送り込みの間に時間がかかっているのがちょっと気がかりだが、タイミングチャートとしては完全だ。
いよいよ、アナログ出力の検証である。ヘッドフォンをBU9480Fのoutputにつなぐ。出た。いやシャーッというノイズだけでまだ音になっていない。ただ、音をだしていると思われる期間だけのノイズなので何かしら出力が出ていることには間違いない。これはアナログではなくてデジタルの問題だ。
タイミング的には、全く問題ない。16ビットが正確にLRごとに出ている。そうするとデータか。WAVフォーマットをもういちどチェックする。なになに、データは「インテルフォーマット」とある。む、もしかしてリトルエンディアン? DACのデータシートを見る。こちらはMSBファースト。えーっと、これ違うよね。あわててウェブで確かめる。
そうだった。インテルフォーマットとは、リトルエンディアンでLSBファーストのことだ。これが原因か、音がノイズになるのは。2バイト送り出す順番が逆になっているからだ。あわてて順序を変えコンパイルし直す。
ヘッドフォンをつないで音を出してみる。よーし、それらしい音がでた。音は歪みだらけで、まともな音になっていないが、確かにPCからSDカードに移したWAVファイルの楽器の音である。非圧縮PCMオーディオには程遠い音とはいえ、とにかく一旦は諦めたAVRでのデジタルオーディオ再生に成功した瞬間である。ささやかな成功の余韻に浸る。kugaさんありがとうございました。
さて、これから本来のPCM音声にする作業が残っている。デジタルのところは少し調べようがないが、アナログはまだ何も手が付いていない。ヘッドフォンを直接DAC出力につないだだけである。適当なローパスフィルターとアンプでDACに負担をかけないように音をだせば、良い音に戻るのではないか。正弦波のWAVデータを作ってテストすれば解決が早いかもしれない。
| 固定リンク
「AVR」カテゴリの記事
- ソフトI2Cはクロックストレッチまで手を出してあえなく沈没(2017.09.02)
- オシロのテストどころかソフト開発で大はまり(2017.07.26)
- 超音波方式の人感センサーI2C化と新しいオシロ(2017.06.29)
- motionの動体検知はRaspi3の電源が安定しない(2017.04.16)
- 赤外線学習リモコンはデータ再現で挫折したまま進まず(2016.07.21)
コメント