Čeština / English
Login

Firmware / Ovladač audio kodeku na FITkitu 2.0

Autor: Karel Slaný ()
Update: 31.3.2009

FITkit v2.0 je narozdíl od předchozích verzí osazen audio kodekem TLV320AIC23BPWTLV320AIC23B (FITkit verze v1.x jsou osazeny pouze zesilovačem. O veškerou digitalizaci a analogizaci se zde stará MCU).

1. Rozhraní SPI

Kodek samozřejmě obsahuje zvukový analogový vstup a výstup. Pro práci s kodekem pak slouží další dvě odlišná rohraní. Konfigurační rozhraní (software control), které slouží ke konfiguraci některých parametrů kodeku, jako je třeba ovládání způsobu zpracovádí dat, řízení datových cest, ovládání zesilovačů, nastavování pracovních režimů. Datově vstupně/výstupní rozhraní, které slouží pro přenos digitalizovaných dat a nastavování digitalních filtrů.

Ovladač kodeku se nachází v souborech mcu/libs/codec/audio_codec.h a mcu/libs/codec/audio_codec.c.

1.1. Konfigurace kodeku

Probíhá přes samostatné rohraní, které slouží pouze k zápisu. Není možné přes něj z kodeku vyčíst jeho ahtuální konfiguraci. Může pracovat ve dvou režimech. Na FITkitu lze použít pouze rohraní SPI, protože je signál MODE zapojen do log. 1.

Způsob práce s SPI rozhraním kodeku se liší od SPI použitého ke komunikaci s FPGA z důvodu použití mírně odlišných signálů.

SPI rohraní kodeku a FPGA sdílí signály SPI_DO a SPI_CLK. Jako signál výběru komponenty slouží pro audio kodek signál ACLK. V tom se liší od zapojení FPGA. Signál ACLK je na FITkitu rovněž připojen k FPGA a může sloužit k rozvodu 32kHz hodinového signálu interních hodin MCU. Naštěstí žádná komponenta v FPGA není navržena k použití těchto hodin, takže můžeme signál ACLK směle využít ke konfiguraci kodeku.

Konfigurace kodeku probíhá nastavováním 11 interních registrů. (Podrobnější informace laneznete v datasheetu kodeku.) Každý registr je devítibitový a má svou sedmibitovou adresu. Pro nastavní jednoho registru musíte tedy přes SPI poslat 16 bitů adresy registru a jeho obsah. Přenos se zahajuje nastavením ACLK do 0. V každém hodinovém cyklu SPI_CLK se přenese jeden bit adresy registru a jeho obsahu. Přenos se ukončuje přenesením 16. bitu a nastavením ACLK do 1.

Fukce pro kofiguraci:

  • void codec_SPI_write(unsigned int addr, unsigned int data)

    Funkce nastaví registr na adrese addr na požadovanou hodnotu data. Funkce tedy přenese 16 bitů přes SPI.

Signál ACLK slouží jako select signál audio kodeku. Pokud na něj připojíte v MCU interní 32kHz hodiny, nebude možné kodek správně nakonfigurovat.

alias adresy

adresa

funkce registru

LINE_IN_VOL_L

0x00

ovládání hlasitosti levého vstupního kanálu

LINE_IN_VOL_R

0x01

ovládání hlasitosti pravého vstupního kanálu

HPHONE_OUT_VOL_L

0x02

ovládání hlasitosti levého výstupního kanálu sluchátek

HPHONE_OUT_VOL_R

0x03

ovládání hlasitosti pravého výstupního kanálu sluchátek

ALOG_PATH_CTRL

0x04

řízení analogové cesty

DTAL_PATH_CTRL

0x05

řízení digitální cesty

PWR_DWN_CTRL

0x06

zapínání/vypínání činnosti interních komponent

DTAL_IFACE_FMAT

0x07

řízení formátu digitálního datového rozhraní

SRATE_CTRL

0x08

řízení vzorkovací frekvence

DTAL_IFACE_ACT

0x09

aktivace digitálního rozhraní

RST_REG

0x0F

reset, uvedení do výchozí konfigurace

Tabulka : Adresy a popis funkce konfiguračních regisrů.

2. Rozhraní digitálního zvuku

Kodek je vybaven rozhaním pro přenos digitalizovaného zvuku.

signál

směr

funkce

BCLK

vstup, výstup

časování

LRCIN

vstup, výstup

synchronizace zápisu

LRCOUT

vstup, výstup

synchronizace čtení

DIN

vstup

datový vstup

DOUT

výstup

datový výstup

Tabulka : Digitální rozhraní kodeku.

Rozhraní pro přenos digitalizovaného zvuku tvoří pět signálu uvedených v tabulce. V závislosti na nastavení přenosového protokolu mají některé signály odlišnou funkci.

Kodek může pracovat jako master nebo slave:

  • master - kodek si nastavuje BCLK, LRCIN, LRCOUT, ty se chovají jako výstup.

  • slave - kodek poslouchá BCLK, LRCIN, LRCOUT, které se chovají jako vstupy. Tyto signály musí nastavovat připojené zařízení. Protokol a časování musí korespondovat s konfigurací kodeku.

Rozhraní pro přenos digitálního zvuku podporuje čtyři komunikační protokoly, jejich výčet naleznete v dokumentaci TLV320AIC23B. Zde je popsán pouze DSP režim, protože ten je použit pro komunikaci s FPGA.

2.1. DSP režim

