AnsweredAssumed Answered

I2S CLK Outputs on nucleo-F446RE

Question asked by ad ho on Jul 13, 2017
Latest reply on Jul 28, 2017 by ad ho
Branched from an earlier discussion

I am facing the same issue with a nucleo-F446RE, I am sure I missed something simple but no signal on the 3 i2s pins set up on half-duplex Master.

 

Using CubeMX, and AC6. 

 

Could someone help?

 

 

/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "stm32f4xx_hal.h"

 

/* USER CODE BEGIN Includes */

 

#define LIGHT_TOGGLE HAL_GPIO_TogglePin(Led_GPIO_Port, Led_Pin);

#define MUTE_TOGGLE HAL_GPIO_TogglePin(Mute_GPIO_Port, Mute_Pin);

#define BLINK_SLOW   LIGHT_TOGGLE;\

  HAL_Delay(1000);

#define BLINK_FAST   \

  while(1){\

  HAL_Delay(200);\

  LIGHT_TOGGLE;}

 

/* USER CODE END Includes */

 

/* Private variables ---------------------------------------------------------*/

I2S_HandleTypeDef hi2s2;

I2S_HandleTypeDef hi2s3;

DMA_HandleTypeDef hdma_spi2_tx;

DMA_HandleTypeDef hdma_spi3_tx;

 

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

uint16_t sine_table[256] = {

 

   0x0000, 0x0324, 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2,

   0x18f8, 0x1c0b, 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11,

   0x30fb, 0x33de, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a,

   0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842,

   0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6,

   0x6a6d, 0x6c24, 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504,

   0x7641, 0x776c, 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3,

   0x7d8a, 0x7e1d, 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6,

   0x7fff, 0x7ff6, 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d,

   0x7d8a, 0x7ce3, 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c,

   0x7641, 0x7504, 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24,

   0x6a6d, 0x68a6, 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4,

   0x5a82, 0x5842, 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4,

   0x471c, 0x447a, 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de,

   0x30fb, 0x2e11, 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b,

   0x18f8, 0x15e2, 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324,

   0x0000, 0xfcdc, 0xf9b9, 0xf696, 0xf375, 0xf055, 0xed38, 0xea1e,

   0xe708, 0xe3f5, 0xe0e7, 0xdddd, 0xdad8, 0xd7da, 0xd4e1, 0xd1ef,

   0xcf05, 0xcc22, 0xc946, 0xc674, 0xc3aa, 0xc0e9, 0xbe32, 0xbb86,

   0xb8e4, 0xb64c, 0xb3c1, 0xb141, 0xaecd, 0xac65, 0xaa0b, 0xa7be,

   0xa57e, 0xa34c, 0xa129, 0x9f14, 0x9d0e, 0x9b18, 0x9931, 0x975a,

   0x9593, 0x93dc, 0x9236, 0x90a1, 0x8f1e, 0x8dab, 0x8c4b, 0x8afc,

   0x89bf, 0x8894, 0x877c, 0x8676, 0x8583, 0x84a3, 0x83d7, 0x831d,

   0x8276, 0x81e3, 0x8163, 0x80f7, 0x809e, 0x8059, 0x8028, 0x800a,

   0x8000, 0x800a, 0x8028, 0x8059, 0x809e, 0x80f7, 0x8163, 0x81e3,

   0x8276, 0x831d, 0x83d7, 0x84a3, 0x8583, 0x8676, 0x877c, 0x8894,

   0x89bf, 0x8afc, 0x8c4b, 0x8dab, 0x8f1e, 0x90a1, 0x9236, 0x93dc,

   0x9593, 0x975a, 0x9931, 0x9b18, 0x9d0e, 0x9f14, 0xa129, 0xa34c,

   0xa57e, 0xa7be, 0xaa0b, 0xac65, 0xaecd, 0xb141, 0xb3c1, 0xb64c,

   0xb8e4, 0xbb86, 0xbe32, 0xc0e9, 0xc3aa, 0xc674, 0xc946, 0xcc22,

   0xcf05, 0xd1ef, 0xd4e1, 0xd7da, 0xdad8, 0xdddd, 0xe0e7, 0xe3f5,

   0xe708, 0xea1e, 0xed38, 0xf055, 0xf375, 0xf696, 0xf9b9, 0xfcdc,

};

/* 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_I2S3_Init(void);

 

/* USER CODE BEGIN PFP */

/* Private function prototypes -----------------------------------------------*/

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin == Button_Pin){

LIGHT_TOGGLE;

MUTE_TOGGLE;

}

}

/* USER CODE END PFP */

 

/* USER CODE BEGIN 0 */

 

/* USER CODE END 0 */

 

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_DMA_Init();

  MX_I2S2_Init();

  MX_I2S3_Init();

 

  /* USER CODE BEGIN 2 */

  HAL_StatusTypeDef ret;

  ret = HAL_I2S_Transmit_DMA(&hi2s2, (uint16_t*)sine_table, 256);

  if(ret == HAL_BUSY){

  BLINK_FAST;

  }

 

  ret = HAL_I2S_Transmit_DMA(&hi2s3, (uint16_t*)sine_table, 256);

  if(ret == HAL_BUSY){

    BLINK_FAST;

  }

 

 

  /* USER CODE END 2 */

 

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

  /* USER CODE END WHILE */

  BLINK_SLOW;

  /* USER CODE BEGIN 3 */

 

  }

  /* USER CODE END 3 */

 

}

 

/** System Clock Configuration

*/

void SystemClock_Config(void)

