mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wo liegt der Fehler?


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Leute!

Ich habe meinen atmega32 mit einem IC (CS5463) verbunden. Der IC ist ein 
Messchip, der mir Daten wie z.b. Strom oder Spannung übergibt. Dazu muss 
ich bestimmte Register auslesen und im Datenblatt steht, dass ich 
während dem auslesen ein SYNC1 (0xFF) Packet senden muss. (die 
Verbindung ist übrigens SPI)

Ich Frage mich nur halt, wie das genau zu geschehen hat?

Entweder:
data = spi_get();
spi_send_sync1();

oder
spi_send_sync1();
data = spi_get();

oder
data = spi_get();

mit
uint8_t spi_get(void) 
{  
  // Warte bis fertig Empfangen
  SPDR = 0xFF; // NUR TEST
  while(!(SPSR & (1<<SPIF)) );              // !!!!!!!!!!!!!!!!!!!!!! TIMEOUT EINBAUEN
  return SPDR;
}

Also sprich das ich die Daten in den Puffer gebe und dann gleichzeitig 
immer 1 Bit von mir zu IC übertragen wird und 1 Bit von IC zu mir. Für 
mich wäre die 3te Variante die sinnvollste, allerdings bekomme ich die 
ganze zeit 0xFF zurück, was nicht stimmen kann. (wenn ich z.b. MISO oder 
MOSI unter der Übertragung ausstecke bekomme ich weiterhin 0xFF) Sprich 
ich würde sagen, dsa ich irgendwo etwas bei der Übertragung bzw. 
Ansteuerung etwas falsch mache.

Findet jemand den Fehler? Wenn jemand das ganze Projekt möchte, muss er 
es nur sagen!

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

prinzipiell sendet und empfängt SPI sozusagen gleichzeitig.

uint8_t spi_get(xxxx)
{
  // Warte bis fertig Empfangen
  SPDR = xxxx; // NUR TEST
  while(!(SPSR & (1<<SPIF)) );              // !!!!!!!!!!!!!!!!!!!!!! 
TIMEOUT EINBAUEN
  return SPDR;
}

Vorsicht, bin kein C-Programmierer, nur ASM. ;-)

data = spi_get(kommando);
data1 = spi_get(sync1);
data2 = spi_get(sync1);
data3 = spi_get(sync1);

data1...data3 sind die Werte aus dem CS5463.

Gruß aus Berlin
Michael

Autor: Urs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Dritte ist schon richtig nur:
Es gibt IIRC 4 "Arten" von SPI (welche Flanken, Timing etc), hast Du 
auch die richtige benutzt?
Zum SPI gehört für jeden Slave ein Select Pin, durch Low setzen 
signalisiert der SPI Master nicht nur, welchen Slave er ansprechen 
möchte, sondern er dient auch der Synchronisation. Vergessen?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SS habe ich auch:
void spi_select_Messchip(void)
{
  PORTB |= (1 << PB3);         // SD-Karte CS ausschalten
  PORTB &= ~(1 << PB4);        // Messchip CS einschalten (löschen von PB4)
}

PB4 hängt der Messchip
und nach der Übertragung mache ich:
void spi_unselect(void)
{
  PORTB |= (1 << PB3);         // SD-Karte CS ausschalten
  PORTB |= (1 << PB4);         // Messchip CS einschalten (löschen von PB4)
}

Meine Initialisierung sieht so aus:
void spi_init(void)
{
  // Mosi + Clock als Output setzen
  DDR_SPI = (1 <<SPI_MOSI) | (1 <<SPI_CLK);
  DDR_SPI = (1 << PB3) | ( 1 << PB4);  // 3 & 4 als Ausgang (SS)

  // Schalte SPI ein und fck/128
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0) ;
}


Wie ist das mit den 4 Arten von SPI und wo lege ich diese fest?? Das 
könnte es vielleicht sein!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  // Mosi + Clock als Output setzen
 DDR_SPI = (1 <<SPI_MOSI) | (1 <<SPI_CLK);
//Ab hier sind MOSI und SCLK Ausgänge.

 DDR_SPI = (1 << PB3) | ( 1 << PB4);  // 3 & 4 als Ausgang (SS)

//Ab hier sind MOSI und SCK wieder Eingänge!

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.