WM8805 receiver

Αυτό μόνο πειραματικά μπορεί να βρεθεί.. Το mambo, wm8804 δεν έχει για την s/pdif του; Αν το βάλεις στην s/pdif θα περνάς τα data από δύο wm880x..

Το πιο σωστό θα ήταν να βάλεις έναν επιλογέα I2S να τελειώνεις.
 

lemon

Supreme Member
3 March 2009
4,041
Σε μάμπο2/3 θέλει χέριασμα για να μπει ως i2s, εάν χρησιμοποιείς την είσοδο i2s για usb λειτουργία.

Να το εξηγήσουμε λίγο απλούστερα να γίνει κατανοητό.

Τόσο το μάμπο2 όσο και το μάμπο3 χρησιμοποιεί έναν πολυπλέκτη που δέχεται δύο ζευγάρια σημάτων i2s, ένα από το εσωτερικό του Wolfson 8804 και ένα από το εξωτερικό i2s.
Εάν υποθέσουμε ότι το εξωτερικό i2s το έχεις αποκλειστικά για χρήση από usb, τότε θα πρέπει να χεριαστούν οι 3 είσοδοι σήματος i2s (που έρχονται από το εσωτερικό wolfson της πλακέτας του mambo) και στη θέση τους να συνδεθεί η έξοδος i2s αυτής εδώ της πλακέτας.
Άλλη λύση είναι να πάρεις την έξοδο spdif αυτής εδώ της πλακέτας και να τη συνδέσεις ως είσοδο spdif στο μάμπο2/3, αλλά δεν θεωρώ άρτια τεχνικώς αυτή τη λύση (οι λόγοι ταυτίζονται με αυτό που έγραψε ο Δημήτρης στο πιο πάνω post).

Για κάποιον που χρησιμοποιεί το mambo2/mambo3 αποκλειστικά για spdif και θέλει απλά επέκταση των θυρών spdif, τα πράγματα είναι εύκολα γιατί ενώνει την έξοδο αυτού του κυκλώματος στην ήδη αναμονή για i2s σήμα των mambo και έχει και σε λειτουργία και την είσοδο spdif του μάμπο2/3 και όλες τις εισόδους που δίνει αυτή η πλακέτα.

Ελπίζω να βοήθησα στην ερώτηση.
 
Last edited:

takis

Supreme Member
11 August 2006
3,671
--------------------
λεπτοδουλεια σίγουρα ίσως κάνω κάτι με το (Soekris DAM Input board BoM v0.1) που μου είχες δώσει Δημήτρη αν καταφέρω να το ταιριαξω
 

lemon

Supreme Member
3 March 2009
4,041
Έχει ολοκληρωθεί και από τη δική μου πλευρά.

Έγινε και ο έλεγχος (με τη συνδρομή του Δημήτρη) μέσω i2c και όλα δείχνουν ότι δουλεύουν ρολόι.

Παραθέτω δύο συλλήψεις επικοινωνίας μέσω i2c, μέσω του monitor serial (arduino).
Η μία είναι μέσω οπτικής όπου το σήμα κλειδώνει σωστά από τα 44.1-96KHz, η δεύτερη είναι από coaxial (bnc) όπου το σήμα κλειδώνει κανονικά από τα 44.1-192KHz (φαίνεται και το κολπάκι του κλειδώματος στο δύσκολο 176.4).
Τα unlocked που υπάρχουν είναι γιατί την ώρα που κλείδωνε σε ένα σήμα, άλλαζα συχνότητα δειγματοληψίας από τη γεννήτρια με αποτέλεσμα να ξεκλειδώνει και αμέσως μετά να κλειδώνει εκ νέου στη νέα συχνότητα.

Τέλος παραθέτω 3 συλλήψεις, εισόδου ενός spdif σήματος (48KHz) όπως δίνεται από μια γεννήτρια με όχι καλό τετράγωνο σήμα, το πως αυτή αλλάζει μετά το σωστό τερματισμό πάνω στην πλακέτα μετά το βύσμα bnc και τέλος πως βγαίνει το data stream μετά από το Wolfson 8805.

