K1Guitar/device/AW816/Drv_AW816.c

106 lines
2.9 KiB
C
Raw Normal View History

/*
* 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;
}