ES9219Qを動かす

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で公開されたのは最近のことらしい。扱い易くなって良かったです。

コメント

タイトルとURLをコピーしました