ESSのヘッドホンアンプ内蔵DAC IC「ES9219Q」を動作させたので、評価用の回路図と初期化コードをメモ。
ES9219Qの特徴は以下の通り。
- ヘッドホンアンプ内蔵
- GND中心出力のため出力コンデンサが不要
- 高性能:+130dB SNR、-106dB THD+N(32Ω負荷)
- パッケージは40PのQFN(0.4mmピッチ)
値段はMouserで1個12ドル(2025-11-15現在)。データシートはESSのWebサイトまたはMouserで公開されている。
回路図
回路図は以下の通り。データシート中のリファレンス回路と異なるのは、GPIO2をHに固定している点。理由はソースコード中のコメントで後述。
初期化コード
初期化コードについても注意点がいくつか。
まず、ES9219QのI2Cにはデバイスアドレスが2つある。「通常I2C(I2C Slave Interface)」と、「同期I2C(I2C Synchronous Slave Interface)」で、SDA/SCLピンは共通である。通常I2Cではレジスタの読み書きが行えるが、XIN端子からシステムクロック未供給だと使えない。同期I2Cはシステムクロック未供給でも書込みに使えるが、特定のレジスタのみ有効。なお、同期I2Cで書き込めるレジスタ番号は、調べた限りではreg0, reg192-201であった。起動時に同期I2Cでソフトリセット(reg 0, 192)やPLL設定(reg193-201)を行い、システムクロックを供給後に通常I2Cで残りの設定、という使い方を想定しているらしい。以下の図はデータシートのP33-34より抜粋。
次に、起動シーケンスについては、推奨パターンと異なる。推奨パターンはAVDD→VCCA→AVCC_33→AVCC_18→MCLK供給→RESETb開放(L→H)、というもの。細かい規定はなさそうなので、ひとまず電源は同時供給とした。またMCLK供給前に使える同期I2Cがある訳で、RESETb開放(L→H)はMCLK供給前にしても良いのではないか、と思う。よって今回は、電源同時供給→RESETb開放(L→H)→MCLK供給というシーケンスでテストした。以下の図はデータシートのP36より抜粋。
さらに、本コードでは音質の調整をしていない。本ICには、歪補償(THD Compensation)や、クロストーク補償(Crosstalk Compensation)等の音質調整機能が搭載されているが設定はせず、音を鳴らすことを目的にしている。
以下にコードを示す。Init_Process1()はMCLK供給前に呼び、Init_Process2()はMCLK供給後に呼ぶ。また、I2CWrite_Normal(reg_addr, reg_dat)は「通常I2C」の書込であり、デバイスアドレス0x90(8bit表記)にアクセスする。I2CWrite_Synchro(reg_addr, reg_dat)は「同期I2C」バージョンで、デバイスアドレスは0x94(8bit表記)である。本コードを実行した後、I2S Standard 信号を流し込めば、音が鳴る。
//ES9219Q初期化コード暫定版
//2025-11-15
//MCLK供給前に呼ぶ
void Init_process1()
{
//Hardware Reset
essHWReset();//RESETb端子をH→L→Hとする。パルス幅はデータシートに無いが、カンで10msとした。
Delay(10);
//Software Reset
//リセットは0b1を書き込んだ後、0b0(Normal Operation)に戻す必要あり
I2CWrite_Synchro(0, 0b00000001);
I2CWrite_Synchro(0, 0b00000000);
Delay(1);
//Software Reset (Always On Reg)
//リセットは0b1を書き込んだ後、0b0(Normal Operation)に戻す必要あり
I2CWrite_Synchro(192, 0b00000001);
I2CWrite_Synchro(192, 0b00000000);
Delay(1);
//PLL設定はお好みで。今回はDACおよびPLL入力のクロック選択だけを設定。
//pll config5
//SEL_DAC_CLKIN = 1, PD_XTAL = 0, PLL_INPUT_CLK = 001
I2CWrite_Synchro(201, 0b00000001);
return;
}
//MCLK供給後に呼ぶ
void Init_process2()
{
//Input Selection
//32bit, I2S, Auto-DSDI2Sを無効, Serial
I2CWrite_Normal(1, 0b10000000);
//filter shape and system mute
I2CWrite_Normal(7, 0b11000000);
//GPIO1-2 Configuration
//GPIO2: Amp Mode Select
//GPIO1: Output Low
//GPIO2をHに固定することで、Amp Mode Selectとして動作。
//ただ、GPIO2をHに固定すると、RESETb端子がLの場合に
//AUX入力をそのまま出力する「AUX Mode」になるらしい(データシートP17)。
//GPIO2はL固定&GPIO1をAmp Mode Selectにしても良いかもしれない。
I2CWrite_Normal(8, 0b10110111);
//dpll bandwidth
I2CWrite_Normal(12, 0b10010010);
//general configuration
//LRボリュームを同期
I2CWrite_Normal(27, 0b11001100);
//Volume Control
//volume max:0
//reg27でLRボリューム同期をONしており、reg15のみでLRのボリューム変更可。
I2CWrite_Normal(15, 0b00000000);
//Charge pump soft start delay
I2CWrite_Normal(26, 0b00000001);
//charge pump clock
I2CWrite_Normal(30, 0b00100000);
I2CWrite_Normal(31, 0b00110000);//Use MCLK
//analog control override/Analog Control Signals (Register45-48)
//これらレジスタを弄ると手動でアンプ部分を起動できるようだが、うまくいかず。
//チャージポンプが動作しないことや、出力に-1.8VDCが出力されることがあった。
//そこでAmp Modeを使い、自動でアンプ部を起動させるようにした。
//Register 8にてAmp Mode SelectをGPIO2に割り当て、GPIO2をHとすれば、アンプ部が起動。
//amplifier configuraiton
//Amp Mode時の動作を設定する。
//HiFi 1V:Vpp=1.8V*2となる。HiFi2VにするとVpp=3.3V*2となる。
//AMP_MODE_GPIOの説明にもあるとおり、GPIOのどちらかをRegister 8にてAmp Mode Selectとし、
//当該GPIOをHとすればAmp Modeに。
I2CWrite_Normal(32, 0b10010000);
//Amp analog volume on(2db/step)
//アナログボリュームを0dBに
//ES9219Qにはボリュームが2種類。reg15/16のボリュームとreg3のアナログボリューム。
//アナログボリュームは固定とし、音楽再生中の音量変更はreg15/16を使うようだ。
I2CWrite_Normal(3, 0b01000001);
return;
}
余談
ノイズフロアの少なさ、GND中心出力でコンデンサ不要な点がすごく気に入った。音声再生中に電源遮断が発生しても、RESETb端子をプルダウンする等Lに落としておけば、クリック音が鳴らないのも良い。
一昔前では、ESSのデータシート入手は、ESSとNDAを結ばなければ難しかったらしい。Twitterを検索した限り、Mouserで公開されたのは最近のことらしい。扱い易くなって良かったです。





コメント