I2S связь на Nucleo-64F401RE

Уже несколько недель я пытаюсь заставить I2S-связь работать между Nucleo-64 STM32F401RE и кодеком (АЦП / ЦАП SGTL5000). Важная вещь: я разрабатываю приложение с использованием интерфейса Arduino. Я проверил конфигурацию GPIO и функциональность таймера (благодаря осциллографу): все в порядке. Но затем я пытаюсь настроить часы и I2S: я просто хочу увидеть что-то выходящее из выводов MCLK, Serial Data и SCLK.

Может ли кто-нибудь сказать мне: - Какие обязательные функции должны быть установлены или реализованы? Какие параметры должны быть настроены? Я буду очень признателен, если кто-нибудь сможет мне помочь, даже с методологией. Вот код, над которым я работаю.

Большое спасибо.

    //I2S communication between Nucleo-64 STM32F401RE and codec SGTL5000


    #include <timer.h>
    #include <Wire.h>
    #include <stm32f4xx_hal.h>
    #include <stm32f4xx_hal_i2s.h>
    #include <stm32f4xx_hal_i2s_ex.h>
    #include "stm32f4xx_hal_gpio.h"

    #define HAL_I2S_MODULE_ENABLED

    uint16_t *hData, *lData;
    int i=0;
    // A full cycle, 16-bit, 2's complement Sine wave lookup table
    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,
    };

    //Timer definition
    stimer_t tim;
    //////////////////////////////
    int FLAG_TIMER=0, FLAG_I2S=0,bascule = 0;
    uint16_t periode = 875; 
    uint16_t prescaler = 1;
    #define sortie 13

    uint16_t *Donnees;
    uint16_t datasize = 16;
    uint32_t transmitdelay  = 100;

    GPIO_InitTypeDef GPIO_InitStructure; 

    //Clock Configuration using HSI (?)
    void SystemClock_Config(void)
    {

      RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
      __PWR_CLK_ENABLE();
      __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

      PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S;
      PeriphClkInitStruct.PLLI2S.PLLI2SN = 192;
      PeriphClkInitStruct.PLLI2S.PLLI2SR = 2;
      HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);

    }

    I2S_InitTypeDef my_i2s;
    __I2S_HandleTypeDef handle_i2s;
    // HAL_I2S_MspInit() implemented thanks to https://github.engineering.zhaw.ch/AudioSystemPlattform/AudioRepo/blob/master/Src/stm32f4xx_hal_msp.c
    void HAL_I2S_MspInit(I2S_HandleTypeDef* hi2s)
    {
      GPIO_InitTypeDef GPIO_InitStruct;
      if(hi2s->Instance==SPI2)
      {    __SPI2_CLK_ENABLE();
          // }  
    //    /**I2S2 GPIO Configuration    
    //    PC2     ------> I2S2_ext_SD
    //    PC3     ------> I2S2_SD
    //    PB10     ------> I2S2_CK
    //    PB12     ------> I2S2_WS
    //    PC6     ------> I2S2_MCK 
    //    */
        GPIO_InitStruct.Pin = GPIO_PIN_2;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
        GPIO_InitStruct.Alternate = GPIO_AF6_I2S2ext;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    //
        GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_6;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
        GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

        GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_12;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
        GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
      }
    }

    void callback(stimer_t *timer){
       *lData = sine_table[i];
       *hData = sine_table[i];
       if(i<256){
       i = i+1;
       HAL_I2S_Transmit(&handle_i2s, hData, datasize, transmitdelay);
       HAL_I2S_Transmit(&handle_i2s, lData, datasize, transmitdelay);
       *hData >>= 8;
       }

      }

    void setup() {
       HAL_Init(); 

      tim.timer=TIM5;
      attachIntHandle(&tim, &callback);
      TimerHandleInit(&tim, periode, prescaler);

      SystemClock_Config();
      my_i2s.Mode = I2S_MODE_MASTER_TX;
      my_i2s.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
      my_i2s.Standard = I2S_STANDARD_PHILLIPS;
      my_i2s.AudioFreq = I2S_AUDIOFREQ_48K;
      my_i2s.CPOL = I2S_CPOL_LOW;
      my_i2s.ClockSource = I2S_CLOCK_PLL;
      my_i2s.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE; 
      handle_i2s.Init = my_i2s;

      HAL_I2S_Init(&handle_i2s);
    }

    void loop() {

      }

0 ответов

Другие вопросы по тегам