2021年8月27日金曜日

SANYO LC7881 DAC その18(Visual C++編)

PIC32MXを複合デバイスにしたので、それと通信するソフトを
作成した。

元々HIDとの通信は過去にやった事があるので、そのファイルを
探してきた。Visual Studioで作っていたが、作ったのは5年前
だった。Visual Studioを使ったのはこのプログラムだったので、
長いことWindowsプログラムはしていなかった様だ。

以前は使用するパソコンとの関係で、Windows XPでも動作する
様にコンパイルしていたが、もうWindows 10より古いOSは使わ
ないだろうから試しにVisual Studio Community 2022 Preview
を入れてみた。

5年前のプログラムなのですっかり忘れていたがC++言語部分は
同じなので、とりあえず動くものが出来た。HIDのコントロール
方法はうっすら覚えている部分もあるが、プログラムの通信部分
の内容は全然判らなかった。

PIC32MXとHID通信し、各種情報やバッファのサイズ等を取得し、
ログをファイルに保存する様にした。

PIC32MXと通信するのでVisual StudioとMPLABを同時に起動して
プログラムを調整するのはなかなか面倒だ。

HIDが追加された為に処理時間が増えたのか、バッファの数値に
バラツキが増えた様だ。

2021年8月25日水曜日

SANYO LC7881 DAC その17(PIC32MX編)

PIC32MXのUSB Audio部分は概ね問題無いと思うが、
長期試験するにあたりPIC32MXの状態をRS-232Cで
通信するのはケーブルが2本になる上に変換基板まで
ついて面倒だと考えた。

以前書いたUSB複合デバイスにする手は無いかと再度
調べたところ、古いMicrochip Application Librariesに
サンプルがある事が判った。サンプルを調べたところ、
異なる種類の複合デバイスではUSB Framework内で
パケットを振り分けてくれるみたいなのでプログラムは
追加するデバイスの分を書き足せば良いだけで、思った
よりは簡単だった。

初めてだったので手順が判らなかった。複合デバイスを
作る為にこのブログを見つけた人の為にお勧めの手順を
書いておく。

①主となるデバイス(私の場合はUSB Audio Class)を
動作する状態にする。

②①で作ったプログラムのusb_descriptors.cを編集し、
主となるデバイスの部分をコメントにして、副となる
デバイス(CDCやHID)のdescriptorを書く。この状態で
①で作った状態のプログラムに副となるデバイスの
プログラムを追加し、主となるデバイスのプログラムが
ある状態で単独で副となるデバイスのみで動作させる。
(CDCやHIDの単独デバイスで完全動作を確認する。)

③descriptorの内容を主にすれば主のみが動作し、副に
すれば副のみが動く様になる。この状態が完成したら
descriptorを複合デバイスに変更する。

注意点はusb_config.h内に書くインターフェースIDと
エンドポイントがそれぞれデバイスで異なる様にする
事だ。

複合デバイスにを考える時にCDC(仮想COMポート等)に
するかHIDにするかを考える必要がある。CDCの場合は
ドライバが必要になる。仮想COMポートにする場合、
Microchip Application Librariesにドライバがあるが、
このPID/VIDは当然AudioのIDと異なる。PID/VIDを
CDCと同じにすれば動くかもしれない。ドライバ内に
書いてあるPID/VIDを変更すれば良さそうに見えるが、
変更すれば署名が要求される可能性がある。一方HIDの
場合はRS-232Cの様にターミナルソフトで接続できない
のでWindowsのプログラムを書く必要がある。考えた
結果、過去にPIC16F1454でHIDを作った経験がある
のでHIDにする事にした。

ここまで作ってから書くのも何だが、複合デバイスに
したのにサンプルプログラムのPID/VIDをそのまま使う
のも何だと思う。仕方が無いからマイクロチップ社の
ページでPID/VIDのサブライセンスを申請した。

2021年8月22日日曜日

USB DAC自作考察

PIC32MXプログラムの改良を検討したが、Windows
Audio Classの場合はどうやってもパソコンからの
データー垂れ流しになる。ふとパソコン側のソフトも
自作になるがHIDクラスで作れば良いのでは?と思い
考えた。

HIDクラスでPIC32MX側からバッファの容量に応じて
データを送ってもらい、リングバッファに入れて現在の
I2Sで再生させるだけだ。パソコン側はプログラムが
面倒なのでwav専用となるだろう。

この状態でハイレゾになるとどうなるか考えた。USB
Audio Class 1.1では192kHz 16bitが限度と書いていた
のを思い出したから検索してみたらUSB Audio Class
の限度でなく転送モード(Full-speed)の限度だった。
どうもUSB2.0対応マイコン+High-speedでもっと
上のハイレゾが使える様だ。こうなってくると、
USB Audio Classの1.1と2.0の違いが良く判らないが
それは置いておいてUSB2.0 High-speed対応マイコン
が必要なので調べた。

