SPI receive liefert falsche Daten

OP #1571443
Lesenswert?
• ▲
▼
Hi,

ich bin gerade dabei mit meinem VS1011 warm zu werden. Soweit versteht 
er erst mal wenn ich ihm was sage. Nur wenn ich ihn was frage kommt 
nicht alles bei meinem mega32 an.

Bei dem Test schreibe ich erst einen Wert in das Volume-Register und 
lese ihn dann wieder aus.
Eigentlich sollte ich 0xA2F5 bekommen, lese aber nur 0xA207. Laut 
Logicanalyser sendet mit der VS aber den korrekten Wert, nur der AVR 
verliert wohl ein paar Bits.


Das ist mein Quellcode

#include <avr/io.h>
#ifndef F_CPU
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert
   (z.B. durch Übergabe als Parameter zum Compiler innerhalb
   des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
   "nachträgliche" Definition hinweist */
#warning "F_CPU war noch nicht definiert, wird nun mit 7372800 
definiert"
#define F_CPU 7372800UL     /* Quarz mit 7.3728 Mhz */
#endif
#include <util/delay.h>

#include <avr/interrupt.h>

#include <avr/io.h>          // (1)


void initPorts(void)
{
  DDRB = 0xff; // all out


  PORTB  |= (1 << PB0) | (1 << PB1); // VS1011 CS high

  SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0); //SPI on
}



void WriteMP3Command(uint8_t reg, uint16_t value)
{
    PORTB &= ~(1 << PB0);

    SPDR = 0x2; //write command
    while(!(SPSR & (1<<SPIF)));

    SPDR = reg;
    while(!(SPSR & (1<<SPIF)));

    SPDR = (uint8_t) (value >> 8);
    while(!(SPSR & (1<<SPIF)));

    SPDR = (uint8_t) value;
    while(!(SPSR & (1<<SPIF)));



    PORTB  |= (1 << PB0);
}


uint16_t ReadMP3Register(uint8_t reg)
{
  uint16_t result = 0;

  PORTB &= ~(1 << PB0);

  SPDR = 0x3; //read command
  while(!(SPSR & (1<<SPIF)));

  SPDR = reg;
  while(!(SPSR & (1<<SPIF)));

  SPDR = 0xaa; //push result byte one out;
  while(!(SPSR & (1<<SPIF)));
  result = SPDR;

  result = result << 8;

  SPDR = 0xaa; //push result byte one out;
  while(!(SPSR & (1<<SPIF)));

  result |= SPDR;


  PORTB  |= (1 << PB0);

}



void MP3_SetVolume(uint16_t volume)
{
  WriteMP3Command(0xB,volume);

}


uint16_t result=0;

main()
{
  initPorts();

  PORTB |= (1 << PB2); // VS reset off

  MP3_SetVolume(0xA2F5);

  result = ReadMP3Register(0xB);


}
Angehängte Dateien:
Gast #1572021
Lesenswert?
• ▲
▼
bin nicht sicher, aber tönt nach einem CPOL oder CPHA problem.

schau dir mal die polarisation und die phase der takt und datenleitung 
des spi an. im datenblatt des VS1011 findest du sicher die nötigen 
einstellungen ...

gruss Claudio
Gast #1572029
Lesenswert?
• ▲
▼
[code]
uint16_t ReadMP3Register(uint8_t reg)
{
  uint16_t result = 0;

  PORTB &= ~(1 << PB0);

  SPDR = 0x3; //read command
  while(!(SPSR & (1<<SPIF)));

  SPDR = reg;
  while(!(SPSR & (1<<SPIF)));

  result = SPDR;// ####### <--- einfügen #############

  SPDR = 0xaa; //push result byte one out;
  while(!(SPSR & (1<<SPIF)));
  result = SPDR;

  result = result << 8;

  SPDR = 0xaa; //push result byte one out;
  while(!(SPSR & (1<<SPIF)));

  result |= SPDR;


  PORTB  |= (1 << PB0);

}
[code]

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.