14#define PCM_FIFO_SIZE 2048
16#include "max98357_rp2350_drv.h"
17#include "max98357.pio.h"
19max98357_rp2350_drv::max98357_rp2350_drv(gpio_pin_t din_pin,
29 din.setSEL (_IO_BANK0_::GPIO_CTRL_FUNCSEL__pio0);
30 bclk.setSEL (_IO_BANK0_::GPIO_CTRL_FUNCSEL__pio0);
31 lrclk.setSEL(_IO_BANK0_::GPIO_CTRL_FUNCSEL__pio0);
32 _sd.gpioMode(GPIO::OUTPUT_OPEN_DRAIN | GPIO::INIT_HIGH);
33 _edge.gpioMode(GPIO::OUTPUT);
36 _pcm_sm = pio_rp2350::pio0.loadProgram(max98357_program);
37 configure_SM(_pcm_sm, din_pin, bclk_pin, lrclk_pin);
38 _pcm_sm->attachIrq([
this]() ->
void {
42 while (!_pcm_sm->TxFifoFull()) {
44 if (pcmFifoGet(pcm_value)) {
47 if (last_val <= 0 && pcm_value.left >= 0) _edge = HIGH;
48 if (last_val >= 0 && pcm_value.left <= 0) _edge = LOW;
49 last_val = pcm_value.left;
50 val = (pcm_value.left << 16) | pcm_value.right;
52 _pcm_sm->writeTxFifo(val);
59void max98357_rp2350_drv::setPcmRate(uint32_t Hz) {