今使っているPIC32MXはFull-speedだった。PIC32MZ
ならHigh-speedみたいだ。しかし秋月で1100円もする。
もっと安いのは無いか調べたらATSAM3U1Cが安そうだ。
しかし、こいつは・・・。

まあ簡単に書くと、amanero combo 384の互換品でも
買って自作ファームを書き込めば良いと言う事だ。その
方がハードを自作するより安そうだ。特殊なDACチップ
の場合は付属の水晶モジュールを交換すればOKだし、
変換回路もCPLDに書けて非常に都合が良い。まあ
プログラムしたいならの話だが。

結論はPIC32MXでは現状か192kHz 16bit迄の拡張とし、
それ以上は素直にamanero combo 384を買って使う
のが良いだろう。

訂正:386→384

2021年8月16日月曜日

SANYO LC7881 DAC その16(PIC32MX編)

土日でプログラムリストやマイクロチップのPDFを見て、
うまく動作していない部分の検討をして本日テストした。

結果としては、色々試したけど駄目だった。問題点はこの
CPUの仕様として理解して回避する事にした。

・起こっていると考えられる問題点
DMA割り込み処理中に何か条件(たぶんUSB割り込み)が
発生すると「DMA割り込み処理を中止」し、その後で再度
「DMA割り込み処理を最初から実行」する。「実行」後は
先に「中止」した処理はたぶん実行しない。

・回避法
DMA割り込み処理中は同じプログラムを2回実行しても
トラブルが発生しない様に割り込み中に変数は変更せず
実行済フラグを立て、割り込み処理後にメインループで
フラグを確認して変数計算を行う。

割り込み関係なのでプログラム上で何らかの回避方法が
ありそうだが、テストした範囲と資料の範囲では解らない
ので仕方がない。

この感じだと、元々のサンプルプログラムも同じ症状だと
推測されるので、サンプルプログラムを改造する人は注意
して頂きたい。

2021年8月13日金曜日

SANYO LC7881 DAC その15(PIC32MX編)

ハードが一段落してPIC32MXのプログラムを改良中。
以前からやっている内容を含めて記載する。

オリジナルのプログラムはUSB受信バッファが2組あり、
それをPINGPONGバッファと呼ぶバッファに交互に保存
する。実際のところ、このPUNGPONGバッファは解読
しようとしたが、いまひとつ良く理解できなかった。
オリジナルプログラムの問題点はUSB受信バッファと
PINGPONGバッファが2重になっており、転送に時間が
かかる可能性があるところだ。

まず2組あるUSBバッファを1つに減らし、PINGPONG
バッファをリングバッファにした。リングバッファに
すると、DMA転送データ数を受信数と分離できる利点が
ある。うまく設定するとUSB受信バッファからmemcpyで
データを転送する事も可能だ。

次に考えたのがUSB受信バッファを複数配列で用意し、
その配列バッファをリング状にしてUSB受信のバッファと
データー転送用バッファを一体化してデータ転送回数を
減らした。この場合はUSB受信時のバイト数も配列で記録
する必要がある。

ここまでやったが、パソコンとPICMX32のクロック差で
データの余りや不足を修正するタイミングを調整する部分
がどうも旨く動かないのでどうしようか悩んでいた。

ここまでが以前に作った部分。

今回はリングバッファにUSB受信データを直接保存する
様にしてみた。以前書いたがUSB受信データのバイト数は
次回受信時の直前にならないと判らないので、この辺りの
処理を考えるのが難しい。とりあえず動く様になったが、
どうもデータの余りや不足を修正するタイミングを調整する
部分にまだ問題がある様だ。

実際のバッファ残量をRS-232Cで転送させてみたところ、
はっきりとは判らないがDMA転送の割り込みが2回掛かり
データが余計に減っている感じがする。割り込み周辺を
調べているが、実際に2回実行しているか確認できなくて
悩んでいるところだ。

2021年8月5日木曜日

SANYO LC7881 DAC その14

検討した結果LC7881 DACは専用構成になるので、小さ目の箱に
入れる為の基板を作ってみた。

PIC32MXは今回の基板化に合わせて入出力端子を一部変更した。
12MHzのクロックは交換可能にした。

基板は箱に合わせたらスペースが厳しかった。外部分周ロジックは
別基板で、基板無しで短絡すればPCM5102も使用可能にした。

電源はスペース不足と、不要になったら外して使える様にモジュール
にした。左上の基板が欠けている部分はコンセントが付く。

箱に入れたらこんな感じになる。電源モジュールは3個入れる。

とりあえず外部電源で動作確認して音が出る事は確認した。
そろそろトランスを購入しよう。

PIC32MXのプログラムをどうするかだな。