K1Guitar/device/AW816/Drv_AW816.c

106 lines
2.9 KiB
C
Raw Permalink 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.

/*
* AW816 数字功放驱动
* 从 STM32 HAL 库移植到 AT32F403A使用硬件 I2C1PB6=SCL / PB7=SDA
* - HAL_I2C_Master_Transmit/Receive -> i2c_master_transmit/receive官方 i2c_application 库)
* - HAL_Delay -> wk_delay_ms
* 依赖middlewares/i2c_application_library已加入工程
*/
#include "Drv_AW816.h"
#include "i2c_application.h"
#include "wk_system.h"
/* ==============================
* 硬件 I2C1 发送Master 无寄存器发送)
* dev_addr 传 8 位格式地址AW816_WR_ADDR=0xB4
* ============================== */
static int AW816_HW_I2C_Send(uint16_t dev_addr, uint8_t *buf, uint8_t len)
{
i2c_handle_type hi2c;
i2c_status_type status;
hi2c.i2cx = AW816_I2C;
status = i2c_master_transmit(&hi2c, dev_addr, buf, len, AW816_I2C_TIMEOUT);
return (status == I2C_OK) ? 0 : -1;
}
/* ==============================
* 硬件 I2C1 读取Master 标准接收)
* dev_addr 传 8 位格式地址AW816_RD_ADDR=0xB5
* ============================== */
static int AW816_HW_I2C_Read(uint16_t dev_addr, uint8_t *buf, uint8_t len)
{
i2c_handle_type hi2c;
i2c_status_type status;
hi2c.i2cx = AW816_I2C;
status = i2c_master_receive(&hi2c, dev_addr, buf, len, AW816_I2C_TIMEOUT);
return (status == I2C_OK) ? 0 : -1;
}
/* ==============================
* 发送指令帧
* ============================== */
static void AW816_Send_Cmd(uint8_t ctrl, uint8_t index, uint8_t lo, uint8_t hi)
{
uint8_t tx_buf[6] = {ctrl, 0x03, index, lo, hi, 0x16};
AW816_HW_I2C_Send(AW816_WR_ADDR, tx_buf, 6);
wk_delay_ms(5);
}
/* ==============================
* 初始化
* ============================== */
void AW816_Init(void)
{
/* I2C1 由 wk_i2c1_init() 或 AD85020B 的 I2C 初始化配置好,
AW816 与其共用同一 I2C1 总线,此处无需重复初始化 GPIO/I2C。 */
}
/* ==============================
* 设置音量
* ============================== */
void AW816_Set_Volume(int16_t vol)
{
if(vol < -9000) vol = -9000;
if(vol > 1200) vol = 1200;
uint16_t val;
if(vol < 0)
{
val = 65536U + (uint16_t)vol;
}
else
{
val = (uint16_t)vol;
}
AW816_Send_Cmd(0x92, 0x02, val & 0xFF, val >> 8);
}
/* ==============================
* 设置混响
* ============================== */
void AW816_Set_Reverb(uint8_t rev)
{
if(rev > 100) rev = 100;
AW816_Send_Cmd(0x95, 0x07, rev, 0x00);
}
/* ==============================
* 读取寄存器数据
* ============================== */
uint8_t AW816_Read_Cmd(uint8_t ctrl, uint8_t *out_lo, uint8_t *out_hi)
{
uint8_t tx_buf[3] = {ctrl, 0x00, 0x16};
uint8_t rx_buf[2] = {0};
AW816_HW_I2C_Send(AW816_WR_ADDR, tx_buf, 3);
wk_delay_ms(5);
AW816_HW_I2C_Read(AW816_RD_ADDR, rx_buf, 2);
*out_lo = rx_buf[0];
*out_hi = rx_buf[1];
return 0;
}