Wo liegt der Fehler?

Gast #1180890
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:
1
data = spi_get();
2
spi_send_sync1();

oder
1
spi_send_sync1();
2
data = spi_get();

oder
1
data = spi_get();

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

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!
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
Gast
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?
Gast
SS habe ich auch:
1
void spi_select_Messchip(void)
2
{
3
  PORTB |= (1 << PB3);         // SD-Karte CS ausschalten
4
  PORTB &= ~(1 << PB4);        // Messchip CS einschalten (löschen von PB4)
5
}

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

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

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


Wie ist das mit den 4 Arten von SPI und wo lege ich diese fest?? Das 
könnte es vielleicht sein!
Gast
1
  // Mosi + Clock als Output setzen
2
 DDR_SPI = (1 <<SPI_MOSI) | (1 <<SPI_CLK);
3
//Ab hier sind MOSI und SCLK Ausgänge.
4

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

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.