STMicroelectronics' implementation of an I2S driver, also including DMA support.

Dependents:   temp X_NUCLEO_CCA01M1 X_NUCLEO_CCA01M1 X_NUCLEO_CCA02M1

Platform compatibility

This driver has been designed to support a wide range of the Nucleo F4 Family of platforms and MCUs, but not all members of this family support I2S and/or some of the members might require slight modifications to the sources of this driver in order to make it work on those.

This driver has for now been tested only with the following platforms:

Revision:
4:21603d68bcf7
Parent:
3:25de898f5354
Child:
8:561d7ee70ef6
--- a/targets/TARGET_STM/stm_i2s_api.c	Wed Dec 14 14:23:12 2016 +0100
+++ b/targets/TARGET_STM/stm_i2s_api.c	Wed Dec 21 20:24:16 2016 +0100
@@ -328,8 +328,8 @@
 
 		/* Set default configuration. Default frequency is 44100Hz. */
 		PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S;
-		PeriphClkInitStruct.PLLI2S.PLLI2SN = 213; //Davide: use values which are suggested in Table 91 of the
-		PeriphClkInitStruct.PLLI2S.PLLI2SR = 2;   //        reference manual for master clock enabled & 32000Hz.
+        PeriphClkInitStruct.PLLI2S.PLLI2SN = 271; // betzw: use values which are suggested in Table 91 of the
+        PeriphClkInitStruct.PLLI2S.PLLI2SR = 2;   //        reference manual for master clock enabled & 44100Hz.
 
 #ifdef NDEBUG
 		HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
@@ -348,11 +348,11 @@
     handle->Init.Mode              = i2s_get_mode(mode, &dma_direction);
     handle->Init.Standard          = I2S_STANDARD_PCM_SHORT;
     handle->Init.DataFormat        = I2S_DATAFORMAT_16B;
+    handle->Init.AudioFreq         = I2S_AUDIOFREQ_44K;
     handle->Init.CPOL              = I2S_CPOL_LOW;
-    handle->Init.AudioFreq         = I2S_AUDIOFREQ_32K; //Davide: Default frequency is 32000Hz.
     handle->Init.ClockSource       = I2S_CLOCK_PLL;
     handle->Init.FullDuplexMode    = (fdpx == NC ? I2S_FULLDUPLEXMODE_DISABLE : I2S_FULLDUPLEXMODE_ENABLE);
-	handle->Init.MCLKOutput        = (mclk == NC ? I2S_MCLKOUTPUT_DISABLE : I2S_MCLKOUTPUT_ENABLE); //Davide: Microphones need master clock disabled, while sound terminal needs it enabled.
+	handle->Init.MCLKOutput        = (mclk == NC ? I2S_MCLKOUTPUT_DISABLE : I2S_MCLKOUTPUT_ENABLE); // Davide: Microphones need master clock disabled, while sound terminal needs it enabled.
 
     DEBUG_PRINTF("--> %s\r\n", __FUNCTION__);
     DEBUG_PRINTF("    I2S%u: Mode: %u (%u)\r\n", obj->i2s.module + 1,
@@ -361,10 +361,10 @@
 		(unsigned int)handle->Init.Standard);
     DEBUG_PRINTF("    I2S%u: DataFormat: %u\r\n", obj->i2s.module + 1,
 		(unsigned int)handle->Init.DataFormat);
+    DEBUG_PRINTF("    I2S%u: AudioFreq: %u\r\n", obj->i2s.module + 1,
+    	(unsigned int)handle->Init.AudioFreq);
     DEBUG_PRINTF("    I2S%u: CPOL: %u\r\n", obj->i2s.module + 1,
 		(unsigned int)handle->Init.CPOL);
-    DEBUG_PRINTF("    I2S%u: AudioFreq: %u\r\n", obj->i2s.module + 1,
-    	(unsigned int)handle->Init.AudioFreq);
     DEBUG_PRINTF("    I2S%u: ClockSource: %u\r\n", obj->i2s.module + 1,
     	(unsigned int)handle->Init.ClockSource);
     DEBUG_PRINTF("    I2S%u: FullDuplexMode: %u\r\n", obj->i2s.module + 1,
@@ -814,4 +814,9 @@
     __HAL_I2S_ENABLE(i2s_handle);
 }
 
+I2S_HandleTypeDef *i2s_get_handle(i2s_t *obj)
+{
+	return (I2S_HandleTypeDef *) &I2sHandle[obj->i2s.module];
+}
+
 #endif