[DAC] 9039q2m寄存器怎么写?

[复制链接] 查看: 1000|回复: 13

3

主题

0

好友

23

积分

注册会员 当前离线

Rank: 2

UID
1152783
帖子
21
精华
0
经验
23 点
金钱
17 ¥
注册时间
2026-2-21
发表于 2026-3-3 22:35 来自手机端 | 显示全部楼层
有没有大神知道哪里有教程啊?全网找不到教程

21

主题

0

好友

1097

积分

侠之大者 当前在线

00后的小烧友

Rank: 6Rank: 6

UID
971156
帖子
950
精华
0
经验
1097 点
金钱
904 ¥
注册时间
2022-6-18
发表于 2026-3-4 08:36 | 显示全部楼层
这问题太笼统了,有很多方式。
你用的什么平台?安卓、嵌入式还是树莓派?
要怎么样初始化ES9039Q2M?软控还是硬控?有没有什么特定的寄存器配置需求?

目前正在研究编程,希望能和你一起继续探讨。


21

主题

0

好友

1097

积分

侠之大者 当前在线

00后的小烧友

Rank: 6Rank: 6

UID
971156
帖子
950
精华
0
经验
1097 点
金钱
904 ¥
注册时间
2022-6-18
发表于 2026-3-4 15:21 | 显示全部楼层
本帖最后由 HuBin168 于 2026-3-4 15:37 编辑

这是我写的基于嵌入式(STM32 )的ES9039Q2M 驱动代码

/* ES9039Q2M驱动头文件 */
#ifndef ES9039Q2M_H
#define ES9039Q2M_H
#include "stm32f4xx_hal.h"
#define ES9039Q2M_ADDR 0x90  // ES9039Q2M的I2C地址
// 函数声明
HAL_StatusTypeDef ES9039Q2M_WriteRegister(uint8_t reg_addr, uint8_t data);
HAL_StatusTypeDef ES9039Q2M_ReadRegister(uint8_t reg_addr, uint8_t *data);
void ES9039Q2M_Init(void);
void ES9039Q2M_DeInit(void);
#endif
/* ES9039Q2M驱动源文件 */
#include "es9039q2m.h"
I2C_HandleTypeDef *hi2c_es9039q2m;  // I2C句柄
// 初始化ES9039Q2M
void ES9039Q2M_Init(I2C_HandleTypeDef *hi2c)
{
    hi2c_es9039q2m = hi2c;  // 保存I2C句柄
   
    // 等待芯片稳定(建议等待100ms以上)
    HAL_Delay(100);
   
    // 复位芯片(如果有复位引脚)
    // HAL_GPIO_WritePin(ES9039Q2M_RESET_GPIO_Port, ES9039Q2M_RESET_Pin, GPIO_PIN_RESET);
    // HAL_Delay(10);
    // HAL_GPIO_WritePin(ES9039Q2M_RESET_GPIO_Port, ES9039Q2M_RESET_Pin, GPIO_PIN_SET);
    // HAL_Delay(100);
   
    // 配置基本寄存器
    ES9039Q2M_WriteRegister(0x00, 0x42);  // 系统配置:S/PDIF输入
    ES9039Q2M_WriteRegister(0x01, 0xBF);  // 控制寄存器1:异步模式,启用S/PDIF、DoP、DSD
    ES9039Q2M_WriteRegister(0x42, 0x08);  // GPIO配置:输入模式
    ES9039Q2M_WriteRegister(0x0C, 0x0F);  // ASRC/DPLL:高带宽
    ES9039Q2M_WriteRegister(0x0E, 0x0A);  // 软启动:正常启动,时间10
   
    // 配置其他必要的寄存器
    ES9039Q2M_WriteRegister(0x59, 0x64);  // 寄存器89的配置
   
    // 等待初始化完成
    HAL_Delay(100);
}
// 向ES9039Q2M写入寄存器
HAL_StatusTypeDef ES9039Q2M_WriteRegister(uint8_t reg_addr, uint8_t data)
{
    uint8_t tx_data[2];
    tx_data[0] = reg_addr;
    tx_data[1] = data;
   
    return HAL_I2C_Master_Transmit(hi2c_es9039q2m, ES9039Q2M_ADDR << 1, tx_data, 2, 100);
}
// 从ES9039Q2M读取寄存器
HAL_StatusTypeDef ES9039Q2M_ReadRegister(uint8_t reg_addr, uint8_t *data)
{
    return HAL_I2C_Mem_Read(hi2c_es9039q2m, ES9039Q2M_ADDR << 1, reg_addr,
                            I2C_MEMADD_SIZE_8BIT, data, 1, 100);
}
// 反初始化ES9039Q2M
void ES9039Q2M_DeInit(void)
{
    // 关闭芯片(如果支持)
    ES9039Q2M_WriteRegister(0x01, 0x00);  // 关闭所有功能
}

