硬件配置
硬件引脚说明:
数据手册第七页
10 引脚 DIF0 在寄存器控制模式下的 Lch 零 输入检测引脚(内部下拉引脚)
11 引脚 DIF1 在寄存器控制模式下的 Rch 零输入检测引脚 (内部下拉引脚)
12 引脚 DIF2 在寄存器控制模式下的芯片地址 0 引脚
13 引脚 PSN 引脚控制模式或寄存器控制模式选择引脚 (内部上拉引脚)
引脚 拉低“LOW”: 寄存器控制模式
引脚 拉高“HIGH”: 引脚控制模式
14 引脚 I2C 寄存器控制模式下的控制接口引脚, 拉高(HIGH)使用I2C总线控制模式 拉低(LOW)使用3线μP接口控制模式
如何设置寄存器控制模式
硬件引脚设置:
-
13 引脚 PSN 拉低 让芯片处于寄存器控制模式下
-
14 引脚 I2C 拉高 让芯片寄存器通讯协议处于I2C总线控制模式下
-
芯片I2C通讯地址位配置
- 芯片地址0 CDA0 拉高 1
- 芯片地址1 CDA1 拉高 1 从上面配置可以知道,从机地址为:00100 固定位+ 1 +1+R/W位 0x13
-
采样率自动设置与手动设置
寄存器控制模式
1. PCM 模式 引脚配置
分类 | 引脚名称 | 状态 |
---|---|---|
模拟 | AOUTLP | 断开连接 |
AOUTLN | 断开连接 | |
AOUTRP | 断开连接 | |
AOUTRN | 断开连接 | |
数字 | WCK | 连接到DVSS |
DEM0 | 连接到DVSS或未连接 | |
TESTE | 连接到DVSS或未连接 | |
DZFL | 断开连接 | |
DZFR | 断开连接 |
寄存器控制接口 通讯方式选择
寄存器控制接口有好几种:
引脚编号 | 引脚名称 | 描述 |
---|---|---|
8 | SD | 数字滤波器选择引脚,在引脚控制模式下为 /DVSS |
CCLK | 寄存器控制模式下的控制数据时钟引脚,高阻态 | |
SCL | I2C=“H”: 寄存器控制模式下的控制数据时钟输入引脚 | |
9 | SLOW | 数字滤波器选择引脚,在引脚控制模式下为 /DVSS |
CDTI | 寄存器控制模式下的控制数据输入引脚,高阻态 | |
SDA | I2C=“H”: 控制数据输入引脚(输入/输出) |
硬件配置说明:
当I2C引脚拉处于高电平,配置芯片处于I2C总线控制模式,通过I2C总线(SDA 、SCL)读写寄存器来控制芯片工作。 所有的配置通过寄存器控制模式来配置。
(1) I2C总线控制模式(I2C引脚 = “H”)
AK4493S支持快速模式I2C总线(最大速度:400kHz,版本1.0)。
(2)-1. 写操作
图68显示了I2C总线模式的数据传输顺序。所有命令都以起始条件为前提。
在SCL高电平时,SDA线由高电平转为低电平表示起始条件(图74)。
在起始条件之后,发送从设备地址。
此地址长度为7位,接着是第八位的数据方向位(R/W)。
从设备地址的最高五位固定为“00100”。
接下来的位是CAD1和CAD0(设备地址位)。
这些位标识总线上特定的设备。硬连线输入引脚(CAD1引脚,CAD0引脚)设置这些设备地址位(图69)。
如果从设备地址匹配AK4493S的地址,AK4493S生成一个确认,操作即执行。主控必须在确认相关的时钟脉冲期间生成确认相关的时钟脉冲,并释放SDA线(高电平)(图75)。R/W位值为“1”表示将执行读操作,“0”表示将执行写操作。
第二字节包括AK4493S的控制寄存器地址,格式为最高位优先。
最高三位固定为“000”(图70)。
第二字节后的数据包含控制数据。
格式为最高位优先,8位(图71)。
每接收一个字节后,AK4493S生成一个确认。
数据传输总是由主控生成的停止条件结束。在SCL高电平期间,SDA线上的数据必须保持稳定。数据线的高电平或低电平状态只能在SCL线的低电平时改变(图76),除了起始和停止条件。 AK4493S可以在一个序列中执行多个字节的写操作。
接收第三个字节后,AK4493S生成一个确认并等待下一个数据。
主控可以传输多个字节,而不是在传输第一个数据字节后终止写周期。在接收每个数据包后,内部地址计数器增加1,并且下一个数据自动进入下一个地址。如果在生成停止条件之前地址超过“15H”,地址计数器将“回卷”至“00H”,并且之前的数据将被覆盖。
(2)-2. 读操作
设置R/W位=“1”进行AK4493S的读操作。在传输数据后,主控可以通过生成确认而不是在接收第一个数据字之后终止写周期,来读取下一个地址的数据。在接收每个数据包后,内部地址计数器增加1,下一个数据会自动进入下一个地址。如果在生成停止条件之前地址超过“15H”,地址计数器将“回卷”至“00H”,并且将读取“00H”的数据。 AK4493S支持两种基本的读操作:当前地址读和随机地址读。
(2)-2-1. 当前地址读
AK4493S具有内部地址计数器,它维护上一次访问的地址,加1。因此,如果上一次访问(无论是读取还是写入)的地址为“n”,下一个当前读操作将从地址“n+1”读取数据。在接收R/W位为“1”的从设备地址后,AK4493S生成一个确认,将1字节数据传输到内部地址计数器设定的地址,并将内部地址计数器增加1。如果主控不生成确认,而是生成停止条件,AK4493S将停止传输。
(2)-2-2. 随机地址读
随机读操作允许主控随机访问任何存储器位置。在发出带有R/W位“1”的从设备地址之前,主控必须首先执行“虚拟”写操作。主控发出启动请求、一个从设备地址(R/W位 = “0”)和要读取的寄存器地址。在寄存器地址得到确认后,主控立即重新发出启动请求和带有R/W位“1”的从设备地址。AK4493S随后生成一个确认、1字节数据,并将内部地址计数器增加1。如果主控不生成确认,而是生成停止条件,AK4493S将停止传输。
(2)3线串行控制模式(I2C引脚 = “L”)
引脚(引脚控制模式)或寄存器(寄存器控制模式)可以控制AK4493S的功能。
在引脚控制模式下,将忽略寄存器设置,在寄存器控制模式下将忽略引脚设置。
当PSN引脚的状态改变时,AK4493S应通过PDN引脚断电。
否则,可能会出现故障,因为之前的设置没有初始化。
通过设置PSN引脚 = “L” 可启用寄存器控制接口。
内部寄存器可以通过3线µP接口引脚进行写入:CSN、CCLK和CDTI。
该接口的数据包括芯片地址(2位,C1/0)、读/写(1位;固定为“1”,仅写入)、寄存器地址(高位优先,5位)和控制数据(高位优先,8位)。
数据在CCLK下降沿上输出,并在CCLK上升沿上接收。
当CSN“”时,数据的写入是有效的。CCLK的时钟速度为5MHz(最大)。
将PDN引脚设置为“L”会将寄存器重置为其默认值。在寄存器控制模式下,数字块除控制寄存器和时钟分频器外会通过将RSTN位设置为“0”来重置。
在这种情况下,寄存器的值不会被初始化。
CDTI CCLK C1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 C0 R/W A4 A3 A2 A1 A0 D7 D6 D5 D4 D3 D2 D1 D0 CSN C1-C0:芯片地址(C1位=CAD1引脚,C0位=CAD0引脚) R/W:读/写(固定为“1”,仅写入) A4-A0:寄存器地址 D7-D0:控制数据 图67. 控制接口时序
AK4493S不支持3线串行控制模式中的读取命令。
当AK4493S处于断电模式(PDN引脚 = “L”)时,禁止向控制寄存器写入。 当CSN为“L”时,在CCLK上升沿为15次或更少次,或17次或更多次时,不能写入控制数据。 CONFIDENTIAL [AK4493S] Rev. 00 2021/06
寄存器
地址 | 寄存器名 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
00H | Control 1 | ACKS | EXDF | ECS | 0 | DIF2 | DIF1 | DIF0 | RSTN |
01H | Control 2 | DZFE | DZFM | SD | DFS1 | DFS0 | DEM1 | DEM0 | SMUTE |
02H | Control 3 | DP | ADP | DCKS | DCKB | MONO | DZFB | SELLR | SLOW |
03H | Lch ATT | ATTL7 | ATTL6 | ATTL5 | ATTL4 | ATTL3 | ATTL2 | ATTL1 | ATTL0 |
04H | Rch ATT | ATTR7 | ATTR6 | ATTR5 | ATTR4 | ATTR3 | ATTR2 | ATTR1 | ATTR0 |
05H | Control 4 | INVL | INVR | 0 | 0 | 0 | 0 | DFS2 | SSLOW |
06H | DSD1 | DDM | DML | DMR | DDMOE | DDMT1 | DDMT0 | DSDD | DSDSEL0 |
07H | Control 5 | 0 | 0 | 0 | 0 | GC2 | GC1 | GC0 | SYNCE |
08H | Sound Control | 0 | 0 | 0 | 0 | SC2 | SC1 | SC0 | - |
09H | DSD2 | 0 | 0 | 0 | 0 | 0 | 0 | DSDF | DSDSEL1 |
0AH | Control 6 | TDM1 | TDM0 | SDS1 | SDS2 | 0 | PW | 0 | 0 |
0BH | Control 7 | ATS1 | ATS0 | 0 | SDS0 | 0 | 0 | 0 | TEST |
0CH | Reserved | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - |
0DH | Reserved | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - |
0EH | Reserved | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - |
0FH | Reserved | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - |
10H | Reserved | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - |
11H | Reserved | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - |
12H | Reserved | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - |
13H | Reserved | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - |
14H | Reserved | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - |
15H | Control 8 | ADPE | ADPT1 | ADPT0 | 0 | 0 | 0 | 0 | 0 |
设置PCM模式
硬件
3 引脚 BICK PCM 模式下的音频串行数据时钟引脚
4 引脚 SDATA PCM 模式下的音频串行数据输入引脚
5 引脚 LRCK PCM 模式下的 L/R 时钟引脚
寄存器设置
初始化和控制逻辑
用于初始化和控制AK4493 DAC(数字到模拟转换器)芯片。整个逻辑可以分为几个部分:
初始化DAC (AK4493Init 函数):
- 清屏并显示初始化信息。
- 通过MCP芯片重置DAC。
- 检查DAC是否响应。
- 如果启用了DUALMONO,检查第二个DAC是否响应。
- 写入寄存器来初始化DAC。
- 如果启用了AutoDSD,配置DAC以自动检测PCM或DSD。
- 如果启用了DUALMONO,为双单声道模式配置两个DAC。
graph TD
A[开始] --> B[清屏并显示"Initializing AK4493....."]
B --> C[通过MCP芯片重置DAC]
C --> D{检查DAC是否响应}
D -->|是| E[显示"AK4493 found!"]
D -->|否| F[显示"No response from AK4493!"]
E --> G{是否定义了DUALMONO}
F --> G
G -->|是| H[检查第二个DAC是否响应]
G -->|否| I[初始化DAC(写入寄存器)]
H -->|是| J[显示"AK4493r found!"]
H -->|否| K[显示"No response from AK4493r!"]
J --> I
K --> I
I --> L{是否定义了AutoDSD}
L -->|是| M[启用PCM或DSD的自动检测]
L -->|否| N[继续初始化流程]
M --> N
N --> O{是否定义了DUALMONO}
O -->|是| P[为双单声道模式配置两个DAC]
O -->|否| Q[完成DAC初始化]
P --> Q[完成DAC初始化]
Q --> R[结束]
设置DAC参数 (SetDACParam 函数):
根据采样率(SR_DAC变量)设置MCLK或者手动设置AK4493的采样率模式。
设置音量 (SetVol 函数):
写入左右声道的音量寄存器。 如果定义了DUALMONO,则对第二个DAC执行相同的操作。
读取PCM/DSD状态 (ReadAKStatus 函数):
读取DAC的状态寄存器,判断是PCM信号还是DSD信号。
设置DAC模式 (SetDACMode 函数):
根据dacMode变量设置DAC为PCM模式或DSD模式。 如果定义了DUALMONO,则对第二个DAC执行相同的操作。
设置DAC滤波器 (SetFilter 函数):
根据dacFilter变量设置DAC的滤波器类型。
启用DSD直通模式 (EnableDirectDSD 函数):
根据directDsd变量启用或禁用DSD直通模式。
设置DSD滤波器频率 (SetDSDFilter 函数):
根据dsdFilter变量设置DSD滤波器的截止频率。
设置声音模式 (SetSoundMode 函数):
根据soundMode变量设置DAC的声音模式。
设置正相或反相输出 (SetInvertPhase 函数):
根据InvertPhase变量设置DAC输出的相位。
设置DAC自动或手动模式 (SetDACAutoMode 函数):
根据DACAutoMode变量设置DAC的工作模式。
设置DAC采样率 (SetDAC_SR 函数):
根据SR_DAC变量设置DAC的采样率。 如果定义了DUALMONO,则对第二个DAC执行相同的操作。
结论
整个程序的目的是通过I2C接口与AK4493 DAC通信,根据用户的配置和输入信号类型(PCM或DSD)来设置DAC的工作参数。
这包括音量控制、滤波器选择、采样率设置、相位控制等。
如果系统配置为双单声道模式,那么所有的设置都会应用到两个DAC上。
硬件配置模式
开启硬件配置
引脚 | 名称 | 电平 | 连接方式 | 功能描述 |
---|---|---|---|---|
6 | WCK | L | 连接VSS | |
7 | CSN | L | 连接VSS | 将芯片控制模式设置为寄存器控制 |
8 | I2C_SCL | - | 10k上拉 | I2C时钟 |
9 | I2C_SDA | - | 10K上拉 | I2C数据 |
10 | DZFL | L | 悬空 | |
11 | DZFR | L | 悬空 | |
12 | CAD0 | H | 连接VDD | I2C从机地址选择 |
13 | PSN | L | 连接VSS | 高电平是PIN脚硬件控制模式,低电平是寄存器控制模式 |
14 | I2C | H | 连接VDD | I2C总线控制选择,高电平为I2C总线协议 |
15 | DEM0 | L | 悬空 | |
16 | LDOE | H | 连接VDD | 启用内部LDO1.8V |
17 | CAD1 | H | 连接VDD | I2C从机地址选择 |