{

 

  RCC_OscInitTypeDef RCC_OscInitStruct;

  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;

 

    /**Configure the main internal regulator output voltage

    */

  __HAL_RCC_PWR_CLK_ENABLE();

 

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

 

    /**Initializes the CPU, AHB and APB busses clocks

    */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

  RCC_OscInitStruct.HSIState = RCC_HSI_ON;

  RCC_OscInitStruct.HSICalibrationValue = 16;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;

  RCC_OscInitStruct.PLL.PLLM = 16;

  RCC_OscInitStruct.PLL.PLLN = 336;

  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;

  RCC_OscInitStruct.PLL.PLLQ = 2;

  RCC_OscInitStruct.PLL.PLLR = 2;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

 

    /**Initializes the CPU, AHB and APB busses clocks

    */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

 

  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1;

  PeriphClkInitStruct.PLLI2S.PLLI2SN = 192;

  PeriphClkInitStruct.PLLI2S.PLLI2SP = RCC_PLLI2SP_DIV2;

  PeriphClkInitStruct.PLLI2S.PLLI2SM = 16;

  PeriphClkInitStruct.PLLI2S.PLLI2SR = 2;

  PeriphClkInitStruct.PLLI2S.PLLI2SQ = 2;

  PeriphClkInitStruct.PLLI2SDivQ = 1;

  PeriphClkInitStruct.I2sApb1ClockSelection = RCC_I2SAPB1CLKSOURCE_PLLI2S;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

 

    /**Configure the Systick interrupt time

    */

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

 

    /**Configure the Systick

    */

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

 

  /* SysTick_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}

 

/* I2S2 init function */

static void MX_I2S2_Init(void)

{

 

  hi2s2.Instance = SPI2;

  hi2s2.Init.Mode = I2S_MODE_MASTER_TX;

  hi2s2.Init.Standard = I2S_STANDARD_PHILIPS;

  hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B;

  hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;

  hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_44K;

  hi2s2.Init.CPOL = I2S_CPOL_LOW;

  hi2s2.Init.ClockSource = I2S_CLOCK_PLL;

  hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE;

  if (HAL_I2S_Init(&hi2s2) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

 

}

 

/* I2S3 init function */

static void MX_I2S3_Init(void)

{

 

  hi2s3.Instance = SPI3;

  hi2s3.Init.Mode = I2S_MODE_MASTER_TX;

  hi2s3.Init.Standard = I2S_STANDARD_PHILIPS;

  hi2s3.Init.DataFormat = I2S_DATAFORMAT_16B;

  hi2s3.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;

  hi2s3.Init.AudioFreq = I2S_AUDIOFREQ_8K;

  hi2s3.Init.CPOL = I2S_CPOL_LOW;

  hi2s3.Init.ClockSource = I2S_CLOCK_PLL;

  hi2s3.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE;

  if (HAL_I2S_Init(&hi2s3) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

 

}

 

/**

  * Enable DMA controller clock

  */

static void MX_DMA_Init(void)

{

  /* DMA controller clock enable */

  __HAL_RCC_DMA1_CLK_ENABLE();

 

  /* DMA interrupt init */

  /* DMA1_Stream4_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(DMA1_Stream4_IRQn, 0, 0);

  HAL_NVIC_EnableIRQ(DMA1_Stream4_IRQn);

  /* DMA1_Stream5_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);

  HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);

 

}

 

/** Configure pins as

        * Analog

        * Input

        * Output

        * EVENT_OUT

        * EXTI

     PA2   ------> USART2_TX

     PA3   ------> USART2_RX

*/

static void MX_GPIO_Init(void)

{

 

  GPIO_InitTypeDef GPIO_InitStruct;

 

  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOC_CLK_ENABLE();

  __HAL_RCC_GPIOH_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();

  __HAL_RCC_GPIOB_CLK_ENABLE();

 

  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(Led_GPIO_Port, Led_Pin, GPIO_PIN_RESET);

 

  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(Mute_GPIO_Port, Mute_Pin, GPIO_PIN_RESET);

 

  /*Configure GPIO pin : Button_Pin */

  GPIO_InitStruct.Pin = Button_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(Button_GPIO_Port, &GPIO_InitStruct);

 

  /*Configure GPIO pins : USART_TX_Pin USART_RX_Pin */

  GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  GPIO_InitStruct.Alternate = GPIO_AF7_USART2;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

  /*Configure GPIO pin : Led_Pin */

  GPIO_InitStruct.Pin = Led_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(Led_GPIO_Port, &GPIO_InitStruct);

 

  /*Configure GPIO pin : Mute_Pin */

  GPIO_InitStruct.Pin = Mute_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(Mute_GPIO_Port, &GPIO_InitStruct);

 

  /* EXTI interrupt init*/

  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);

  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

 

}

 

/* USER CODE BEGIN 4 */

 

/* USER CODE END 4 */

 

/**

  * @brief  This function is executed in case of error occurrence.

  * @param  None

  * @retval None

  */

void _Error_Handler(char * file, int line)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */

  while(1)

  {

  }

  /* USER CODE END Error_Handler_Debug */

}

 

#ifdef USE_FULL_ASSERT

 

/**

   * @brief Reports the name of the source file and the source line number

   * where the assert_param error has occurred.

   * @param file: pointer to the source file name

   * @param line: assert_param error line source number

   * @retval None

   */

void assert_failed(uint8_t* file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* USER CODE END 6 */

 

}

 

#endif

 

/**

  * @}

  */

 

/**

  * @}

*/

 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Outcomes