Merge branch 'master' of https://github.com/danieleff/STM32GENERIC
This commit is contained in:
commit
5e57f156c6
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue