Question
STM32H7 I2S DMA RX problem but not TX
Hi
I am stuck with STM32H743IIT I2S DMA RX ..
The code is working perfect when uncommet HAL_I2S_Transmit_DMA (Line 29) but when uncomment line 31 HAL_I2S_Receive_DMA it feedback HAL_OK but do never go into the callbacks ..What can be the issue ?
Best regards
Hjalmar
#define I2S_BUFFER_SIZE 48
__attribute__(( section(".MY_RAM_D2") )) volatile uint8_t I2S_TXbuf[I2S_BUFFER_SIZE ];
__attribute__(( section(".MY_RAM_D2") )) volatile uint8_t I2S_RXbuf[I2S_BUFFER_SIZE ];
float phaseStep = 550.0f/192000.0f;
float phaseStepSum = 0;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_I2S2_Init(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN PFP */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_I2S2_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_StatusTypeDef feedBack = HAL_OK;
// feedBack = HAL_I2S_Transmit_DMA(&hi2s2,I2S_TXbuf, sizeof(I2S_TXbuf)>>1);
feedBack = HAL_I2S_Receive_DMA(&hi2s2,I2S_RXbuf, sizeof(I2S_RXbuf)>>1);
//feedBack = HAL_I2SEx_TransmitReceive_DMA(&hi2s2, I2S_TXbuf, I2S_RXbuf, I2S_BUFFER_SIZE >> 1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/* USER CODE BEGIN 4 */
void HAL_I2SEx_TxRxHalfCpltCallback(I2S_HandleTypeDef *hi2s2)
{
}
void HAL_I2SEx_TxRxCpltCallback(I2S_HandleTypeDef *hi2s2)
{
}
void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s2)
{
for(int i = 0; i < I2S_BUFFER_SIZE >> 1 ; i++)
{
printf(" RXbuf : %\r\n", I2S_RXbuf[i]);
}
}
void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s2)
{
for(int i = I2S_BUFFER_SIZE ; i < I2S_BUFFER_SIZE ; i++)
{
printf(" RXbuf : %\r\n", I2S_RXbuf[i]);
}
}
void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s2)
{
fillI2SBuffer_24(0);
}
void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s2)
{
fillI2SBuffer_24(I2S_BUFFER_SIZE>>1);
}
void fillI2SBuffer_24(int indexBegin)
{
int32_t y0 = 0;
int32_t y1 = 0;
float tmp_y;
for(int i = 0; i < I2S_BUFFER_SIZE >> 1; i=i+6 )
{
phaseStepSum = phaseStepSum + phaseStep;
if(phaseStepSum > 1.0f){phaseStepSum = 0;}
tmp_y = (float) sin(6.2832f * phaseStepSum)* 1.0f;
y0 = (int32_t)(tmp_y * 8388607.0f);
I2S_TXbuf[i+2+indexBegin]= y0 & 0xFF ;
I2S_TXbuf[i+1+indexBegin]= (y0 >> 8) & 0xFF;
I2S_TXbuf[i+indexBegin]= (y0 >> 16) & 0xFF;
/*
I2S_TXbuf[i+5+indexBegin]= y0 & 0xFF ;
I2S_TXbuf[i+4+indexBegin]= (y0 >> 8) & 0xFF;
I2S_TXbuf[i+3+indexBegin]= (y0 >> 16) & 0xFF;
*/
I2S_TXbuf[i+5+indexBegin]= 0x00 ;
I2S_TXbuf[i+4+indexBegin]= 0x00;
I2S_TXbuf[i+3+indexBegin]= 0x00;
}
}
