unian logo

Università degli Studi di Ancona

Digital Audio Effect
Delay & Echo
Flanging
Chorusing
Phasing
Reverberation
Compression
Expansion

Hardware
Texas logo
Crystal logo

eealab

crystal converter

La qualità degli effetti audio può essere migliorata sostituendo l'interfaccia analogica TLC32040 con i convertitori Crystal:

Il CS4329 e il CS5390 sono convertitori stereo a 20 bit progettati appositamente per digital audio application. Entrambi possono essere utilizzati con diverse frequenze di campionamento incluse 32, 44.1 e 48 KHz.

I convertitori sono montati sulle schede CDB4329 e CDB5390 che, oltre a supportare gli standard audio AES/EBU e S/PDIF, possiedono una interfaccia seriale costituita da un clock di bit, un segnale di sincronismo di frame e da una linea dati. Questo consente di interfacciare i convertitori con il TMS320C31 attraverso la porta seriale, grazie anche alla possibilità di escludere l'interfaccia analogica a bordo del 'C31 DSK.

Alle linee seriali si aggiunge la linea L/R per l'A/D e LRCK per il D/A: questa determina a quale canale è assegnato il pin seriale SDATA e la sua frequenza coincide con quella di campionamento.

CDB/CS5390 Crystal A/D Converter

La scheda fornisce un'interfaccia seriale, costituita dalle linee SDATA, SCLK (clock di bit) e FSYNC (sincronismo di frame), che può essere gestita secondo due modalità:
Master Mode
L/R, FSYNC e SCLK sono linee di output che vengono ricavate a partire dal master clock (ICLKD), come mostra la prima delle figure seguenti.
La frequenza di clock richiesta è funzione della desiderata frequenza di campionamento (L/R) e del settaggio del pin CMODE, come mostrato in tabella:

L/R

CMODE

ICLKD
(MHz)

SCLK
(MHz)

32

low

8.192 2.048
32

high

12.288 2.048
44.1

low

11.2896 2.8224
44.1

high

16.9344 2.8224
48

low

12.288 3.072
48

high

18.432 3.072


Slave Mode
L/R, FSYNC e SCLK sono linee di input. L/R deve essere derivata esternamente da ICLKD e deve avere una frequenza coincidente con la frequenza di campionamento desiderata. SCLK deve essere pari a 64*L/R. FSYNC può essere utilizzato secondo due modalità differenti come mostrato nelle figure 2 e 3.

CDB/CS4329 Crystal D/A Converter

La scheda è progettata per poter essere interfacciata con sisteni esterni attraverso il connettore a 10 pin J1 che consente alla scheda di accettare dati e segnali di clock generati esternamente.

Il transceiver 74HC243 funziona da buffer di I/O e può essere settato come trasmettitore o ricevitore attraverso il jumper CLK SOURCE. Tale transceiver opera come trasmettitore quando il CLK SOURCE è nella posizione 8412 e le linee LRCK, SDATA e SCLK, che costituiscono l'interfaccia seriale, sono disponibili su J1. Anche il master clock può essere portato all'esterno ponendo i jumper J22-J23 nella posizione 0-1. In particolare, il master clock viene determinato, così come il clock seriale, dal digital audio receiver CS8412, a partire dai dati di controllo contenuti nel pacchetto AES/EBU o S/PDIF. Il rapporto SCLK/LRCK è sempre pari a 64.

Il transceiver opera,invece, come ricevitore quando il CLK SOURCE è nella posizione EXTERNAL e le linee LRCK, SDATA e SCLK sono ingressi. In questo caso, il CS8412 viene escluso e ci sono due possibilità per la sorgente del master clock: esso può essere generato internamente installando a bordo un oscillatore e ponendo i jumper J22-J23 nella posizione 1-0. In alternativa, con i jumper nella posizione 0-1, il master clock può essere acquisito dall'esterno.

In modalità EXTERNAL il CS4329 deve essere configurato per essere compatibile con i dati provenienti dalla seriale. Diversi formati possono essere impostati attraverso i jumper DIF0, DIF1 e DIF2, in modo da controllare la relazione di fase tra LRCK, i dati seriali e il clock di bit (SCLK).

