#include "m62429.h" // 第一级音量定义 #define MainVol_0dB 0x15 // 0dB #define MainVol_n4dB 0x14 // -4dB #define MainVol_n8dB 0x13 // -8dB #define MainVol_n12dB 0x12 // -12dB #define MainVol_n16dB 0x11 // -16dB #define MainVol_n20dB 0x10 // -20dB #define MainVol_n24dB 0x0F // -24dB #define MainVol_n28dB 0x0E // -28dB #define MainVol_n32dB 0x0D // -32dB #define MainVol_n36dB 0x0C // -36dB #define MainVol_n40dB 0x0B // -40dB #define MainVol_n44dB 0x0A // -44dB #define MainVol_n48dB 0x09 // -48dB #define MainVol_n52dB 0x08 // -52dB #define MainVol_n56dB 0x07 // -56dB #define MainVol_n60dB 0x06 // -60dB #define MainVol_n64dB 0x05 // -64dB #define MainVol_n68dB 0x04 // -68dB #define MainVol_n72dB 0x03 // -72dB #define MainVol_n76dB 0x02 // -76dB #define MainVol_n80dB 0x01 // -80dB // 第二级音量定义 #define SubVol_0dB 0x03 // 0dB #define SubVol_n1dB 0x02 // -1dB #define SubVol_n2dB 0x01 // -2dB #define SubVol_n3dB 0x00 // -3dB #define _1CH 0x00 #define _SINGLE 0x01 // 音量调节最大0dB, 最小-80dB, 分成12步 const uint16_t VolumeTable[] = { (0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_0dB << 2)), // 0dB (0x0600 | _1CH | (_SINGLE << 1) | (SubVol_n2dB << 7) | (MainVol_0dB << 2)), // -2dB (0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n4dB << 2)), // -4dB (0x0600 | _1CH | (_SINGLE << 1) | (SubVol_n2dB << 7) | (MainVol_n4dB << 2)), // -6dB (0x0600 | _1CH | (_SINGLE << 1) | (SubVol_n1dB << 7) | (MainVol_n8dB << 2)), // -9dB (0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n12dB << 2)), // -12dB (0x0600 | _1CH | (_SINGLE << 1) | (SubVol_n2dB << 7) | (MainVol_n16dB << 2)), // -18dB (0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n24dB << 2)), // -24dB (0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n36dB << 2)), // -36dB (0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n48dB << 2)), // -48dB (0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n60dB << 2)), // -60dB (0x0600 | _1CH | (_SINGLE << 1) | (SubVol_0dB << 7) | (MainVol_n80dB << 2)), // -80dB }; void m62429_init(void) { gpio_config(M62429_SDA_PERIPH, M62429_SDA_PIN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, nullptr); m62429_set_vol(1); } void send1_byte(uint8_t s_data) // data1对应的位发送子程序 { // 发中间值D1--D8 gpio_bit_write(M62429_SCL_PERIPH, M62429_SCL_PIN, RESET); for (uint8_t t = 0; t <= 7; t++) { gpio_bit_write(M62429_SDA_PERIPH, M62429_SDA_PIN, (s_data & 0x80) >> 7); s_data <<= 1; __NOP(); gpio_bit_write(M62429_SCL_PERIPH, M62429_SCL_PIN, SET); __NOP(); gpio_bit_write(M62429_SCL_PERIPH, M62429_SCL_PIN, RESET); __NOP(); } // D9--1 gpio_bit_write(M62429_SDA_PERIPH, M62429_SDA_PIN, 1); __NOP(); gpio_bit_write(M62429_SCL_PERIPH, M62429_SCL_PIN, SET); __NOP(); gpio_bit_write(M62429_SDA_PERIPH, M62429_SDA_PIN, 0); __NOP(); gpio_bit_write(M62429_SCL_PERIPH, M62429_SCL_PIN, RESET); __NOP(); // D10--1 gpio_bit_write(M62429_SDA_PERIPH, M62429_SDA_PIN, 1); __NOP(); gpio_bit_write(M62429_SCL_PERIPH, M62429_SCL_PIN, SET); __NOP(); gpio_bit_write(M62429_SDA_PERIPH, M62429_SDA_PIN, 1); __NOP(); gpio_bit_write(M62429_SCL_PERIPH, M62429_SCL_PIN, RESET); __NOP(); } void m62429_set_vol(uint8_t level) { uint16_t data = VolumeTable[level]; // 发送10位数据,共11位,最后1位另外发 for (uint8_t i = 0; i < 10; i++) { gpio_bit_write(M62429_SDA_PERIPH, M62429_SDA_PIN, data & 0x01); gpio_bit_write(M62429_SCL_PERIPH, M62429_SCL_PIN, SET); __NOP(); gpio_bit_write(M62429_SDA_PERIPH, M62429_SDA_PIN, 0); gpio_bit_write(M62429_SCL_PERIPH, M62429_SCL_PIN, RESET); data >>= 1; } // 最后1位D10 = 1 gpio_bit_write(M62429_SDA_PERIPH, M62429_SDA_PIN, 0x01); gpio_bit_write(M62429_SCL_PERIPH, M62429_SCL_PIN, SET); __NOP(); gpio_bit_write(M62429_SCL_PERIPH, M62429_SCL_PIN, RESET); }