HUANG1366 发表于 2026-3-3 22:35

9039q2m寄存器怎么写?

有没有大神知道哪里有教程啊?全网找不到教程

HuBin168 发表于 2026-3-4 08:36

这问题太笼统了,有很多方式。
你用的什么平台?安卓、嵌入式还是树莓派?
要怎么样初始化ES9039Q2M?软控还是硬控?有没有什么特定的寄存器配置需求?

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


HuBin168 发表于 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;
    tx_data = reg_addr;
    tx_data = 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);// 关闭所有功能
}

HuBin168 发表于 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;// 音频缓冲区
    HAL_I2S_Receive_DMA(&hspi2, audio_buffer, sizeof(audio_buffer)/sizeof(uint16_t));
   
    while (1)
    {
      // 主循环,可以添加其他处理
      HAL_Delay(1000);
    }
}

HuBin168 发表于 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);
}

HuBin168 发表于 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);// 取消静音
    }
}

HuBin168 发表于 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:其他状态寄存器根据需要读取

HuBin168 发表于 2026-3-4 15:39

欢迎高手前辈们指教,大家一起探讨。

caotion0212 发表于 2026-3-4 16:05

会编程就是方便,大佬能不能写个CS8416软控?

飞天狼001 发表于 2026-3-6 11:01

CS8416用硬控就可以了。不复杂轻松到192KHz。

dhtfghydx 发表于 2026-3-7 12:28

学习了,谢谢!

caotion0212 发表于 2026-3-7 12:38

飞天狼001 发表于 2026-3-6 11:01
CS8416用硬控就可以了。不复杂轻松到192KHz。

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

HUANG1366 发表于 2026-3-7 22:52

HuBin168 发表于 2026-3-4 08:36
这问题太笼统了,有很多方式。
你用的什么平台?安卓、嵌入式还是树莓派?
要怎么样初始化ES9039Q2M?软 ...

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

飞天狼001 发表于 2026-3-9 10:25

caotion0212 发表于 2026-3-7 12:38
主要想用上多路输入切换功能

那要上软控,内部寄存器硬控模式搞不定。去请教一下豆包吧,
页: [1]
查看完整版本: 9039q2m寄存器怎么写?