Forum: Mikrocontroller und Digitale Elektronik Wo liegt der Fehler?


von Gast (Gast)


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:
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!

von Michael U. (amiga)


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

von Urs (Gast)


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?

von Gast (Gast)


Lesenswert?

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!

von holger (Gast)


Lesenswert?

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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.