CS43198 DAC解码芯片驱动

📅 2026/7/2 6:30:15
CS43198 DAC解码芯片驱动
CS43198是Cirus Logic公司推出的一款高性能音频DAC(数模转换器)芯片。通常该芯片的代码编写会涉及到对其寄存器的配置和操作以实现音频数据的转换和输出。该DAC芯片可以自适应输入的音频采样率输出切换采样率时无需修改寄存器进行初始化。初始化中调用CS43198_48K_init()就可以。#ifndef __CS43198_H #define __CS43198_H #ifdef __cplusplus extern C { #endif #include bsp.h #include user_delay.h #include bsp_i2c.h void CS43198_48K_init(void); #ifdef __cplusplus } #endif #endif /*__CS43198_H */#include cs43198.h #include stdint.h /* 7-bit 地址默认 0x248-bit 形式 0x48/0x49 */ #define CS43198_I2C_ADDR 0x60 /** * brief 向 CS43198 寄存器写入一个字节 * param reg: 寄存器地址24位 * param data: 数据 * retval 0: 成功1: 失败 */ uint8_t CS43198_WriteReg(uint32_t reg, uint8_t data) { uint8_t cBusId 0; uint8_t map[3], val 0; map[0] (reg 16) 0xFF; map[1] (reg 8) 0xFF; map[2] (reg 0) 0xFF; // 起始信号 i2c_Start(cBusId); // 发送设备地址写 i2c_SendByte(cBusId, CS43198_I2C_ADDR); if (i2c_WaitAck(cBusId) ! 0){ goto cmd_fail; } // 发送寄存器地址 i2c_SendByte(cBusId, map[0]); if (i2c_WaitAck(cBusId) ! 0){ goto cmd_fail; } i2c_SendByte(cBusId, map[1]); if (i2c_WaitAck(cBusId) ! 0){ goto cmd_fail; } i2c_SendByte(cBusId, map[2]); if (i2c_WaitAck(cBusId) ! 0){ goto cmd_fail; } /* 控制字节 INCR0 */ i2c_SendByte(cBusId, 0x01); if (i2c_WaitAck(cBusId) ! 0){ goto cmd_fail; } // 发送数据 i2c_SendByte(cBusId, data); if (i2c_WaitAck(cBusId) ! 0){ goto cmd_fail; } // 停止信号 i2c_Stop(cBusId); return 0; cmd_fail: i2c_Stop(cBusId); return 1; } /** * brief 从 CS43198 寄存器读取一个字节 * param reg: 寄存器地址 * retval 读取到的数据 */ uint8_t CS43198_ReadReg(uint32_t reg) { uint8_t data; uint8_t cBusId 0; uint8_t map[3], val 0; map[0] (reg 16) 0xFF; map[1] (reg 8) 0xFF; map[2] (reg 0) 0xFF; // 起始信号 i2c_Start(cBusId); //设备地址 i2c_SendByte(cBusId, CS43198_I2C_ADDR); if (i2c_WaitAck(cBusId) ! 0){ goto cmd_fail; } // 发送寄存器地址 i2c_SendByte(cBusId, map[0]); if (i2c_WaitAck(cBusId) ! 0){ goto cmd_fail; } i2c_SendByte(cBusId, map[1]); if (i2c_WaitAck(cBusId) ! 0){ goto cmd_fail; } i2c_SendByte(cBusId, map[2]); if (i2c_WaitAck(cBusId) ! 0){ goto cmd_fail; } /* 控制字节 INCR0 */ i2c_SendByte(cBusId, 0x01); if (i2c_WaitAck(cBusId) ! 0){ goto cmd_fail; } // 重新开始 i2c_Stop(cBusId); i2c_Start(cBusId); //设备地址 i2c_SendByte(cBusId, CS43198_I2C_ADDR| I2C_READ); if (i2c_WaitAck(cBusId) ! 0){ goto cmd_fail; } data i2c_ReadByte(cBusId); i2c_NAck(cBusId); // 停止信号 i2c_Stop(cBusId); return data; cmd_fail: i2c_Stop(cBusId); return 1; } /* 表驱动 */ typedef struct { uint32_t reg; uint8_t val; }CS43198_CFG; static const CS43198_CFG cs43198_48k[] { /* XTAL SETUP */ {0x20052,0x04}, {0xF0000,0xFF}, {0xF0010,0xE7}, {0x20000,0xF6}, /* ASP SETUP */ {0x1000B,0x04}, {0x1000C,0x04}, {0x40010,0x01}, {0x40011,0x00}, {0x40012,0x08}, {0x40013,0x00}, {0x40014,0x1F}, {0x40015,0x00}, {0x40016,0x3F}, {0x40017,0x00}, {0x40018,0x0C}, {0x40019,0x0A}, {0x50000,0x00}, {0x50001,0x00}, {0x5000A,0x07}, {0x5000B,0x0F}, /* PCM SETUP */ {0x90000,0x02}, {0x90001,0x00}, {0x90002,0x00}, {0x90003,0xEC}, {0x90004,0x00}, /* DAC SETUP */ {0xB0000,0x1E}, {0x80000,0x31}, {0xD0000,0x04}, {0xD0000,0x00}, /* ENABLE INTERRUPTS */ {0xF0000,0xFF}, {0xF0001,0xFF}, {0xF0010,0x87}, {0xF0011,0x07}, /* ENABLE SYSTEM */ {0xF0000,0xFF}, {0x10006,0x00}, {0x20000,0xF4}, /* Not 0.5Vrms configuration */ {0x010010,0x99}, {0x180000,0x45}, {0x010010,0x00}, /* POWER UP SEQUENCE */ {0x20000,0x00}, {0x10010,0x99}, {0x80032,0x20}, {0x20000,0x00}, {0xDE000,0x0A}, //Delay 10ms {0x80032,0x00}, {0x10010,0x00}, }; void CS43198_48K_init(void) { Delay_ms(10); for (uint32_t i 0; i sizeof(cs43198_48k)/sizeof(cs43198_48k[0]); i) { if (cs43198_48k[i].val 0xFF) { CS43198_ReadReg(cs43198_48k[i].reg); Delay_ms(1); } else if (cs43198_48k[i].reg 0xDE000){ Delay_ms(cs43198_48k[i].val); } else { CS43198_WriteReg(cs43198_48k[i].reg, cs43198_48k[i].val); Delay_ms(1); } } }