21

主题

0

好友

1097

积分

侠之大者 当前在线

00后的小烧友

Rank: 6Rank: 6

UID
971156
帖子
950
精华
0
经验
1097 点
金钱
904 ¥
注册时间
2022-6-18
发表于 2026-3-4 15:23 | 显示全部楼层
STM32主程序:

int main(void)
{
    HAL_Init();
   
    // 初始化系统时钟(配置到168MHz)
    SystemClock_Config();
   
    // 初始化I2C1(用于ES9039Q2M控制)
    MX_I2C1_Init();
   
    // 初始化SPI2(用于I2S音频接口)
    MX_SPI2_Init();
   
    // 初始化DMA(如果使用)
    MX_DMA_Init();
   
    // 初始化ES9039Q2M
    ES9039Q2M_Init(&hi2c1);
   
    // 启动I2S接收(使用DMA)
    uint16_t audio_buffer[1024];  // 音频缓冲区
    HAL_I2S_Receive_DMA(&hspi2, audio_buffer, sizeof(audio_buffer)/sizeof(uint16_t));
   
    while (1)
    {
        // 主循环,可以添加其他处理
        HAL_Delay(1000);
    }
}

21

主题

0

好友

1097

积分

侠之大者 当前在线

00后的小烧友

Rank: 6Rank: 6

UID
971156
帖子
950
精华
0
经验
1097 点
金钱
904 ¥
注册时间
2022-6-18
发表于 2026-3-4 15:25 | 显示全部楼层
如果使用了中断方式,需要实现相应的中断处理函数:

// I2S中断处理函数
void SPI2_IRQHandler(void)
{
    HAL_SPI_IRQHandler(&hspi2);
}
// DMA中断处理函数
void DMA1_Stream3_IRQHandler(void)
{
    HAL_DMA_IRQHandler(&hdma_spi2_rx);
}
// I2C中断处理函数(如果使用)
void I2C1_EV_IRQHandler(void)
{
    HAL_I2C_EV_IRQHandler(&hi2c1);
}
void I2C1_ER_IRQHandler(void)
{
    HAL_I2C_ER_IRQHandler(&hi2c1);
}

21

主题

0

好友

1097

积分

侠之大者 当前在线

00后的小烧友

Rank: 6Rank: 6

UID
971156
帖子
950
精华
0
经验
1097 点
金钱
904 ¥
注册时间
2022-6-18
发表于 2026-3-4 15:27 | 显示全部楼层
还有一些可选的辅助函数:

// 读取ES9039Q2M的状态信息
void ES9039Q2M_ReadStatus(void)
{
    uint8_t status_reg;
   
    // 读取状态寄存器
    ES9039Q2M_ReadRegister(0x01, &status_reg);
    printf("Control Register 1: 0x%02X\n", status_reg);
   
    // 读取其他状态寄存器
    ES9039Q2M_ReadRegister(0x00, &status_reg);
    printf("System Register: 0x%02X\n", status_reg);
   
    ES9039Q2M_ReadRegister(0x42, &status_reg);
    printf("GPIO Register: 0x%02X\n", status_reg);
}
// 设置音量(0-255,对应-96dB到+12dB)
void ES9039Q2M_SetVolume(uint8_t volume)
{
    ES9039Q2M_WriteRegister(0x08, volume);  // 假设音量控制在寄存器0x08
}
// 静音控制
void ES9039Q2M_SetMute(uint8_t mute)
{
    if (mute)
    {
        ES9039Q2M_WriteRegister(0x09, 0x01);  // 静音
    }
    else
    {
        ES9039Q2M_WriteRegister(0x09, 0x00);  // 取消静音
    }
}

21

主题

0

好友

1097

积分

侠之大者 当前在线

00后的小烧友

Rank: 6Rank: 6

