This commit is contained in:
Christoph Haberer 2017-04-27 06:28:47 +02:00
commit 5e57f156c6
4 changed files with 71 additions and 8 deletions

View File

@ -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) {

View File

@ -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);

View File

@ -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;
}

View File

@ -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