Θα έλεγα ότι το αποτέλεσμα είναι πάρα πολύ καλό, φανερώνει την πολύ καλή λειτουργία του ίδιου του Wolfson και φυσικά μας διαβεβαιώνει για το σωστό της υλοποίησης.

Θα ακολουθήσουν και άλλες δοκιμές πιο εμπεριστατωμένες, όπως επίσης και η ολοκλήρωση του κώδικα όπου θα φαίνεται ο τρόπος επικοινωνίας μέσω τηλεχειριστηρίου στην επιλογή των εισόδων.
 

Attachments

  • optical.jpg
    optical.jpg
    37.8 KB · Views: 197
  • coaxial.jpg
    coaxial.jpg
    139.5 KB · Views: 196
  • signal_gen.png
    signal_gen.png
    11.7 KB · Views: 196
  • input after termination.png
    input after termination.png
    12 KB · Views: 195
  • wolfson data output.png
    wolfson data output.png
    11.4 KB · Views: 196

lemon

Supreme Member
3 March 2009
4,041
Στα μικρά βήματα που κάνω να κατανοήσω τον κώδικα, έκανα ένα μικρό πείραμα αντί να δείχνει το Serial Monitor το αποτέλεσμα της δειγματοληψίας να το δείχνει η οθόνη.

Φυσικά είναι ένας πειραματισμός, μαθαίνοντας...αλλά βρίσκουμε και δρόμο σιγά-σιγά να το κάνουμε και ομορφότερο.

Αλλάζω δειγματοληψία μέσω της γεννήτριας, το WM8805 κλειδώνει στη πρέπουσα δειγματοληψία και το αποτέλεσμα εμφανίζεται (ως εύρος KHz) στην οθόνη, όπως ακριβώς το ίδιο εμφανίζεται και στο Serial Monitor του Arduino IDE
Η οθόνη είναι μια Digole 1.8" 160Χ128 OLED

 

lemon

Supreme Member
3 March 2009
4,041
Έχω αρχίσει και το "γρατζουνάω" Δημήτρη.

Να και μια εξέλιξή του...

 

lemon

Supreme Member
3 March 2009
4,041
Λοιπόν έχει περάσει τόσος καιρός και δεν αξιωθήκαμε να δώσουμε τον κώδικα για το 8805.

Δεν είμαι σίγουρος ότι έχω κάνει καλή δουλειά, γιατί για να μη μπλέξουμε πρέπει να δοθεί μόνο ο πηγαίος κώδικας δίχως εντολές για συγκεκριμένου τύπου οθόνη.
Επειδή έβγαλα αρκετό μέρος από τον κώδικα όπου αφορούσε την οθόνη αλλά και άλλες λειτουργίες εκτός του 8805, πιθανόν να έχουν μείνει κάποια "σκουπίδια"

Ο κώδικας περιλαμβάνει ρουτίνα τηλεχειριστηρίου για επιλογή εισόδων (4άρων), κάθε είσοδος έχει δική της μεταβλητή που αντιστοιχεί στον κώδικα που αντιστοιχεί σε συγκεκριμένο κουμπί του τηλεχειριστηρίου το οποίο και δηλώνεται στην αρχή (define) και έπειτα καλείται μέσα στη ρουτίνα switch (results.value) με τις συνθήκες της σε κάθε switch.
Δεν περιλαμβάνει encoder, γιατί είχε επιλεχθεί εξ' αρχής χρήση μόνο τηλεχειριστηρίου.

Include & define
Code:
#include <Wire.h>
#include <IRremote.h>

//--------WM8805 setup
uint8_t wm8805 = 58; // device wm8805, 58d = 0x3A = 0111010 (see datasheet pp. 17, table 11)
uint8_t toggle = 0;

#define IRCONTROL  // Comment out when using the IR control functionality.
#define RECV_PIN 23         // IR Receiver input pin on atmega

