Skip to content

Commit da13a7b

Browse files
committed
STM32 i2s pin support
1 parent 767563b commit da13a7b

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

src/AudioI2S/I2SConfigStd.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,13 @@ class I2SConfigStd : public AudioInfo {
5151
int buffer_count = I2S_BUFFER_COUNT;
5252
int buffer_size = I2S_BUFFER_SIZE;
5353

54-
#ifndef STM32
5554
int pin_ws = PIN_I2S_WS;
5655
int pin_bck = PIN_I2S_BCK;
57-
int pin_data; // rx or tx pin dependent on mode: tx pin for RXTX_MODE
58-
int pin_data_rx; // rx pin for RXTX_MODE
56+
int pin_data = -1; // rx or tx pin dependent on mode: tx pin for RXTX_MODE
57+
int pin_data_rx = -1; // rx pin for RXTX_MODE
5958
int pin_mck = PIN_I2S_MCK;
59+
#ifdef STM32
60+
int pin_alt_function = -1;
6061
#endif
6162

6263
#if defined(RP2040_HOWER)

src/AudioI2S/I2SSTM32.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class I2SDriverSTM32 {
5555
}
5656

5757
setupDefaultI2SParameters();
58+
setupPins();
5859
result = use_dma ? startI2SDMA() : startI2S();
5960
this->active = result;
6061
return result;
@@ -323,6 +324,48 @@ class I2SDriverSTM32 {
323324
i2s_stm32.ref = this;
324325
}
325326

327+
void setupPins(){
328+
if (cfg.pin_bck != -1 || cfg.pin_ws != -1 || cfg.pin_data != -1) {
329+
LOGW("pins ignored: used from stm32-i2s");
330+
} else {
331+
LOGI("setting up pins for stm32-i2s");
332+
i2s_stm32.hardware_config.pins[0].function = stm32_i2s::mclk;
333+
i2s_stm32.hardware_config.pins[0].pin = digitalPinToPinName(cfg.pin_mck);
334+
i2s_stm32.hardware_config.pins[0].altFunction = cfg.pin_alt_function;
335+
336+
i2s_stm32.hardware_config.pins[1].function = stm32_i2s::bck;
337+
i2s_stm32.hardware_config.pins[1].pin = digitalPinToPinName(cfg.pin_bck);
338+
i2s_stm32.hardware_config.pins[1].altFunction = cfg.pin_alt_function;
339+
340+
i2s_stm32.hardware_config.pins[2].function = stm32_i2s::ws;
341+
i2s_stm32.hardware_config.pins[2].pin = digitalPinToPinName(cfg.pin_ws);
342+
i2s_stm32.hardware_config.pins[2].altFunction = cfg.pin_alt_function;
343+
344+
switch (cfg.rx_tx_mode) {
345+
case TX_MODE:
346+
i2s_stm32.hardware_config.pins[3].function = stm32_i2s::data_out;
347+
i2s_stm32.hardware_config.pins[3].pin = digitalPinToPinName(cfg.pin_data);
348+
i2s_stm32.hardware_config.pins[3].altFunction = cfg.pin_alt_function;
349+
break;
350+
case RX_MODE:
351+
i2s_stm32.hardware_config.pins[4].function = stm32_i2s::data_in;
352+
i2s_stm32.hardware_config.pins[4].pin = digitalPinToPinName(cfg.pin_data);
353+
i2s_stm32.hardware_config.pins[4].altFunction = cfg.pin_alt_function;
354+
break;
355+
case RXTX_MODE:
356+
i2s_stm32.hardware_config.pins[3].function = stm32_i2s::data_out;
357+
i2s_stm32.hardware_config.pins[3].pin = digitalPinToPinName(cfg.pin_data);
358+
i2s_stm32.hardware_config.pins[3].altFunction = cfg.pin_alt_function;
359+
360+
i2s_stm32.hardware_config.pins[4].function = stm32_i2s::data_in;
361+
i2s_stm32.hardware_config.pins[4].pin = digitalPinToPinName(cfg.pin_data);
362+
i2s_stm32.hardware_config.pins[4].altFunction = cfg.pin_alt_function;
363+
break;
364+
};
365+
366+
}
367+
}
368+
326369
uint32_t getMode(I2SConfigStd &cfg) {
327370
if (cfg.is_master) {
328371
switch (cfg.rx_tx_mode) {

0 commit comments

Comments
 (0)