use embassy_stm32 as hal;
use hal::peripherals::*;
use defmt::unwrap;
use embassy_time::Timer;
pub struct Codec {}
const I2C_CODEC_ADDRESS: u8 = 0x8c >> 1;
const SYS_CTRL_REGISTER: u8 = 0x40; const ADC_CTRL1_REGISTER: u8 = 0x48; const DAC_CTRL1_REGISTER: u8 = 0x43;
const MRST_MASK: u8 = 0x80;
const SRST_MASK: u8 = 0x40;
const ADC_PSV_MASK: u8 = 0x20;
const DAC_PSV_MASK: u8 = 0x10;
const FMT_MASK: u8 = 0x1;
impl Codec {
pub async fn setup_pcm3060(i2c: &mut hal::i2c::I2c<'_, hal::mode::Blocking>) {
Self::write_pcm3060_reg(i2c, SYS_CTRL_REGISTER, MRST_MASK, false).await;
Self::write_pcm3060_reg(i2c, SYS_CTRL_REGISTER, SRST_MASK, false).await;
Self::write_pcm3060_reg(i2c, ADC_CTRL1_REGISTER, FMT_MASK, true).await;
Self::write_pcm3060_reg(i2c, DAC_CTRL1_REGISTER, FMT_MASK, true).await;
Self::write_pcm3060_reg(i2c, SYS_CTRL_REGISTER, ADC_PSV_MASK, false).await;
Self::write_pcm3060_reg(i2c, SYS_CTRL_REGISTER, DAC_PSV_MASK, false).await;
}
async fn write_pcm3060_reg(
i2c: &mut hal::i2c::I2c<'_, hal::mode::Blocking>,
register: u8,
mask: u8,
set: bool,
) {
let mut buffer = [0];
unwrap!(i2c.blocking_write_read(I2C_CODEC_ADDRESS, &[register], &mut buffer));
let value = if set {
buffer[0] | mask
} else {
buffer[0] & !mask
};
unwrap!(i2c.blocking_write(I2C_CODEC_ADDRESS, &[register, value]));
Timer::after_micros(10).await;
}
}
#[allow(non_snake_case)]
pub struct Pins {
pub SCL: PB10, pub SDA: PB11, pub MCLK_A: PE2, pub SCK_A: PE5, pub FS_A: PE4, pub SD_A: PE6, pub SD_B: PE3, }