// Write the IR Code of each button, then trasfer them to case function
#define POWER_CODE          0x77E1C034  // Code for display power on/off
//#define POWER_CODE          0x8322A15E  // Code for display power on/off
#define SPDIF1_SOURCE1_CODE 0x77E15034  // Code for spdif source 1, Bnc
//#define SPDIF1_SOURCE1_CODE 0x8322A25D  // Code for spdif source 1, Bnc
#define SPDIF2_SOURCE1_CODE 0x77E16034  // Code for spdif source 2, Coax
//#define SPDIF2_SOURCE1_CODE 0x8322A45B   // Code for spdif source 2, Coax
#define SPDIF3_SOURCE1_CODE 0x77E13034  // Code for spdif source 3, Aes
//#define SPDIF3_SOURCE1_CODE 0x8322A35C  // Code for spdif source 3, Aes
#define SPDIF4_SOURCE1_CODE 0x77E19034  // Code for spdif source 4, Toslink
//#define SPDIF4_SOURCE1_CODE 0x8322A55A  // Code for spdif source 4, Toslink

#ifdef IRCONTROL
IRrecv irrecv(RECV_PIN);
decode_results results;
#endif IRCONTROL


Void setup
Code:
void setup()
{
  // WM8805 Reset pin
  // Keep it in Reset state until we are ready to talk to it
  pinMode(2, OUTPUT); digitalWrite(2, LOW);

  // Initialize Serial and Hello!
  Serial.begin(115200);
  Serial.println("Hello!");
    
  // Initialize WM8805
  digitalWrite(2, HIGH);    // Start WM8805 
  delay(100);               // Wait for 100ms and then start talking to it 
  Wire.begin();             // for WM8805
  Wire.beginTransmission(wm8805); // Check there is a WM8805
  uint8_t error = Wire.endTransmission(); // on the I2C bus

  if (error == 0) {
    Serial.println("WM8805 found!");
  } else if (error == 4) {
    Serial.println("Unknown error at address 0x3A");
  } else {
    Serial.println("No response from WM8805!");
  }

  Serial.print("Device ID: ");
  byte c = ReadRegister(wm8805, 1);
  if (c < 10) Serial.print('0');
  Serial.print(c, HEX);

  c = ReadRegister(wm8805, 0);
  if (c < 10) Serial.print('0');
  Serial.print(c, HEX);

  Serial.print(" Rev. ");
  c = ReadRegister(wm8805, 2);
  Serial.println(c, HEX);

  DeviceInit(wm8805);
  delay(500);
  // Start the IR receiver -- LAST always LAST
  irrecv.enableIRIn();    
}
int8_t input = 1;

