diff --git a/STM32/cores/arduino/stm32/stm32_gpio_af.c b/STM32/cores/arduino/stm32/stm32_gpio_af.c index 0bb88ab..b1e6904 100644 --- a/STM32/cores/arduino/stm32/stm32_gpio_af.c +++ b/STM32/cores/arduino/stm32/stm32_gpio_af.c @@ -61,6 +61,18 @@ void stm32AfI2SInit(const SPI_TypeDef *instance, stm32AfInit(chip_af_i2s_ck, sizeof(chip_af_i2s_ck) / sizeof(chip_af_i2s_ck[0]), instance, ckPort, ckPin, GPIO_MODE_AF_PP, GPIO_NOPULL); } +void stm32AfI2SInitWithMck(const SPI_TypeDef *instance, + GPIO_TypeDef *sdPort, uint32_t sdPin, + GPIO_TypeDef *wsPort, uint32_t wsPin, + GPIO_TypeDef *ckPort, uint32_t ckPin, + GPIO_TypeDef *mckPort, uint32_t mckPin) { + + stm32AfInit(chip_af_i2s_sd, sizeof(chip_af_i2s_sd) / sizeof(chip_af_i2s_sd[0]), instance, sdPort, sdPin, GPIO_MODE_AF_PP, GPIO_NOPULL); + stm32AfInit(chip_af_i2s_ws, sizeof(chip_af_i2s_ws) / sizeof(chip_af_i2s_ws[0]), instance, wsPort, wsPin, GPIO_MODE_AF_PP, GPIO_NOPULL); + stm32AfInit(chip_af_i2s_ck, sizeof(chip_af_i2s_ck) / sizeof(chip_af_i2s_ck[0]), instance, ckPort, ckPin, GPIO_MODE_AF_PP, GPIO_NOPULL); + stm32AfInit(chip_af_i2s_mck, sizeof(chip_af_i2s_mck) / sizeof(chip_af_i2s_mck[0]), instance, mckPort, mckPin, GPIO_MODE_AF_PP, GPIO_NOPULL); +} + void stm32AfI2CInit(const I2C_TypeDef *instance, GPIO_TypeDef *sdaPort, uint32_t sdaPin, GPIO_TypeDef *sclPort, uint32_t sclPin) { diff --git a/STM32/cores/arduino/stm32/stm32_gpio_af.h b/STM32/cores/arduino/stm32/stm32_gpio_af.h index c906de6..962f03f 100644 --- a/STM32/cores/arduino/stm32/stm32_gpio_af.h +++ b/STM32/cores/arduino/stm32/stm32_gpio_af.h @@ -56,6 +56,12 @@ void stm32AfI2SInit(const SPI_TypeDef *instance, GPIO_TypeDef *wsPort, uint32_t wsPin, GPIO_TypeDef *ckPort, uint32_t ckPin); +void stm32AfI2SInitWithMck(const SPI_TypeDef *instance, + GPIO_TypeDef *sdPort, uint32_t sdPin, + GPIO_TypeDef *wsPort, uint32_t wsPin, + GPIO_TypeDef *ckPort, uint32_t ckPin, + GPIO_TypeDef *mckPort, uint32_t mckPin); + void stm32AfI2CInit(const I2C_TypeDef *instance, GPIO_TypeDef *sdaPort, uint32_t sdaPin, GPIO_TypeDef *sclPort, uint32_t sclPin); diff --git a/STM32/libraries/I2S/src/I2S.cpp b/STM32/libraries/I2S/src/I2S.cpp index 151e7b8..77c5a4a 100644 --- a/STM32/libraries/I2S/src/I2S.cpp +++ b/STM32/libraries/I2S/src/I2S.cpp @@ -1,19 +1,25 @@ #include "I2S.h" #include "stm32_gpio_af.h" +#include "Arduino.h" + I2SClass::I2SClass(SPI_TypeDef *instance) { handle.Instance = instance; } I2SClass::I2SClass(SPI_TypeDef *instance, uint8_t sd, uint8_t ws, uint8_t ck) { handle.Instance = instance; + stm32SetSD(sd); + stm32SetWS(ws); + stm32SetCK(ck); +} - this->sdPort = variant_pin_list[sd].port; - this->sdPin = variant_pin_list[sd].pin_mask; - this->wsPort = variant_pin_list[ws].port; - this->wsPin = variant_pin_list[ws].pin_mask; - this->ckPort = variant_pin_list[ck].port; - this->ckPin = variant_pin_list[ck].pin_mask; +I2SClass::I2SClass(SPI_TypeDef *instance, uint8_t sd, uint8_t ws, uint8_t ck, uint8_t mck) { + handle.Instance = instance; + stm32SetSD(sd); + stm32SetWS(ws); + stm32SetCK(ck); + stm32SetMCK(mck); } uint8_t I2SClass::begin(i2s_mode_t mode, uint32_t sampleRate, uint8_t bitsPerSample) { @@ -37,7 +43,15 @@ uint8_t I2SClass::begin(i2s_mode_t mode, uint32_t sampleRate, uint8_t bitsPerSam if (handle.Instance == SPI6) __HAL_RCC_SPI6_CLK_ENABLE(); #endif - stm32AfI2SInit(handle.Instance, sdPort, sdPin, wsPort, wsPin, ckPort, ckPin); + + + if (useMck) { + stm32AfI2SInitWithMck(handle.Instance, sdPort, sdPin, wsPort, wsPin, ckPort, ckPin, mckPort, mckPin); + handle.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE; + } else { + stm32AfI2SInit(handle.Instance, sdPort, sdPin, wsPort, wsPin, ckPort, ckPin); + handle.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE; + } if (mode == I2S_PHILIPS_MODE) { handle.Init.Standard = I2S_STANDARD_PHILIPS; @@ -50,7 +64,6 @@ uint8_t I2SClass::begin(i2s_mode_t mode, uint32_t sampleRate, uint8_t bitsPerSam } handle.Init.Mode = I2S_MODE_MASTER_TX; - handle.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE; handle.Init.AudioFreq = I2S_AUDIOFREQ_44K; handle.Init.CPOL = I2S_CPOL_LOW; handle.Init.ClockSource = I2S_CLOCK_PLL; @@ -102,3 +115,24 @@ void I2SClass::write(uint16_t *data, uint16_t size) { void I2SClass::write32(uint32_t *data, uint16_t size) { HAL_I2S_Transmit(&handle, (uint16_t*)data, size, 1000); } + +void I2SClass::stm32SetSD(uint8_t sd) { + this->sdPort = variant_pin_list[sd].port; + this->sdPin = variant_pin_list[sd].pin_mask; +} + +void I2SClass::stm32SetWS(uint8_t ws) { + this->wsPort = variant_pin_list[ws].port; + this->wsPin = variant_pin_list[ws].pin_mask; +} + +void I2SClass::stm32SetCK(uint8_t ck) { + this->ckPort = variant_pin_list[ck].port; + this->ckPin = variant_pin_list[ck].pin_mask; +} + +void I2SClass::stm32SetMCK(uint8_t mck) { + this->mckPort = variant_pin_list[mck].port; + this->mckPin = variant_pin_list[mck].pin_mask; + useMck = true; +} diff --git a/STM32/libraries/I2S/src/I2S.h b/STM32/libraries/I2S/src/I2S.h index 5faf90f..7f4b49c 100644 --- a/STM32/libraries/I2S/src/I2S.h +++ b/STM32/libraries/I2S/src/I2S.h @@ -15,6 +15,8 @@ class I2SClass { I2SClass(SPI_TypeDef *instance, uint8_t sd, uint8_t ws, uint8_t ck); + I2SClass(SPI_TypeDef *instance, uint8_t sd, uint8_t ws, uint8_t ck, uint8_t mck); + uint8_t begin(i2s_mode_t mode, uint32_t sampleRate, uint8_t bitsPerSample); void write(uint16_t data); @@ -23,14 +25,23 @@ class I2SClass { void write(uint16_t *data, uint16_t size); void write32(uint32_t *data, uint16_t size); + void stm32SetSD(uint8_t sd); + void stm32SetWS(uint8_t ws); + void stm32SetCK(uint8_t ck); + void stm32SetMCK(uint8_t mck); + I2S_HandleTypeDef handle; + bool useMck = false; + GPIO_TypeDef *sdPort = NULL; uint32_t sdPin = 0; GPIO_TypeDef *wsPort = NULL; uint32_t wsPin = 0; GPIO_TypeDef *ckPort = NULL; uint32_t ckPin = 0; + GPIO_TypeDef *mckPort = NULL; + uint32_t mckPin = 0; }; #endif