AVS/GD32F103C8T6/App/User/Peripheral/M62429/m62429.c
2023-10-18 17:36:51 +08:00

115 lines
4.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}