Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2015:audio-interface

Zadání

Sestavte zvukové rozhraní pro počítač pomocí procesoru STM32. Použijte knihovny pro třídu „USB Device Class for Audio Devices“. Implementujte zvukový výstup z PC vč. ovládání hlasitosti na vývojové desce STM32F4DISCOVERY. Doplňte o vstup z integrovaného MEMS mikrofonu. Projekt ve spolupráci s Audified


Úvod

Cílem tohoto projektu je vytvořit software a jednoduchý hardware pro zvolenou vývojovou desku, aby po připojení USB konektou k počítači, bylo toto zařízení identifikováno jako Audio Device a bylo přiřazeno jako zařízení pro audio vstup i výstup. Dále bude možné pomocí hardwarového tlačítka na desce možné zvolit funkci Mute pro úplné zeslabení výstupní hlasitosti odposlechu. Pomocí potenciometru bude možné měnit hlasitost odposlechu. Z pinu číslo 21 na desce bude odebíráno referenční napětí, které bude předřadným odporem omezeno na maximální bezpečné napětí pro AD převodníky desky a otáčením potenciometru bude regulováno napetí přivedené na vstup AD převodníku.


Vývojový hardware

STM32F4 Discovery

Key Features

  STM32F407VGT6 microcontroller featuring 32-bit ARM Cortex-M4F core, 1 MB Flash, 192 KB RAM in
  an LQFP100 package
  On-board ST-LINK/V2 with selection mode switch to use the kit as a standalone ST-LINK/V2 
  (with SWD connector for programming and debugging)
  Board power supply: through USB bus or from an external 5 V supply voltage
  External application power supply: 3 V and 5 V
  LIS302DL or LIS3DSH ST MEMS 3-axis accelerometer
  MP45DT02, ST MEMS audio sensor, omni-directional digital microphone
  CS43L22, audio DAC with integrated class D speaker driver
  Eight LEDs:
  LD1 (red/green) for USB communication
  LD2 (red) for 3.3 V power on
  Four user LEDs, LD3 (orange), LD4 (green), LD5 (red) and LD6 (blue)
  2 USB OTG LEDs LD7 (green) VBus and LD8 (red) over-current
  Two push buttons (user and reset)
  USB OTG FS with micro-AB connector
  Extension header for all LQFP100 I/Os for quick connection to prototyping board and easy probing

Software

Základní knihovny pro obsluhu desky a periferií jsou vygenerovány pomocí STM32CubeMX. Zde bylo zvoleno připojení přes FullSpeed USB jako Audio device. Obsluha příkazy pro audio přenos přes I2C1 a data jsou přenášena pomocí I2S2 v polovičním duplexním režimu. Dále jsou použity ADC 1 a 2 a hadrwarové tlačítko.

V hlavním souboru main.c probíha inicializace ADC převodníku, USB device audio class a audio kodeku pro přehrávání audio výstupu.

Použité knihovny v soubotu main.c

 #include "stm32f4xx_hal.h"
 #include "usb_device.h"
 #include "stm32f4xx_hal_adc.h"
 #include "cs43l22.h"
 #include "stm32f4_discovery_audio.h"
 
    assert_param(IS_ADC_CHANNEL(sConfig->ADC_CHANNEL_1));
 
    hadc->Instance->SMPR2 &= ~ADC_SMPR2(ADC_SMPR2_SMP0, sConfig->Channel);
 
    hadc->Instance->SMPR2 |= ADC_SMPR2(sConfig->SamplingTime, sConfig->Channel);
 
    void ADC_Init(hadc);
 
    cs43l22_Init(DAC_CHANNEL_1, OUTPUT_DEVICE_SPEAKER, 60, AUDIO_FREQUENCY_48K);
 
    cmd = AUDIO_CMD_START;
 
while (1)
  {
    if (channel==1)
        {assert_param(IS_ADC_CHANNEL(sConfig->ADC_CHANNEL_1));
         channel=0;
        }
    else
        {assert_param(IS_ADC_CHANNEL(sConfig->ADC_CHANNEL_2));
        channel=1;
        }
  /* USER CODE END WHILE */
 
 
  /* USER CODE BEGIN 3 */
 
  }
 

Nejprve je inicializován AD převodník a přiřazeným kanálem číslo jedna, který odpovídá převodníku ADC1. Na tento převodník je přivedeno napětí z potenciometru, který ovládá Volume přehrávání audio výstupu. Následně jsou přiřazeny patřičné parametry a vzorkovací frekvence.