Void Loop
Code:
void loop() {
  // This checks WM8805 status
  if (input > 1) {
    uint8_t INTSTAT = ReadRegister(wm8805, 11); // poll (and clear) interrupt register;
    uint8_t SPDSTAT = ReadRegister(wm8805, 12);
    uint8_t SampleRate = (SPDSTAT >> 4) & 0x07;
    if (INTSTAT != 0 || SampleRate != SampleRateOld) {
      // If something has changed do a screen refresh.
      Serial.print("INTSTAT:");Serial.println(INTSTAT,HEX);
      Serial.print("SPDSTAT:");Serial.println(SPDSTAT,HEX);
      Serial.print("Sample rate:");
      switch (SampleRate) {
        case 0x03:
          Serial.println("32 kHz");         
          break;
        case 0x02:
          Serial.println("44 / 48 kHz");          
          break;
        case 0x01:
          Serial.println("88 / 96 kHz");          
          break;
        case 0x00:
          Serial.println("176/192 kHz");         
          break;
        default:
          Serial.println("Unlocked");          
          break;
      }
      SampleRateOld = SampleRate;
    }
    if (SampleRate & 0x04) {
      // If this is unlocked then try and switch around normal and 192khz mode
      // until it locks. That is kinda hackish but it seems to work.
      if (toggle) {
        Serial.println("trying 192 kHz mode...");
        WriteRegister(wm8805, 6, 8);    // set PLL_N to 8
        WriteRegister(wm8805, 5, 12);   // set PLL_K to 0C49BA (0C)
        WriteRegister(wm8805, 4, 73);   // set PLL_K to 0C49BA (49)
        WriteRegister(wm8805, 3, 186);  // set PLL_K to 0C49BA (BA)
        //WriteRegister(wm8805, 29, 1);   // This might not be needed set SPD_192K_EN to 1
        toggle = 0;
      } else {
        Serial.println("trying normal mode...");
        WriteRegister(wm8805, 6, 7);    // set PLL_N to 7
        WriteRegister(wm8805, 5, 54);   // set PLL_K to 36FD21 (36)
        WriteRegister(wm8805, 4, 253);  // set PLL_K to 36FD21 (FD)
        WriteRegister(wm8805, 3, 33);   // set PLL_K to 36FD21 (21)
        //WriteRegister(wm8805, 29, 0);   // This might not be needed set SPD_192K_EN to 0
        toggle = 1;
      } // if toggle
      delay(25);  // Give some time for WM8805 to lock
    }
  }
  // This is the IR remote checks
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    switch (results.value) {
        case 0x77E15034:  //SPDIF1 BNC Input1
        if (input == 2) break;
          else input = 2;
        WriteRegister(wm8805, 8, B00011000);           // Select Input 1        
        break;
      case 0x77E16034:  //SPDIF2 Coaxial Input2
        if (input == 3) break;
          else input = 3;
        WriteRegister(wm8805, 8, B00011001);           // Select Input 2        
        break;
      case 0x77E13034:  //SPDIF3 AES Input3
        if (input == 4) break;
          else input = 4;
        WriteRegister(wm8805, 8, B00011010);           // Select Input 3        
        break;
      case 0x77E19034:  //SPDIF4 Toslink Input4
        if (input == 5) break;
          else input = 5;
        WriteRegister(wm8805, 8, B00011011);           // Select RX3       
        break;
      case 0x77E1C034:  //Display off
        break;
    }
    irrecv.resume(); //Restart the receiver - Receive the next value
  }
}

byte ReadRegister(int devaddr, int regaddr) {                             // Read a data register value
  Wire.beginTransmission(devaddr);
  Wire.write(regaddr);
  Wire.endTransmission(false);                                            // repeated start condition: don't send stop condition, keeping connection alive.
  Wire.requestFrom(devaddr, 1); // only one byte
  byte data = Wire.read();
  Wire.endTransmission(true);
  return data;
}

void WriteRegister(int devaddr, int regaddr, int dataval) {               // Write a data register value
  Wire.beginTransmission(devaddr); // device
  Wire.write(regaddr); // register
  Wire.write(dataval); // data
  Wire.endTransmission(true);
}

