Skip to main content
TDerk.1
Associate
March 7, 2021
Question

I2S "Half-Duplex Master" Transmission Mode - "Mode Master Recive" does not work.

  • March 7, 2021
  • 3 replies
  • 1175 views
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2s.h"
#include "gpio.h"
 
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "SEGGER_RTT.h"
#include "debug_helper.h"
 
#define HAL_TIMEOUT 1000
#define MIC_BUFF_SIZE 256
 
int32_t mic_buff[MIC_BUFF_SIZE];
 
void sph0645_test(void)
{
 HAL_StatusTypeDef hal_st;
 while(1)
 {
 hal_st = HAL_I2S_Receive(&hi2s2,
 (uint16_t*)mic_buff,
 MIC_BUFF_SIZE,
 HAL_TIMEOUT);
 if(hal_st != HAL_OK)
 {
 printf("HAL_I2S hal_st=%i\n",hal_st);
 HAL_Delay(5000);
 }
 
 for(uint32_t i=0; i<MIC_BUFF_SIZE; i++)
 {
 printf("\nM="); printBits(sizeof(mic_buff[i]), &mic_buff[i]); HAL_Delay(10);
 }
 }
}
/* USER CODE END Includes */
 
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
 
/* USER CODE END PTD */
 
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
 
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
 
/* USER CODE END PM */
 
/* Private variables ---------------------------------------------------------*/
 
/* USER CODE BEGIN PV */
 
/* USER CODE END PV */
 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
 
/* USER CODE END PFP */
 
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
 
/* USER CODE END 0 */
 
/**
 * @brief The application entry point.
 * @retval int
 */
int main(void)
{
 /* USER CODE BEGIN 1 */
 
 /* USER CODE END 1 */
 
 /* MCU Configuration--------------------------------------------------------*/
 
 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();
 
 /* USER CODE BEGIN Init */
 
 /* USER CODE END Init */
 
 /* Configure the system clock */
 SystemClock_Config();
 
 /* USER CODE BEGIN SysInit */
 /* USER CODE END SysInit */
 
 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_I2S2_Init();
 /* USER CODE BEGIN 2 */
 SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_TRIM);
 //SEGGER_RTT_WriteString(0, "SEGGER RTT START\r\n\r\n");
 printf("printf ok\r\n"); 
 sph0645_test();
 /* USER CODE END 2 */
 
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 /* USER CODE END WHILE */
 
 /* USER CODE BEGIN 3 */
 }
 /* USER CODE END 3 */
}
 
/**
 * @brief System Clock Configuration
 * @retval None
 */
void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 
 /** Supply configuration update enable
 */
 HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
 /** Configure the main internal regulator output voltage
 */
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
 
 while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
 /** Initializes the RCC Oscillators according to the specified parameters
 * in the RCC_OscInitTypeDef structure.
 */
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
 RCC_OscInitStruct.PLL.PLLM = 1;
 RCC_OscInitStruct.PLL.PLLN = 78;
 RCC_OscInitStruct.PLL.PLLP = 2;
 RCC_OscInitStruct.PLL.PLLQ = 8;
 RCC_OscInitStruct.PLL.PLLR = 2;
 RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
 RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
 RCC_OscInitStruct.PLL.PLLFRACN = 0;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
 Error_Handler();
 }
 /** Initializes the CPU, AHB and APB buses clocks
 */
 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
 RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
 RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
 
 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
 {
 Error_Handler();
 }
}
 
/* USER CODE BEGIN 4 */
 
/* USER CODE END 4 */
 
 /**
 * @brief Period elapsed callback in non blocking mode
 * @note This function is called when TIM2 interrupt took place, inside
 * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
 * a global variable "uwTick" used as application time base.
 * @param htim : TIM handle
 * @retval None
 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
 /* USER CODE BEGIN Callback 0 */
 
 /* USER CODE END Callback 0 */
 if (htim->Instance == TIM2) {
 HAL_IncTick();
 }
 /* USER CODE BEGIN Callback 1 */
 
 /* USER CODE END Callback 1 */
}

I have connected SPH0645 to STM32H750VBT on I2S2 port. Mode "Half-Duplex Master" Transmission Mode - "Mode Master Recive".

Oscillograms of CLK WS & DATA signals on processor pins correspond to expectations.

HAL_I2S_Receive () function - fills the input buffer with zeros.

In the "Full-Duplex Master" mode, the HAL_I2S_Receive () function fills the input buffer with correct data.

The code was created by STM32Cube MX. Connected in accordance with STM32Cube MX.

Test project here: https://github.com/derkachtf/I2S2-on-STM32H750VBT

This topic has been closed for replies.

3 replies

waclawek.jan
Super User
March 7, 2021

Isn't pin swapping set? Read out the I2S registers and check against the working case.

JW

TDerk.1
TDerk.1Author
Associate
March 8, 2021

0693W000008wGX4QAM.pngI re-solder the contact as required by STM32Cube MX.

STM32Cube MX offers pin SDO for Master Receive mode.

But I think he should suggest and configure the SDI pin !

waclawek.jan
Super User
March 8, 2021

I don't know what the Cube/HAL functions do, I don't use Cube/HAL. They may cause the pin swap to be activated. Read the SPI/I2S chapter in RM, then read out the SPI/I2S registers for both cases and compare/check/post them.

JW