Dále je inicializován audio kodek, kde je přiřazen výstupní pin na Jack 3.5 mm, zvolen typ výstupního zařízení, počáteční hlasitost v procentech a vrozkovací frekvence na 48 kHz. Stejná je vzorkovací frekvence AD převodníku a rychlost přenosu po USB.

Ve smyčče While je přepínán vstup mezi AD převodníky 1 a 2, takže je střídavě přijímán audio signál a snímáno nastavení Volume.

Hlavní část programu se provádí v souboru usbd_audio_if.c, která využívá další knihovny

#include "usbd_audio_if.h"
#include "stm32f4xx_hal_adc.h"
#include "usbd_audio.h"
#include "stm32f4_discovery_audio.h

Veškeré procesy se provádí při volání funkce AUDIO_AudioCmd_FS. K jejímu volání dochází při naplnění audio bufferu pbuf.

Je využito proměnných ze souboru main.c

  extern hadc;
  extern channel;
  extern cmd;
 
 static int8_t AUDIO_AudioCmd_FS (uint8_t* pbuf, uint32_t size, uint8_t cmd)
 {  /* USER CODE BEGIN 2 */
 
  switch(cmd)
  {
    case AUDIO_CMD_START:
 
        if (HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0)==GPIO_PIN_RESET)
            {BSP_AUDIO_OUT_Play(pbuf, 16);
             cmd = AUDIO_CMD_PLAY;
            }
    break;
 
    case AUDIO_CMD_PLAY:
 
 
        if (HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0)==GPIO_PIN_RESET)
        {
        if (mute=1)
           {
            mute=0;
           }
         else
           {
            mute=1;
           }
         BSP_AUDIO_OUT_SetMute(mute);
        }
 
    break;
 
    if (channel=0)
        vol = 100 * 0xFF / HAL_ADC_GetValue(hadc);
    else
        in = HAL_ADC_GetValue(hadc);
 
    USBD_AUDIO_DataOut(DEVICE_FS,AUDIO_OUT_EP);
 
    BSP_AUDIO_OUT_SetVolume(vol);
 
    pbuf = USBD_AUDIO_DataIn(DEVICE_FS,AUDIO_OUT_EP);
    cs43l22_Play(DAC1_CHANNEL_1, pbuf,8);
  }
  return (USBD_OK);
  /* USER CODE END 2 */
}
/**
  * @brief  AUDIO_VolumeCtl_FS
  *         Controls AUDIO Volume.
  * @param  vol: volume level (0..100)
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t AUDIO_VolumeCtl_FS (uint8_t vol)
{
  /* USER CODE BEGIN 3 */
  return (USBD_OK);
  /* USER CODE END 3 */
}
 

Vstupními parametry funkce jsou označení audio bufferu, jeho velikost a příkaz pro audio zařízení cmd. Nejprve je zařízení v ražimu Start, kde dojde k inicializaci všech periferií atd. Po stistku hardwarového tlačítka přechází do ražimu Play. Když je zařízení v ražimu Play, pak při stisku tlačítka dochází k přepínácí režimu Mute. Dále dojde k čtení hodnoty z AD převodníku pro zvolení hlasitosti přehrávání, respektive načtení audio vstupu druhého AD převodníku a nakonec jsou data ze vstupního bufferu s daty přijatých po USB přenesen do výstupního bufferu audio výstupu.


Správce zařízení


Zařízení pro přehrávání


Závěr

Ze screenshotů je patrné že zařízení se po připojení k PC přihlásí jako audio zařízení pro přehrávání a je připraveno k přenosu dat. Kvůli střídavému čtení hodnot z AD převodníku 1 a 2 může docházet ke ztrátám některých vzorků, pokud by přepínání mezi čtením z převodníků probíhalo pomaleji než s frekvencí 48 kHz.

Bohužel při testech nebylo dosaženo požadované funkčnosti, což je zřejmě způsobeno špatnými parametry pro funkce obsluhující USB přenos. Program přechízi do režimu Play a funguje i Mute a Volume, ale do bufferu se nejspíše nedostávájí správná data. Dokumentace výrobce je absolutně nepřehledná a postrádá faktické informace o skutečném významu a formátu parametrů, takže notná část parametrů funkcí byla odhadnuta podle obsahu knihoven.

2015/audio-interface.txt · Poslední úprava: 2016/01/17 22:13 autor: Martin Kokolia