Jedná se o režim kompatibilní s McBSP porty DSP procesorů firmy Texas Instruments. Signály `signal:LRCIN`` a LRCOUT slouží jako synchronizace přenosu datových rámců. Sestupná hrana těchto signálů zahajuje přenos jednoho rámce. Každý rámec se skládá ze dvou slov. Jedno slovo odpovídá jednomu vzorku. Bitová šířka slova může být nastavena na 16b, 20b, 24b nebo 32b. V jednom rámci je nejdříve přenášeno slovo levého kanálu, které je okamžitě následováno vzorkem pravého kanálu. U obou slov je přenos zahájen nejvyšším významovým bitem. Přenos dalšího rámce musí být zahájen signály LRCIN nebo LRCOUT.

aud_dsp_io.png

Obrázek 2.1: Časování signálů v DSP režimu. Diagram ukazuje časování pro LPR=1, které je použito při komunikaci s FPGA. To znamená, že první bit levého vzorku levého kanálu musí být dostupný na náběžné hraně BCLK až za sestupnou hranou signálů LRCIN a LRCOUT. Šířka slova je nastavena na 16 bitů.

Rychlost nastavování signálů LRCIN a LRCOUT závisí na použité vzorkovací frekvenci.

2.2. Nastavení vzorkovací frekvence

Ke kodeku je připojen 12MHz oscilátor (MCLK). V závislosti na rychlosti připojených hodin je možné nastavit požadovanou vzorkovací frekvenci. Tabulky uvádějící dostupné vzorkovací frekvence pro specifické frekvence MCLK naleznete v dokumentaci kodeku TLV320AIC23B.

Pro vstupní A/D a výstupní D/A převodník je možné nastavit rozdílné vzorkovací frekvence. Dále je možné pro každý převodník použít frekvenční dělič, kterým se zpomalí hodiny na polovinu, tím je možné dosáhnout další snížení vzorkovací frekvence.

Kodek podporuje dva režimy pro vzorkování:

  • USB - pro frekvenci MCLK = 12MHz

  • normální - pro frekvence MCLK = 12,288MHz, 11,2896MHz, 18,432MHz a 16,9344MHz

I když je ke kodeku připojen 12MHz oscilátor, lze kodek nakonfigurovat také do normálního režimu, ve kterém bude fungovat. V dokumentaci TLV320AIC23B lze nalézt kofigurace vzorkovacích frekvencí pro normální režim.

Pokud nakonfigurujete kodek do normálního režimu, nebudou data vzorkována na frekvencích uvedených v datasheetu. Podíl skutečné vzorkovací frekvence a požadované frekvence bude odpovídat podílu 12MHz ku rychlosti hodin uvedených v dokumentaci pro danou konfiguraci.

ADC (kHz)

DAC (kHz)

96

96

88,2

88,2

48

48

44,1

44,1

32

32

8,021

8,021

8

8

48

8

44,1

8,021

8

48

8,021

44,1

Tabulka : Dostupné kombinace vzorkovacích frekvencí v USB režimu bez dělení MCLK.

V USB režimu kodek nevzorkuje přesně na frekvencích uvedených v tabulce. Skutečné frekvence jsou velmi blízké ale vyšsší (viz dokumentace).

3. Příklad konfigurace kodeku

Kód, který nastaví 48kHz vzorkovací frekvenci pro A/D a D/A převodníky. Nakonfiguruje rozhraní do DSP režimu. Nastaví kodek jako master. Aktivuje vstupy, výstupy a kodek.

// reset codec
codec_SPI_write(RST_REG, 0);
// setup analog path
// disable added sidetone, eable DAC, disable nalob bypass, mute microphone, disable microphone boost
codec_SPI_write(ALOG_PATH_CTRL, ST_disable | DAC_on | BYP_off | INSEL_line | MICM_on | MICB_off);
// setup digital interface
// master mode, disable left-right channel swap, left-right phase on, word lengt 16b, DSP digital interface
// LRP_on must be set, MSB must be available after LRCIN/CLRCOUT falling edge
codec_SPI_write(DTAL_IFACE_FMAT, MS_master |  LRSWAP_off | LRP_on | IWL_16bit | FOR_DSP);
// setup sample rate
// no clock output and input divider, 48kHz sampling rate in USB mode
codec_SPI_write(SRATE_CTRL, CLKOUT_full | CLKIN_full | USB_ADC48k_DAC48k | CLKMOD_USB);
// setup digital interface
// enable digital interface
codec_SPI_write(DTAL_IFACE_ACT, ACT_on);
// setup line in
// left-right swap off, disable mute, 0dB gain
codec_SPI_write(LINE_IN_VOL_L, LRS_off | LIM_off | (LIV_GAIN_Z));
codec_SPI_write(LINE_IN_VOL_R, RLS_off | LIM_off | (LIV_GAIN_Z));
// setup headphone out
// zero cross-detect off, 0dB gain
codec_SPI_write(HPHONE_OUT_VOL_L, LZC_on | (LHV_GAIN_Z - 0));
codec_SPI_write(HPHONE_OUT_VOL_R, RZC_on | (RHV_GAIN_Z - 0));
// setup digital path
// DAC mute off, disable de-emphasis, enable ADC high-pass filter
codec_SPI_write(DTAL_PATH_CTRL, DACM_off | DEEMP_disabled | ADCHP_on);
// setup codec power
// device power on, clock on, oscillator on, outputs on, DAC on, ADC on, microphone off, line input on
codec_SPI_write(PWR_DWN_CTRL, CODEC_ON | CODEC_CLK_on | CODEC_OSC_on |
                              CODEC_OUT_on | CODEC_DAC_on | CODEC_ADC_on | CODEC_MIC_off | CODEC_LINE_on);
Zobrazeno: 2724x Naposledy: 29.11.2023 05:23:49