INTERFACING TMS320C31 & CRYSTAL CONVERTERS

Il collegamento dei convertitori Crystal con il 'C31 viene realizzato sfruttando le interfacce seriali che processore e convertitori mettono a disposizione.

Poiché le uscite sono tutte TTL-compatibili, non è necessaria, da questo punto di vista, alcuna interfaccia, mentre è richiesta la presenza di un modulo che produca e distribuisca i segnali di sincronismo necessari per il corretto funzionamento del sistema. Tale modulo è progettato tenendo presenti i differenti protocolli seriali (differenti relazioni di fase tra i segnali di clock, frame e dati) utilizzati dal processore e dai due convertitori, nonché la necessità che uno solo di essi generi i segnali di timing (unità MASTER).

Il primo problema da affrontare riguarda proprio la scelta di quale unità debba agire da master e quali, invece, da slave.

Il DAC non possiede un oscillatore a bordo ed è, invece, in grado di ricavare il master clock, e da esso tutti gli altri segnali, a partire dalle informazioni di controllo contenute nei pacchetti AES/EBU o S/PDIF. Poiché, nel caso specifico, non si utilizza nessuno dei precedenti standard audio digitali, è indispensabile generare esternamente i segnali di temporizzazione.

Tanto il 'C31 DSK quanto il CDB5390 sono dotati di un oscillatore a bordo e dei pin da cui derivare i segnali di temporizzazione. Del resto, in slave mode, l'ADC richiede che tutte le linee di controllo della seriale siano ricavate esternamente a partire dal proprio master clock (ICLKD). A tale scopo possono essere utilizzati i timer del 'C31 DSK, pilotati dal clock esterno ICLKD, tuttavia, a questa soluzione, è preferibile quella di utilizzare l'ADC in master mode, in modo da poter derivare da esso tutti i segnali di timing (jumper SMODE=MASTER).

Per quanto riguarda il sample rate, poichè l'oscillatore a bordo del CDB5390 genera un clock di 12.288 MHz, le due possibili frequenze di campionamento sono di 32 o 48 KHz, come dalla tabella precedente. Nel caso specifico si è imposto un sample rate di 32 KHz (jumper CMODE=high).

In base alle impostazioni precedenti, le relazioni di fase tra i segnali di timing generati dall'ADC sono quelle mostrate nella figura seguente.

In particolare, va sottolineato il ciclo di clock seriale (SCLK) che intercorre tra il fronte della linea L/R e quello dei segnali FSYNC (alto durante la trasmissione dei 16 MSB del dato) e SDATA. Ciò significa che il MSB del campione viene inviato dall'ADC sulla linea seriale "contemporaneamente" al segnale di sincronismo di frame FSYNC.

La sezione di ricezione della seriale del 'C31 deve prevedere una modalità compatibile con quella dell'ADC. Come si nota dai diagrammi temporali, il Variable Burst Mode è quello che consente di utilizzare la porta seriale in base alle esigenze specifiche.

In particolare, il MSB del dato viene ricevuto nello stesso ciclo di clock in cui viene alzata la linea FSR che indica l'inizio del trasferimento e deve restare attiva per almeno un ciclo di clock, dopo di che il suo valore è del tutto indifferente (purché basso dopo la ricezione dell'ultimo bit).

Nel caso specifico, il pin CLKR è pilotato dalla linea SCLK e FSX coincide con il segnale FSYNC generato dall'ADC. Essendo infatti la lunghezza di parola della seriale pari a 24 bit, le caratteristiche di FSYNC assicurano che tale segnale sia attivo durante il trasferimento del primo bit (in realtà dei primi 16) e basso dopo il traferimento dell'ultimo bit (in realtà degli ultimi 8).

Per quanto riguarda la lunghezza di parola della seriale, i 24 bit corrispondono a quella minima, tra le quattro possibili (8, 16, 24, 32 bit), che consente di trasferire, in modo unitario, tutti i 20 bit del campione.

