AVS/GD32F103C8T6/App/User/Peripheral/M62429/m62429.c

115 lines
4.5 KiB
C
Raw Normal View History

2023-10-18 17:36:51 +08:00
#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);
}