www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI receive liefert falsche Daten


Autor: Thomas Burkhart (escamoteur)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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);


}

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat wirklich keiner von euch ne Idee??

Gruß
Tom

Autor: gastlich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: NOP (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@NOP: Wieso?

Autor: NOP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>@NOP: Wieso?

Weil das SPIF-Flags sonst nicht gelöscht wird, was aber für das 
nachfolgende wichig ist.

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@NOP: Habs eingefügt, aber Ergebnis ist das selbe.
Gruß
Tom

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh Mann, habs grad gefunden:

In ReadMP3Register() hat am Schluss

return result;

gefehlt.

Was ich nur nicht verstehe woher ich in main() dann 0xA207 als Ergebnis 
bekomme.

Dummerweise war das erste Byte gleich dem das ich erwartet hatte, daher 
hatte ich den SPI im Verdacht.

Gruß
Tom

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.