UID
971156
帖子
950
精华
0
经验
1097 点
金钱
904 ¥
注册时间
2022-6-18
发表于 2026-3-4 15:35 | 显示全部楼层
验证 ES9039Q2M 配置是否成功的首要方法是读取寄存器值。可以通过以下步骤进行验证:

  一、读取关键寄存器:
    1:读取寄存器 0x00(系统配置寄存器),确认配置值为 0x42
    2:读取寄存器 0x01(控制寄存器 1),确认配置值为 0xBF
    3:读取寄存器 0x42(GPIO 配置),确认配置值为 0x08


  二、验证配置结果:

uint8_t reg_value;
// 验证系统配置寄存器
ES9039Q2M_ReadRegister(0x00, &reg_value);
if (reg_value != 0x42)
{
    printf("Error: System register configuration failed (0x%02X expected 0x42)\n", reg_value);
}
// 验证控制寄存器1
ES9039Q2M_ReadRegister(0x01, &reg_value);
if (reg_value != 0xBF)
{
    printf("Error: Control register 1 configuration failed (0x%02X expected 0xBF)\n", reg_value);
}
// 验证GPIO配置
ES9039Q2M_ReadRegister(0x42, &reg_value);
if (reg_value != 0x08)
{
    printf("Error: GPIO register configuration failed (0x%02X expected 0x08)\n", reg_value);
}

三、读取状态寄存器:
  ES9039Q2M 提供了多个状态寄存器,用于反映芯片的工作状态:
    1:寄存器 0x65(只读):GPIO 读回寄存器,用于验证 GPIO 配置
    2:其他状态寄存器根据需要读取

21

主题

0

好友

1097

积分

侠之大者 当前在线

00后的小烧友

Rank: 6Rank: 6

UID
971156
帖子
950
精华
0
经验
1097 点
金钱
904 ¥
注册时间
2022-6-18
发表于 2026-3-4 15:39 | 显示全部楼层
欢迎高手前辈们指教,大家一起探讨。

9

主题

0

好友

219

积分
     

业余侠客 当前离线

Rank: 4

UID
853861
帖子
241
精华
0
经验
219 点
金钱
202 ¥
注册时间
2018-10-8
发表于 2026-3-4 16:05 | 显示全部楼层
会编程就是方便,大佬能不能写个CS8416软控?

34

主题

10

好友

2115

积分
     

罗宾汉 当前离线

Rank: 7Rank: 7Rank: 7

UID
45637
帖子
1981
精华
0
经验
2115 点
金钱
1960 ¥
注册时间
2008-6-17
发表于 2026-3-6 11:01 | 显示全部楼层
CS8416用硬控就可以了。不复杂轻松到192KHz。

1

主题

0

好友

18

积分

注册会员 当前离线

Rank: 2

UID
1135759
帖子
17
精华
0
经验
18 点
金钱
16 ¥
注册时间
2025-7-19
发表于 2026-3-7 12:28 | 显示全部楼层
学习了,谢谢!

9

主题

0

好友

219

积分
     

业余侠客 当前离线

Rank: 4

UID
853861
帖子
241
精华
0
经验
219 点
金钱
202 ¥
注册时间
2018-10-8
发表于 2026-3-7 12:38 | 显示全部楼层
飞天狼001 发表于 2026-3-6 11:01
CS8416用硬控就可以了。不复杂轻松到192KHz。

主要想用上多路输入切换功能

3

主题

0

好友

23

积分

注册会员 当前离线

Rank: 2

UID
1152783
帖子
21
精华
0
经验
23 点
金钱
17 ¥
注册时间
2026-2-21
 楼主| 发表于 2026-3-7 22:52 来自手机端 | 显示全部楼层
HuBin168 发表于 2026-3-4 08:36
这问题太笼统了,有很多方式。
你用的什么平台?安卓、嵌入式还是树莓派?
要怎么样初始化ES9039Q2M?软 ...

我用stm32,我连怎么用都不知道。。。

34

主题

10

好友

2115

积分
     

罗宾汉 当前离线

Rank: 7Rank: 7Rank: 7

UID
45637
帖子
1981
精华
0
经验
2115 点
金钱
1960 ¥
注册时间
2008-6-17
发表于 2026-3-9 10:25 | 显示全部楼层
caotion0212 发表于 2026-3-7 12:38
主要想用上多路输入切换功能

那要上软控,内部寄存器硬控模式搞不定。去请教一下豆包吧,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版| HIFIDIY论坛 ( 鄂ICP备2025138941号-3 ICP证:鄂B2-20130019 公安局网监备:420100007348 邮箱:1343292467@qq.com )

GMT+8, 2026-7-28 19:11 , Processed in 0.177672 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc.

返回顶部