Facendo ancora riferimento al Variable Burst Mode, è necessario, a questo punto, assicurare la compatibilità tra la sezione di trasmissione della seriale del 'C31 e la modalità utilizzata dal DAC. A tale proposito si noti che, mentre le linee CLKX e SCLK sono coincidenti ed entrambe pilotate dal clock di bit prelevato dall'ADC, differenti sono i segnali di sincronismo di frame utilizzati dal DAC e dal 'C31. La sezione di trasmissione della seriale si avvale della linea FSYNC (dell'ADC) come segnale di sincronismo FSX; i dati ricevuti dal DAC vengono invece allineati rispetto alla linea LRCK, pilotata dal segnale L/R, secondo le diverse modalità previste.

Questa differenza risulta estremamente importante ricordando il ciclo di clock seriale (SCLK) che intercorre tra il fronte della linea L/R e quello del segnale FSYNC. Ciò comporta, da parte del DAC, una lettura anticipata della linea SDATA rispetto all'istante in cui il MSB è effettivamente disponibile. Ciò può essere evitato utilizzando, tra quelli disponibili, un protocollo seriale che introduce un ciclo di ritardo tra il segnale di sincronismo di frame e la lettura del MSB:

Il precedente formato è quello corrispondente al valore 1-1-0 per i jumper DIF2-DIF1-DIF0.

Una ulteriore osservazione è relativa al fronte del clock seriale su cui avviene la lettura o la scrittura dei dati. Mentre i convertitori operano sui rising edge di SCLK, la seriale del 'C31 utilizza i fronti di discesa della linea CLKR/X che è del resto pilotata dallo stesso SCLK. Si rende pertanto necessaria una inversione di fase del segnale SCLK per poter ricavare da esso i clock di bit CLKR/X. Tale inversione può essere ottenuta ponendo al valore 1-1 i bit 12-13 del Serial Port Global Control Register.

Avendo a che fare con convertitori stereo, l'interfaccia deve essere completata prevedendo la possibilità di determinare, in ogni istante, da quale canale proviene il dato, o a quale canale il dato è inviato, nonché quella di utilizzare uno solo dei due canali messi a disposizione dai convertiori.

Per ciò che riguarda il primo aspetto, esso comporta la necessità di leggere la linea L/R che pertanto dovrà costituire un ingresso per il processore. Nel caso specifico, il pin XF0 del 'C31 viene configurato come general-purpose input pin e pilotato dalla linea L/R. Ciò è ottenuto inizializzando al valore 0h l'IOF Register e quindi leggendo il bit INXF0 (bit 3) dello stesso registro.

La possibilità di selezionare, per altro via software, la modalità MONO/STEREO, viene invece fornita configurando il pin di output (TCLK0) del timer0 come general-purpose output pin e utilizzando tale linea come segnale di enable/disable di uno dei due canali. In particolare, si fa in modo che i segnali di sincronismo di frame FSR/X, relativi al canale destro (L/R=0), siano attivi solo in modo STEREO, mentre vengono ignorati in modalità MONO. In questo ultimo caso, il processore non esegue mai la routine di interrupt per il calcolo dell'uscita sul canale destro, né quella per la lettura dell'input su tale canale: gli interrupt della porta seriale sono infatti subordinati all'attività della linea FSR/X.

La funzione logica che realizza il controllo precedente può essere scritta come:

FSR/X=(L/RandFSYNC)or(TCLK0andFSYNC)

La linea TCLK0 deve essere alta in modalità STEREO (Timer Global Control Register=0x00000006), bassa viceversa (Timer Global Control Register=0x00000002).

La figura seguente mostra l'interfaccia tra il 'C31 ed i convertitori Crystal.

In particolare, il segnale LRCK è ottenuto dall'inversione della linea L/R in modo tale da annullare quella dovuta al formato seriale adottato per il DAC.

Seguendo i successivi link, è possibile vedere un riassunto del set-up dei jumper relativi al CDB5390 e al CDB4329.

Il seguente programma assembly può essere utilizzato come template per la programmazione del 'C31 con l'utilizzo dei convertitori Crystal.

