|
| 1 | +//! CS43L22 DAC with headphone amp. |
| 2 | +
|
| 3 | +use crate::hal::prelude::*; |
| 4 | + |
| 5 | +use crate::hal::gpio::gpioa::{self, PA4}; |
| 6 | +use crate::hal::gpio::gpiob::{self, PB6, PB9}; |
| 7 | +use crate::hal::gpio::gpioc::{self, PC10, PC12}; |
| 8 | +use crate::hal::gpio::gpiod::{self, PD4}; |
| 9 | +use crate::hal::gpio::{Alternate, AlternateOD, Output, PushPull, AF4, AF6}; |
| 10 | +use crate::hal::i2c::*; |
| 11 | +use crate::hal::i2s::*; |
| 12 | +use crate::hal::rcc::Clocks; |
| 13 | +use crate::hal::stm32::{I2C1, SPI3}; |
| 14 | + |
| 15 | +use embedded_hal::blocking::delay::DelayMs; |
| 16 | + |
| 17 | +pub use cs43l22; |
| 18 | + |
| 19 | +pub struct AudioOut { |
| 20 | + pub cs43l22: cs43l22::CS43L22< |
| 21 | + I2c<I2C1, (PB6<AlternateOD<AF4>>, PB9<AlternateOD<AF4>>)>, |
| 22 | + PD4<Output<PushPull>>, |
| 23 | + >, |
| 24 | + pub i2s: I2s< |
| 25 | + SPI3, |
| 26 | + ( |
| 27 | + PC10<Alternate<AF6>>, |
| 28 | + PA4<Alternate<AF6>>, |
| 29 | + PC12<Alternate<AF6>>, |
| 30 | + NoSdExt, |
| 31 | + ), |
| 32 | + >, |
| 33 | +} |
| 34 | + |
| 35 | +impl AudioOut { |
| 36 | + pub fn new<DELAY: DelayMs<u8>>( |
| 37 | + i2c1: I2C1, |
| 38 | + spi3: SPI3, |
| 39 | + gpioa: gpioa::Parts, |
| 40 | + gpiob: gpiob::Parts, |
| 41 | + gpioc: gpioc::Parts, |
| 42 | + gpiod: gpiod::Parts, |
| 43 | + clocks: Clocks, |
| 44 | + delay: &mut DELAY, |
| 45 | + audio_freq: u32, |
| 46 | + vol: u8, |
| 47 | + ) -> Self { |
| 48 | + // Setup I2C1 using PB6 and PB9 pins at 100kHz bitrate. |
| 49 | + let scl = gpiob.pb6.into_alternate_af4().set_open_drain(); |
| 50 | + let sda = gpiob.pb9.into_alternate_af4().set_open_drain(); |
| 51 | + let i2c1 = I2c::i2c1(i2c1, (scl, sda), 100.khz(), clocks); |
| 52 | + |
| 53 | + // CS43L22 reset pin. |
| 54 | + let reset = gpiod.pd4.into_push_pull_output(); |
| 55 | + |
| 56 | + // Set PC7 into AF6 to output the MCLK for I2S3. |
| 57 | + let _mck = gpioc.pc7.into_alternate_af6(); |
| 58 | + |
| 59 | + // Setup I2S3 for 48kHz audio. |
| 60 | + let ck = gpioc.pc10.into_alternate_af6(); |
| 61 | + let ws = gpioa.pa4.into_alternate_af6(); |
| 62 | + let sd = gpioc.pc12.into_alternate_af6(); |
| 63 | + let i2s3 = I2s::i2s3(spi3, (ck, ws, sd, NoSdExt), audio_freq.hz(), clocks); |
| 64 | + |
| 65 | + let cs43l22 = cs43l22::CS43L22::new(i2c1, reset, delay, vol) |
| 66 | + .expect("could not create CS43L22 driver"); |
| 67 | + |
| 68 | + AudioOut { cs43l22, i2s: i2s3 } |
| 69 | + } |
| 70 | +} |
0 commit comments