@@ -123,7 +123,7 @@ AUDIO_DrvTypeDef *audio_drv;
123
123
SAI_HandleTypeDef haudio_out_sai ;
124
124
SAI_HandleTypeDef haudio_in_sai ;
125
125
uint16_t __IO AudioInVolume = DEFAULT_AUDIO_IN_VOLUME ;
126
-
126
+
127
127
/**
128
128
* @}
129
129
*/
@@ -170,7 +170,6 @@ uint8_t BSP_AUDIO_OUT_Init(uint16_t OutputDevice, uint8_t Volume, uint32_t Audio
170
170
{
171
171
uint8_t ret = AUDIO_ERROR ;
172
172
uint32_t deviceid = 0x00 ;
173
- uint8_t buffer_fake [32 ] = {0x00 };
174
173
175
174
SAIx_DeInit ();
176
175
@@ -207,11 +206,8 @@ uint8_t BSP_AUDIO_OUT_Init(uint16_t OutputDevice, uint8_t Volume, uint32_t Audio
207
206
/* Resets the audio codec. */
208
207
audio_drv -> Reset (AUDIO_I2C_ADDRESS );
209
208
210
- HAL_SAI_Transmit_DMA (& haudio_out_sai , buffer_fake , 32 );
211
-
212
209
/* Initialize the codec internal registers */
213
210
audio_drv -> Init (AUDIO_I2C_ADDRESS , OutputDevice , Volume , AudioFreq );
214
- HAL_SAI_DMAStop (& haudio_out_sai );
215
211
}
216
212
217
213
@@ -471,7 +467,22 @@ void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai)
471
467
*/
472
468
void HAL_SAI_ErrorCallback (SAI_HandleTypeDef * hsai )
473
469
{
474
- BSP_AUDIO_OUT_Error_CallBack ();
470
+ HAL_SAI_StateTypeDef audio_out_state ;
471
+ HAL_SAI_StateTypeDef audio_in_state ;
472
+
473
+ audio_out_state = HAL_SAI_GetState (& haudio_out_sai );
474
+ audio_in_state = HAL_SAI_GetState (& haudio_in_sai );
475
+
476
+ /* Determines if it is an audio out or audio in error */
477
+ if ((audio_out_state == HAL_SAI_STATE_BUSY ) || (audio_out_state == HAL_SAI_STATE_BUSY_TX ))
478
+ {
479
+ BSP_AUDIO_OUT_Error_CallBack ();
480
+ }
481
+
482
+ if ((audio_in_state == HAL_SAI_STATE_BUSY ) || (audio_in_state == HAL_SAI_STATE_BUSY_RX ))
483
+ {
484
+ BSP_AUDIO_IN_Error_CallBack ();
485
+ }
475
486
}
476
487
477
488
/**
@@ -749,8 +760,7 @@ uint8_t BSP_AUDIO_IN_Init(uint16_t InputDevice, uint8_t Volume, uint32_t AudioFr
749
760
uint8_t ret = AUDIO_ERROR ;
750
761
uint32_t deviceid = 0x00 ;
751
762
uint32_t slot_active ;
752
- uint8_t buffer_fake [32 ] = {0x00 };
753
- /* Only MICROPHONE_2 input supported */
763
+ /* Only MICROPHONE_2 input supported */
754
764
if (InputDevice != INPUT_DEVICE_DIGITAL_MICROPHONE_2 )
755
765
{
756
766
ret = AUDIO_ERROR ;
@@ -805,7 +815,6 @@ uint8_t BSP_AUDIO_IN_Init(uint16_t InputDevice, uint8_t Volume, uint32_t AudioFr
805
815
/* Reset the Codec Registers */
806
816
wm8994_drv .Reset (AUDIO_I2C_ADDRESS );
807
817
808
- HAL_SAI_Receive_DMA (& haudio_in_sai , buffer_fake , 32 );
809
818
/* Initialize the audio driver structure */
810
819
audio_drv = & wm8994_drv ;
811
820
ret = AUDIO_OK ;
@@ -973,7 +982,7 @@ __weak void BSP_AUDIO_IN_HalfTransfer_CallBack(void)
973
982
/**
974
983
* @brief Audio IN Error callback function.
975
984
*/
976
- __weak void BSP_AUDIO_IN_Error_Callback (void )
985
+ __weak void BSP_AUDIO_IN_Error_CallBack (void )
977
986
{
978
987
/* This function is called when an Interrupt due to transfer error on or peripheral
979
988
error occurs. */
@@ -1015,6 +1024,9 @@ __weak void BSP_AUDIO_IN_MspInit(SAI_HandleTypeDef *hsai, void *Params)
1015
1024
/* Enable the DMA clock */
1016
1025
AUDIO_IN_SAIx_DMAx_CLK_ENABLE ();
1017
1026
1027
+ /* arduino internal driver init - somehow redundant with above */
1028
+ dma_init (DMA2 );
1029
+
1018
1030
if (hsai -> Instance == AUDIO_IN_SAIx )
1019
1031
{
1020
1032
/* Configure the hdma_sai_rx handle parameters */
@@ -1045,6 +1057,8 @@ __weak void BSP_AUDIO_IN_MspInit(SAI_HandleTypeDef *hsai, void *Params)
1045
1057
1046
1058
/* SAI DMA IRQ Channel configuration */
1047
1059
HAL_NVIC_SetPriority (AUDIO_IN_SAIx_DMAx_IRQ , AUDIO_IN_IRQ_PREPRIO , 0 );
1060
+ /* Register also the IRQ in arduino DMA driver so that correct handler is called */
1061
+ dma_attach_interrupt (DMA2 , DMA_STREAM3 , BSP_AUDIO_IN_DMA2_Stream3_IRQHandler );
1048
1062
HAL_NVIC_EnableIRQ (AUDIO_IN_SAIx_DMAx_IRQ );
1049
1063
1050
1064
/* Audio INT IRQ Channel configuration */
@@ -1176,7 +1190,7 @@ static void SAIx_In_Init(uint32_t SaiOutMode, uint32_t SlotActive, uint32_t Audi
1176
1190
/* Configure SAI_Block_x Frame
1177
1191
Frame Length: 64
1178
1192
Frame active Length: 32
1179
- FS Definition: Start frame Channel Side identification
1193
+ FS Definition: Start frame + Channel Side identification
1180
1194
FS Polarity: FS active Low
1181
1195
FS Offset: FS asserted one bit before the first bit of slot 0 */
1182
1196
haudio_in_sai .FrameInit .FrameLength = 64 ;
0 commit comments