;---------------------------------------------------------
; STEREO.ASM
; Baleani Massimo & Catasta Alessandro & Concettoni Fabrizio
; TMS320 DSP Applications
;
; This program can either be loaded and run from the debugger
; or by directly loading and running from DSK3LOAD
;---------------------------------------------------------

	  .start      "PROGRAM",0x809802
	  .sect       "PROGRAM" 
  

leftch    .float      0.0                    ;sample from the left channel
rightch   .float      0.0                    ;sample from the right channel


GIE       .set        0x2000             ; This bit in ST turns on interrupts
STEREO    .set        0x00000006
MONO      .set        0x00000002
	  .include    "C3XMMRS.ASM"      ;

S0_gctrl_val .word  0x0EA83300        ; Serial port control register values
S0_xctrl_val .word  0x00000111        ;
S0_rctrl_val .word  0x00000111        ;
T0_gctrl_val .word  STEREO
IOF_val      .word  0x00000000

;****************************************************
; Begin main code loop here
;****************************************************
main      or    GIE,ST          ; Turn on INTS
	  ldi   0xF4,IE         ; Enable XINT/RINT/INT2
	  b     main            ; Do it again!

;-------------------------------

DAC       push  ST              ; DAC Interrupt service routine
	  push  R0
	  pushf R0
	  push  R1
	  pushf R1


;------------------------------------
; Test input channel
;------------------------------------

	  ldi    IOF,R1
	  cmpi   8,R1
          bz     leftDAC      
          b      rightDAC

;-------------------------------------
;right channel DAC routine
;-------------------------------------

rightDAC  
	  ldf   @rightch,R0
	  b     END_DAC

;-------------------------------------
;left channel DAC routine
;-------------------------------------


leftDAC
	  ldf   @leftch,R0

END_DAC	  fix   R0,R0
	  lsh   4,R0              ;align sample value
	  sti   R0,@S0_xdata

	  popf   R1
	  pop    R1
	  popf   R0
	  pop    R0 
	  pop    ST              
	  reti                  

;-------------------------------

ADC       push  ST              
	  push  R0
	  pushf R0
	  push  R1
	  pushf R1

;------------------------------------
; Test input channel
;------------------------------------

	  ldi    IOF,R1
	  ldi    @S0_rdata,R0
	  lsh    12,R0              
	  ash    -12,R0
	  float  R0,R0
          cmpi   8,R1
          bz     leftADC          
	  b      rightADC

;-------------------------------------
;right channel ADC routine
;-------------------------------------

rightADC  

	  stf   R0,@rightch
	  b     END_ADC

;-------------------------------------
;left channel DAC routine
;-------------------------------------

leftADC  

	  stf   R0,@leftch


END_ADC	  popf   R1
	  pop    R1
	  popf   R0
	  pop    R0
	  pop    ST              
	  reti                  

;*****************************************************;
; The startup stub is used during initialization only ;
; and can be safely overwritten by the stack or data  ;
;*****************************************************;
	  .entry   ST_STUB        ; Debugger starts here
ST_STUB   ldp   T0_ctrl           ; Use kernel data page and stack
	  ldi   @stack,SP

	  ldi   @T0_gctrl_val,R0  ; Set TCLK0 as enable signal          
	  sti   R0,@T0_ctrl       ;

	  ;---------------------

	  ldi   @S0_xctrl_val,R0;
	  sti   R0,@S0_xctrl    ; transmit control
	  ldi   @S0_rctrl_val,R0;
	  sti   R0,@S0_rctrl    ; receive control
	  ldi   0,R0            ;
	  sti   R0,@S0_xdata    ; DXR data value
	  ldi   @S0_gctrl_val,R0; Setup serial port
	  sti   R0,@S0_gctrl    ; global control
	  
	  ldi   @IOF_val,IOF          

	  b     main            ; 
stack     .word   $             ; Put stack here

;****************************************************;
; Install the XINT/RINT ISR handler directly into    ;
; the vector RAM location it will be used for        ;
;****************************************************;
	  .start   "SP0VECTS",0x809FC5
	  .sect    "SP0VECTS"
	  B        DAC         ; XINT0
	  B        ADC         ; RINT0

Back

Top

About

Digital audio Effects