旭化成のAK4382AというDACチップをHardOffで324円で購入したジャンクからはがして、USB DAIに接続出来るようにしてみました。DAIはTIのPCM2706でI2Sでの接続になります。AK4382Aはデーターシートを見てみると、デフォルトの入力がI2Sではありません。このチップは3線の独自仕様のコントロールになっていて、ATTiny13でI2Sに設定する簡単なプログラムを作ってみました。
/*
ASAHI KASEI AK4382A Mode Control Program
for ATTiny13 on Arduino
*/
#include <avr/sleep.h>
#define CSN PB0
#define CCLK PB1
#define CDTI PB2
void setbit(int bit)
{
digitalWrite(CCLK, LOW);
digitalWrite(CDTI, bit);
digitalWrite(CCLK, HIGH);
}
void setreg(unsigned char addr, unsigned char data)
{
int i;
digitalWrite(CSN, LOW);
setbit(LOW); // C1
setbit(HIGH); // C0
setbit(HIGH); // R/W
// Register Address
for(i = 4; i >= 0; --i) {
setbit(addr & (1 << i) ? HIGH : LOW);
}
// Control Data
for(i = 7; i >= 0; --i) {
setbit(data & (1 << i) ? HIGH : LOW);
}
digitalWrite(CCLK, HIGH);
digitalWrite(CSN, HIGH);
}
void setup()
{
pinMode(CSN, OUTPUT);
pinMode(CCLK, OUTPUT);
pinMode(CDTI, OUTPUT);
digitalWrite(CSN, HIGH);
digitalWrite(CCLK, HIGH);
set_sleep_mode(SLEEP_MODE_IDLE);
delay(5000);
}
void loop()
{
unsigned char reg;
reg = 1 << 7; // RSTN
reg |= 1 << 1; // PW
reg |= 1 << 0; // ACKS
reg |= 3 << 2; // DIF
setreg(0, reg);
reg = 1 << 1; // DEM0
reg |= 1 << 7; // DZFE
setreg(1, reg);
reg = 0 << 2; // DZFB
setreg(2, reg);
sleep_mode();
}
電源投入後5秒後に設定を行ってスリープします。バイナリは530バイトくらいでした。
AK4382AはHI/LOパルス幅は80ns以上となっていてかなり短く、とくにDelayをいれなくても大丈夫なようです。
FN1242は入力フォーマットをピンで設定できますが、このチップはこのようにマイコンから設定する必要があります。
このチップは2002年くらいのチップで最近の旭化成のDACチップはI2Cで制御になっているようです。
このチップのデジタル系は5VですがHiが2.2V以上なので3.3VのI2Sマスターに接続しても問題ないようです。
このDACはΔΣなチップで結構音よいです。
後日追記
このチップを製造していたと思われる、旭化成エレクトロニクス株式会社の延岡工場は2020/10の火災で焼失してしまいました。