void DeviceInit(int devaddr) {                                             // resets, initializes and powers a wm8805
  // reset device
  WriteRegister(devaddr, 0, 0);

  // REGISTER 7
  // bit 7:6 - always 0
  // bit 5:4 - CLKOUT divider select => 00 = 512 fs, 01 = 256 fs, 10 = 128 fs, 11 = 64 fs
  // bit 3 - MCLKDIV select => 0
  // bit 2 - FRACEN => 1
  // bit 1:0 - FREQMODE (is written by S/PDIF receiver) => 00
  WriteRegister(devaddr, 7, B00000100);

  // REGISTER 8
  // set clock outputs and turn off last data hold
  // bit 7 - MCLK output source select is CLK2 => 0
  // bit 6 - always valid => 0
  // bit 5 - fill mode select => 1 (we need to see errors when they happen)
  // bit 4 - CLKOUT pin disable => 1
  // bit 3 - CLKOUT pin select is CLK1 => 0
  // bit 2:0 - always 0
  WriteRegister(devaddr, 8, B00110000);

  // set masking for interrupts
  WriteRegister(devaddr, 10, 126);  // 1+2+3+4+5+6 => 0111 1110. We only care about unlock and rec_freq

  // set the AIF TX
  // bit 7:6 - always 0
  // bit   5 - LRCLK polarity => 0
  // bit   4 - BCLK invert => 0
  // bit 3:2 - data word length => 10 (24b) or 00 (16b)
  // bit 1:0 - format select: 11 (dsp), 10 (i2s), 01 (LJ), 00 (RJ)
  WriteRegister(devaddr, 27, B00001010);

  // set the AIF RX
  // bit   7 - SYNC => 1
  // bit   6 - master mode => 1
  // bit   5 - LRCLK polarity => 0
  // bit   4 - BCLK invert => 0
  // bit 3:2 - data word length => 10 (24b) or 00 (16b)
  // bit 1:0 - format select: 11 (dsp), 10 (i2s), 01 (LJ), 00 (RJ)
  WriteRegister(devaddr, 28, B11001010);

  // set PLL K and N factors
  // this should be sample rate dependent, but makes hardly any difference
  WriteRegister(devaddr, 6, 7);                  // set PLL_N to 7
  WriteRegister(devaddr, 5, 0x36);                 // set PLL_K to 36FD21 (36)
  WriteRegister(devaddr, 4, 0xFD);                 // set PLL_K to 36FD21 (FD)
  WriteRegister(devaddr, 3, 0x21);                 // set PLL_K to 36FD21 (21)

  // set all inputs for TTL
  WriteRegister(devaddr, 9, 0);

  // power up device
  WriteRegister(devaddr, 30, 0);

  // select input
  // bit   7 - MCLK Output Source Select => 0 (CLK2)
  // bit   6 - Always Valid Select => 0
  // bit   5 - Fill Mode Select => 0
  // bit   4 - CLKOUT Pin Disable => 1
  // bit   3 - CLKOUT Pin Source Select => 1)
  // bit 2:0 - S/PDIF Rx Input Select: 000 BNC RX0, 001 Coaxial RX1, 010 AES-ABU RX2, 011 Toshlinkβ€œ RX3, 100 SPDIF-5 RX4, 101 SPDIF-6 RX5, 110 SPDIF-7 RX6, 111 SPDIF-8 RX7
  //WriteRegister(devaddr, 8, B00011000);           // Select Input 1 (Coax)
}
 

lemon

Supreme Member
3 March 2009
4,041
Λοιπόν έχω ένα θέμα, που προσπάθησα αλλά μόνο μπέρδεμα κατάφερα.

Ως γνωστό όσοι έχουμε ασχοληθεί με arduino κώδικα για επικοινωνία με το 8805, έχουμε δει ότι το συγκεκριμένο τσιπ διαχειρίζεται τη δειγματοληψία μέσω του register SPDSTAT (Recovered Frequency Flag) σε ομάδας 32, 44/48, 88/96, 176/192 όπου και εδώ τα τελευταία ψηφία είναι τα σημαντικά για την πληροφορία.

Στον παρακάτω σύνδεσμο https://github.com/kabturek/WM8805, εάν κάποιος κοιτάξει στα δύο αρχεία του κώδικα θα δει ότι περιγράφεται μια register RXCHAN4 όπου στα 4 τελευταία ψηφία της αναφέρεται στην δειγματοληψία του αρχείου κατά συγκεκριμένη προδιαγραφή του s/pdif
Ο τύπος που έχει γράψει τον κώδικα το δηλώνει ως εξής:

