mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Initialisierung EZ-KIT 21369


Autor: André (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo...

Ich entwickle derzeit einen Signalverarbeitungsstrecke im Audiobereich 
auf dem Eval-Board EZ-KIT 21369 von AD.
Unabhängig davon möchte ich die Wandler später auf eine fs=96khz setzen.
Meine Frage betrifft also die Initialisierung des Codecs AD1835a(ADC und 
DAC).

Erstmal der QuellCode aus dem Example Talkthrough, welches den Eingang 
unmodifiziert über die Wandler und SPORTS an die Ausgang routet:

INIT des Codecs
#include <def21369.h>
#include "ad1835.h"

.global _init1835viaSPI;


//===============================================================

.section/dm seg_dmda;

.var spi_semaphore;
.var config_tx_buf[]=          // Buffer of configuration data
            WR | DACCTRL1 | DACI2S | DAC24BIT | DACFS48,
            WR | DACCTRL2, // e.g.: | DACMUTE_R1 | DACMUTE_L2,
            WR | DACVOL_L1 | DACVOL_MAX,
            WR | DACVOL_R1 | DACVOL_MAX,
            WR | DACVOL_L2 | DACVOL_MAX,
            WR | DACVOL_R2 | DACVOL_MAX,
            WR | DACVOL_L3 | DACVOL_MAX,
            WR | DACVOL_R3 | DACVOL_MAX,
            WR | DACVOL_L4 | DACVOL_MAX,
            WR | DACVOL_R4 | DACVOL_MAX,
            WR | ADCCTRL1 | ADCFS48,
            WR | ADCCTRL2 | ADCI2S | ADC24BIT,
            WR | ADCCTRL3 | IMCLKx2 | PEAKRDEN;

//===============================================================

.section/pm seg_pmco;

_init1835viaSPI:

    //--------------------------
    // Clear SPTFLG and SPICTL regs to start
    r0 = 0;
    dm(SPICTL)=r0;
    dm(SPIFLG)=r0;

    //---------------------------------------------------------
    // Writing TXFLSH and RXFLSH bits in SPICTL clear the SPI
    // transmit and receive FIFOs, respectively.
    r0 = dm(SPICTL);
    r1 = (TXFLSH | RXFLSH );
    r0 = r0 OR r1;
    dm(SPICTL)=r0;


    //----------------------------
    // Setup the baud rate to 500 KHz
    r0 = 100;
    dm(SPIBAUD) = r0;


    //--------------------------------------------
    // Set the SPIFLG register to FLAG3 (0xF708)
    r0 = 0xF708;
    dm(SPIFLG) = r0;


    //------------------------------------------------------
    // Now set the SPI control register
    r0 = (SPIEN |   // enable the port
          SPIMS |   // set SHARC as SPI master
          MSBF |    // send MSB first
          WL16 |    // word length = 16 bits
          TIMOD1);  // Initialize SPI port to begin
                    // transmitting when DMA is enabled
    dm(SPICTL) = r0;


    //-------------------------------------------
    // Set up DAG registers to transmit via SPI
    i4 = config_tx_buf;
    m4 = 1;


    //------------------------------
    // Set up loop to transmit data
    lcntr = LENGTH(config_tx_buf), do word_sent until lce;

        // Send a word
        r0=dm(i4,m4);
        dm(TXSPI)=r0;

        // Wait until "SPI transfer complete" status bit
        //   in SPISTAT (SPIF) indicates that we can send more
        do checkIfTXisDone until TF;

            ustat3 = dm(SPISTAT);
            BIT TST ustat3 SPIF;

        checkIfTXisDone:
        nop;

        // Wait an extra 100 cycles to meet the timing
        //   requirements of the AD1835A
        lcntr = 100, do pauseFor1835 until lce;
        pauseFor1835:
        nop;


    word_sent:
    nop;

/*
    //-----------------------------------------
    // Flush SPI buffers after initialization
    //   You may want to do this before sending
    //   other SPI commands to guarantee that
    //   you have not accidentally left data in
    //   the transmit or receive FIFOs.
    r0 = dm(SPICTL);
    r1 = (TXFLSH | RXFLSH );
    r0 = r0 OR r1;
    dm(SPICTL)=r0;
*/

_init1835viaSPI.end:
    rts;


Headerfile
#ifndef _AD1835_H_
#define _AD1835_H_

//
//  AD1835.h
//
//  Configuration values for the AD1835A codec
//

#define DACCTRL1     (0x0000)  // DAC control register 1    (R/W)
#define DACCTRL2     (0x1000)  // DAC control register 2    (R/W)
#define DACVOL_L1   (0x2000)  // DAC volume - left 1       (R/W)
#define DACVOL_R1   (0x3000)  // DAC volume - right 1      (R/W)
#define DACVOL_L2   (0x4000)  // DAC volume - left 2       (R/W)
#define DACVOL_R2   (0x5000)  // DAC volume - right 2      (R/W)
#define DACVOL_L3   (0x6000)  // DAC volume - left 3       (R/W)
#define DACVOL_R3   (0x7000)  // DAC volume - right 3      (R/W)
#define DACVOL_L4   (0x8000)  // DAC volume - left 4       (R/W)
#define DACVOL_R4   (0x9000)  // DAC volume - right 4      (R/W)
#define ADCPEAKL     (0xA000)  // ADC left peak              (R)
#define ADCPEAKR     (0xB000)  // ADC right peak             (R)
#define ADCCTRL1     (0xC000)  // ADC control 1             (R/W)
#define ADCCTRL2     (0xD000)  // ADC control 2             (R/W)
#define ADCCTRL3     (0xE000)  // ADC control 3             (R/W)

#define RD           (0x0800)
#define WR           (0x0000)  // Write to register


// DAC control register 1
#define DEEMPH44_1   (0x0100)  // Deemphasis filter for 44.1 KHz
#define DEEMPH32     (0x0200)  // Deemphasis filter for 32.0 KHz
#define DEEMPH48     (0x0300)  // Deemphasis filter for 48.0 KHz

#define DACI2S       (0x0000)  // DAC receives I2S format
#define DACRJ        (0x0020)  // DAC receives I2S format
#define DACDSP       (0x0040)  // DAC receives I2S format
#define DACLJ        (0x0060)  // DAC receives I2S format
#define DACPACK256   (0x0080)  // DAC receives I2S format

#define DAC24BIT     (0x0000)  // 24-bit output word length
#define DAC20BIT     (0x0008)  // 20-bit output word length
#define DAC16BIT     (0x0010)  // 16-bit output word length

#define DACPOWERDN   (0x0004)  // DAC into power-down mode

#define DACFS48      (0x0000)  // Sample rate = 48 KHz (x8)
#define DACFS96      (0x0001)  // Sample rate = 96 KHz (x4)
#define DACFS192     (0x0002)  // Sample rate = 192 KHz (x2)


// DAC control register 2

#define DACREPLICATE  (0x0100)  // Replicate output of DAC 1/2 on 3/4, 5/6 & 7/8
#define DACMUTE_R4    (0x0080)  // Mute DAC output channel (clear to un-mute)
#define DACMUTE_L4    (0x0040)  // Mute DAC output channel (clear to un-mute)
#define DACMUTE_R3    (0x0020)  // Mute DAC output channel (clear to un-mute)
#define DACMUTE_L3    (0x0010)  // Mute DAC output channel (clear to un-mute)
#define DACMUTE_R2    (0x0008)  // Mute DAC output channel (clear to un-mute)
#define DACMUTE_L2    (0x0004)  // Mute DAC output channel (clear to un-mute)
#define DACMUTE_R1    (0x0002)  // Mute DAC output channel (clear to un-mute)
#define DACMUTE_L1    (0x0001)  // Mute DAC output channel (clear to un-mute)


//-------------------------------------------------------------------------------
//DAC Volume Control - 10-bit granularity (1024 levels)
#define DACVOL_MIN      (0x000)
#define DACVOL_LOW      (0X100)
#define DACVOL_MED      (0X200)
#define DACVOL_HI       (0X300)
#define DACVOL_MAX      (0x3FF)
#define DACVOL_MASK     (0x3FF)  // Volume in dB is in 10 LSBs
                                 //   3FF = 0 dBFS = 1023/1023
                                 //   3FE = -0.01 dBFS = 1022/1023
                                 //      ...
                                 //   002 = -50.7 dBFS = 3/1023
                                 //   001 = -54.2 dBFS = 2/1023

//-------------------------------------------------------------------------------
//  ADC Control 1

#define ADCHPF     (0x0100)  // High pass filter (AC-coupled)
#define ADCPOWERDN (0x0080)  // DAC into power-down mode
#define ADCFS48    (0x0000)  // Sample rate = 48 KHz
#define ADCFS96    (0x0001)  // Sample rate = 96 KHz

//-------------------------------------------------------------------------------
//  ADC Control 2

#define AUXSLAVE   (0x0000)  // Aux input is in slave mode
#define AUXMASTER  (0x0200)  // Aux input is in master mode

#define ADCI2S     (0x0000)  // ADC transmits in I2S format
#define ADCRJ      (0x0040)  // ADC transmits in right-justified format
#define ADCDSP     (0x0080)  // ADC transmits in DSP (TDM) format
#define ADCLJ      (0x00C0)  // ADC transmits in left-justified format
#define ADCPACK256 (0x0100)  // ADC transmits in packed 256 format
#define ADCAUX256  (0x0180)  // ADC transmits in packed 128 format

#define ADC24BIT   (0x0000)  // 24-bit output word length
#define ADC20BIT   (0x0010)  // 20-bit output word length
#define ADC16BIT   (0x0020)  // 16-bit output word length

#define ADCMUTER   (0x0002)  // Mute right channel from ADC
#define ADCMUTEL   (0x0001)  // Mute right channel from ADC

//-------------------------------------------------------------------------------
//  ADC Control 3

#define IMCLKx2    (0x0000)  // Internal MCLK = external MCLK x 2
#define IMCLKx1    (0x0080)  // Internal MCLK = external MCLK
#define IMCLKx23   (0x0100)  // Internal MCLK = external MCLK x 2/3

#define PEAKRDEN   (0x0020)  // Enable reads of peak ADC levels
#define PEAKLEVELMASK  (0x003F)  // Six significant bit of level
                  // 000000 = 0dBFS, -1dB/LSB

#endif




Einfachheitshalber hab ich ganz oben in der Initialisierung die ODER- 
Verknüpfungen von DACFS48 und ADCFS48 durch DACFS96 und ADCFS96 ersetzt. 
Aber das scheint dann doch nicht so einfach zu sein. Vielleicht hab ich 
ja noch einen grundlegende Sache nicht beachtet. Aber ich weiß da 
irgendwie nicht weiter.
Wenn jemand Erfahrungen mit dem speziellen Codec oder idealerweise mit 
dem EZ-KIT 21369 hat und mir helfen könnte würde ich mich freuen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.