Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2015:audio-interface

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
2015:audio-interface [2016/01/17 20:25]
Martin Kokolia
2015:audio-interface [2016/01/17 22:13] (aktuální)
Martin Kokolia [Závěr]
Řádek 40: Řádek 40:
 ====== Software ====== ​ ====== Software ====== ​
  
-Základní knihovny pro obsluhu desky a periferií jsou vygenerovány pomocí STM32CubeMX. Zde bylo zvoleno připojení přes FS USH jako Audio device. Obsluha 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.+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.
  
  
Řádek 49: Řádek 49:
 Použité knihovny v soubotu main.c Použité knihovny v soubotu main.c
  
- <​code>​+ <​code ​c>
  #​include "​stm32f4xx_hal.h"​  #​include "​stm32f4xx_hal.h"​
  #​include "​usb_device.h"​  #​include "​usb_device.h"​
Řádek 57: Řádek 57:
  </​code>​  </​code>​
  
- <​code>​+ <​code ​c>
     assert_param(IS_ADC_CHANNEL(sConfig->​ADC_CHANNEL_1));​     assert_param(IS_ADC_CHANNEL(sConfig->​ADC_CHANNEL_1));​
     ​     ​
Řádek 66: Řádek 66:
     void ADC_Init(hadc);​     void ADC_Init(hadc);​
     ​     ​
-    cs43l22_Init(29, OUTPUT_DEVICE_SPEAKER,​ 60, AUDIO_FREQUENCY_48K);​+    cs43l22_Init(DAC_CHANNEL_1, OUTPUT_DEVICE_SPEAKER,​ 60, AUDIO_FREQUENCY_48K);​ 
 +     
 +    cmd = AUDIO_CMD_START;​ 
 + </​code>​ 
 + 
 + <​code c> 
 +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 */ 
 + 
 +  }
  </​code>​  </​code>​
  
 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. 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žen 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.+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.
  
  
Řádek 80: Řádek 102:
 Hlavní část programu se provádí v souboru usbd_audio_if.c,​ která využívá další knihovny ​ Hlavní část programu se provádí v souboru usbd_audio_if.c,​ která využívá další knihovny ​
    
-<​code>​+<​code ​c>
 #include "​usbd_audio_if.h"​ #include "​usbd_audio_if.h"​
 #include "​stm32f4xx_hal_adc.h"​ #include "​stm32f4xx_hal_adc.h"​
Řádek 87: Řádek 109:
 </​code>​ </​code>​
  
-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. ​+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 ​z knihoven +Je využito proměnných ​ze souboru main.c 
- <​code>​+ <​code ​c>
   extern hadc;   extern hadc;
-  extern ​USBD_AUDIO_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC];+  extern ​channel; 
 +  extern cmd;
  </​code>​  </​code>​
  
- <​code>​+ <​code ​c>
  ​static int8_t AUDIO_AudioCmd_FS (uint8_t* pbuf, uint32_t size, uint8_t cmd)  ​static int8_t AUDIO_AudioCmd_FS (uint8_t* pbuf, uint32_t size, uint8_t cmd)
  ​{ ​ /* USER CODE BEGIN 2 */  ​{ ​ /* USER CODE BEGIN 2 */
Řádek 111: Řádek 134:
     case AUDIO_CMD_PLAY:​     case AUDIO_CMD_PLAY:​
  
-       pbuf =  +      ​
         if (HAL_GPIO_ReadPin(GPIOE,​GPIO_PIN_0)==GPIO_PIN_RESET)         if (HAL_GPIO_ReadPin(GPIOE,​GPIO_PIN_0)==GPIO_PIN_RESET)
         {         {
Řádek 128: Řádek 150:
     break;     break;
  
-    vol = 100 * 0xFF / HAL_ADC_GetValue(hadc);​+    ​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);​     BSP_AUDIO_OUT_SetVolume(vol);​
  
-    USBD_AUDIO_DataIn(USB_LEN_DEV_QUALIFIER_DESC,​AUDIO_OUT_EP);​+    ​pbuf = USBD_AUDIO_DataIn(DEVICE_FS,​AUDIO_OUT_EP); 
 +    cs43l22_Play(DAC1_CHANNEL_1,​ pbuf,8);
   }   }
   return (USBD_OK);   return (USBD_OK);
Řádek 152: Řádek 181:
 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. 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. 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í 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.+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.
  
 ---- ----
Řádek 162: Řádek 191:
  
 {{:​2015:​bez_nazvu2.png?​300|}} {{:​2015:​bez_nazvu2.png?​300|}}
 +
 Zařízení pro přehrávání Zařízení pro přehrávání
 ---- ----
Řádek 168: Řádek 198:
 ====== Závěr ====== ====== 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. Přidáním dalšího ADC vstupu ​druhého bufferu ​by bylo možné snadno ​idat audio vstup do PC.+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 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.1453058704.txt.gz · Poslední úprava: 2016/01/17 20:25 autor: Martin Kokolia