Code:
uint8_t rxchan4 = read(RXCHAN4_BIT);
      //get the last 4 bytes that indicate the original sampling frequency
      rxchan4 &= B00001111;
      switch(rxchan4){
        case 0:
          return 44;
        case 1:
          return 0;
        case 2:
          return 48;
        case 3:
          return 32;
        case 4:
          return 22;
        case 6:
          return 24;
        case 8:
          return 88;
        case 10:
          return 96;
        case 12:
          return 176;
        case 14:
          return 192;
        default:
return 0;

Εάν αυτό έχει βάσει, η δειγματοληψία εξειδικεύεται πλέον αντί των ομάδων σε διακριτή δειγματοληψία.

Μπορεί κάποιος να βοηθήσει στον τρόπο της δήλωσης;
Έχω δοκιμάσει με:
uint8_t SpdifSampleRate =(RXCHAN4_BIT) >> 3;
ή
uint8_t SpdifSampleRate = read(RXCHAN4_BIT);

αλλά όλο και κάτι πάει λάθος...
 

Peter52

Established Member
25 November 2010
202
Re: Απάντηση: WM8805 receiver

Από ένα γρήγορο ψάξιμο στο Datasheet του 8805 ο καταχωρητής που διαβάζει στον κώδικά του είναι ο R16 και όχι ο R12 που διαβάζουμε στον δικό μας κώδικα. Η περιγραφή των καταχωρητών είναι η εξής:

1. R12 (bit 5:4) Recovered Frequency Flag 00=192, 01=96/88,2 10=48/44,1 11=32KHz και είναι μόνο για ανάγνωση.

2. R16 (bit 3:0) Indicated Sampling Frequency Πληροφορίες στο IEC 60958-3 το οποίο πωλείται.

Αν μπορείς διάβασε την R16 γιατί έχω απομακρύνει από τον υπολογιστή το 8805 και δεν μπορώ να διαβάσω.
Βάλε στον κώδικα στο SPDSTAT 16 αντί για 12 και δες τι πληροφορίες δίνει.
 

lemon

Supreme Member
3 March 2009
4,041
Αν για uint8_t SPDSTAT = ReadRegister(wm8805, 12);
δηλώσουμε
uint8_t SPDSTAT = ReadRegister(wm8805, 16);

Τότε η μόνιμη τιμή του SPDSTAT είναι 0, οπότε και η δειγματοληψία κολλάει στο 176-192.
 

Peter52

Established Member
25 November 2010
202
Re: Απάντηση: WM8805 receiver

Απ' ότι βλέπω στην σειριακή οθόνη εμφανίζεται το περιεχόμενο του καταχωρητή. Αν θέλεις δοκίμασε με 12 και 16 και σημείωσε την ανάγνωση σαν SPDSTAT σε κάθε μια περίπτωση για να δούμε. Ίσως βγάζει 0 γιατί τα bits που μας ενδιαφέρουν είναι σε διαφορετική θέση στον καθένα καταχωρητή.

Και αν έχεις αρχεία δοκίμασε με διάφορες δειγματοληψίες.
 

lemon

Supreme Member
3 March 2009
4,041
Τις δοκιμές τις κάνω γρήγορα μέσω ψηφιακής γεννήτριας...το ψάχνω ακόμη...
 
Με λίγο ψάξιμο μπορεί εύκολα να βρεθεί το IEC 6095-3.. Δείτε εδώ: https://law.resource.org/pub/in/bis/S04/is.iec.60958.3.2003.pdf

Απ' ότι φαίνεται η πληροφορία που μας ενδιαφέρει βρίσκεται είτε στον register 16 (δείτε πινακάκι στην σελ. 6 του παραπάνω PDF) είτε (μάλλον καλύτερα..) στον reg 17 (σελ. 7 του παραπάνω PDF).
 

Peter52

Established Member
25 November 2010
202
Re: Απάντηση: WM8805 receiver

if (input > 1) {
uint8_t INTSTAT = ReadRegister(wm8805, 11); // poll (and clear) interrupt register;
uint8_t SPDSTAT = ReadRegister(wm8805, 12);
uint8_t RXCHAN4 = ReadRegister(wm8805, 16); // Νέα γραμμή
uint8_t SampleRate = (SPDSTAT >> 4) & 0x07;
if (INTSTAT != 0 || SampleRate != SampleRateOld) {
// If something has changed do a screen refresh.
Serial.print("INTSTAT:");Serial.println(INTSTAT,HEX);
Serial.print("SPDSTAT:");Serial.println(SPDSTAT,HEX);
Serial.println(RXCHAN4,HEX); // Νέα γραμμή

Serial.print("Sample rate:");

Μανώλη πρόσθεσε στον κώδικά σου τις γραμμές που γράφω "Νέα γραμμή" για να δούμε τι καταχωρείται εκεί τελικά.
 

lemon

Supreme Member
3 March 2009
4,041
Είμαι μεταξύ τρεχαμάτων του μικρού στις συνήθεις εξωσχολικές δραστηριότητες και στον κώδικα, μία φεύγω...μία έρχομαι μέσα στην τρέλλα!

Κοιτάξτε μέσω του γνωστού SPDSTAT έχεις πάντα τις γνωστές τιμές που ομαδοποιούν τις συχνότητες...οπότε για να το έχω σιγουράκι όλα τα SPDSTAT τα έχω κάνει comment.
Δίνοντας:
uint8_t RXCHAN4 = ReadRegister(wm8805, 16);
uint8_t SpdifSampleRate2 =(RXCHAN4 >> 4) & 0x07;
Serial.print("Spdif Sample rate:");Serial.println(SpdifSampleRate2,HEX);

Έχω μόνινα ένα ωραίο Spdif Sample rate: 0 με αποτέλεσμα η δειγματοληψία να εμφανίζεται με μία μόνο συχνότητα

Αλλάζοντας reg στο 17:
uint8_t RXCHAN4 = ReadRegister(wm8805, 17);
συνεχίζω να φλερτάρω με το μηδέν 0

--- Αυτόματη συγχώνευση μηνύματος ---

Έχω την εντύπωση ότι έτσι όπως το δίνουμε διαβάζει λάθος σημείο...διαβάζω το πινακάκι που μας δίνει ο ΔημΔημ (μπράβο Δημήτρη) και βλέπω ότι περιγράφει byte3 με σειρά bit 24-25-26-27
 

Peter52

Established Member
25 November 2010
202
Μανώλη βγάλε εκτός την γραμμή που μετακινεί τα Bits. Δες το κομμάτι κώδικα που σου έστειλα.
 
Re: Απάντηση: WM8805 receiver

Είμαι μεταξύ τρεχαμάτων του μικρού στις συνήθεις εξωσχολικές δραστηριότητες και στον κώδικα, μία φεύγω...μία έρχομαι μέσα στην τρέλλα!

Κοιτάξτε μέσω του γνωστού SPDSTAT έχεις πάντα τις γνωστές τιμές που ομαδοποιούν τις συχνότητες...οπότε για να το έχω σιγουράκι όλα τα SPDSTAT τα έχω κάνει comment.
Δίνοντας:
uint8_t RXCHAN4 = ReadRegister(wm8805, 16);
uint8_t SpdifSampleRate2 =(RXCHAN4 >> 4) & 0x07;
Serial.print("Spdif Sample rate:");Serial.println(SpdifSampleRate2,HEX);

Έχω μόνινα ένα ωραίο Spdif Sample rate: 0 με αποτέλεσμα η δειγματοληψία να εμφανίζεται με μία μόνο συχνότητα

Αλλάζοντας reg στο 17:
uint8_t RXCHAN4 = ReadRegister(wm8805, 17);
συνεχίζω να φλερτάρω με το μηδέν 0

--- Αυτόματη συγχώνευση μηνύματος ---

Έχω την εντύπωση ότι έτσι όπως το δίνουμε διαβάζει λάθος σημείο...διαβάζω το πινακάκι που μας δίνει ο ΔημΔημ (μπράβο Δημήτρη) και βλέπω ότι περιγράφει byte3 με σειρά bit 24-25-26-27

Δεν δοκιμάζεις κάτι πιο straightforward?

Code:
int RXCHAN4 = ReadRegister(wm8805, 17);
Serial.print("Reg 17: ");
Serial.println(RXCHAN4,HEX);