|
||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
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à:
|
||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||
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 |
|
|