Hallo,
ich habe das SPI am Atmega32 wie nach Datenblatt beschrieben in Betrieb
genommen. Leider antwortet der Slave nicht und der Controller steckt in
der while Schleife fest, die Schaltung dürfte aber stimmen. Jetzt bin
ich dazu übergegangen mir die Signale mit dem Oszi anzuschauen.
Leider sieht man außer dem korrekten Verhalten con Chip Select nichts.
Der Code für das Spi ist aus dem Datenblatt des Atmega:
1
uint8_t SPI_transmit(uint8_t data)
2
{
3
4
PORTB &= ~(1<<PB2); //Select CS5643
5
6
// Start transmission
7
SPDR = data;
8
9
// Wait for transmission complete
10
while(!(SPSR & (1<<SPIF)));
11
12
data = SPDR;
13
14
PORTB |= (1<<PB2);
15
16
return(data);
17
18
}
Meine Frage daher, wenn ich das Datum in SPDR schreibe, müsste ich dann
nich zumindest den SCKL auf der Leitung sehen? Ich meine völlig
unabhängig davon ob der Slave antworten wird oder nicht? Es macht mich
stutzig das garnichts passiert.
Hinzu kommt eine initialisierung der restlichen I/O Ports für Taster und
LCD. Davon hängt aber nichts an PORTB, der ist allein für die SPI
Kommunikation reserviert
Spontan fällt mir der Standardfehler ein: SS wird irgendwo als Eingang
deklariert und schaltet dann das Modul auf Slave. Vielleicht fehlt
irgendwo eine Veroderung beim Setzten von DDRB.
Grüße,
Peter
Danke für die Antwort.
Mein Programm ist schon relativ groß geworden, da es eine komplette
Menüführung enthält und auch eine SD Karte ansteuert. Hierzu habe ich
aber eine fertige Bibliothek verwendet. Der andere IC ist ein Metering
IC, CS5463 und ebenfalls Slave am SPI. Die SD Karte funktioniert
wunderbar, zum Testen des CS5463 habe ich sie aber komplett vom SPI-Bus
abgetrennt.
Ich schreibe gerade ein neues Testprogramm um Programmierfehler
auszuschließen.
Du sagst wenn ich garantiere das SS immer als Output geschaltet wurde,
dann garantiere ich auch das der µC Master bleibt? Ich muss ihn aber
nicht noch auf High oder Low setzen?
Zeigt der Master dann das Verhalten, dass beim schreiben in SDR auf
jeden Fall das Clock Signal gesendet wird?
>Du sagst wenn ich garantiere das SS immer als Output geschaltet wurde,>dann garantiere ich auch das der µC Master bleibt? Ich muss ihn aber>nicht noch auf High oder Low setzen?
Richtig.
>Zeigt der Master dann das Verhalten, dass beim schreiben in SDR auf
^^SPDR
>jeden Fall das Clock Signal gesendet wird?
Wenn er Master ist, ja.
Grüße,
Peter
Sorry, hab mich verschrieben. Im Code stimmt es schon ;)
Danke für deine Hilfe, dann kann ich mal schaun ob ich ihm das richtige
Verhalten abverlangen kann :)
Sollte funktionieren.
PORTB &= ~(1<<PB2);
_delay_ms(1);
PORTB |= (1<<PB2);
_delay_ms(1);
PORTB &= ~(1<<PB2); //Select CS5643
_delay_ms(1);
Das ist nur ein Test, nehme ich an. Verzögerung braucht man normal keine
zwischen CS und Senden.
Grüße,
Peter
Ja, ist es ;)
Das Problem ist dass der CS5463 von der restlichen Schaltung
potentialgetrennt ist. Daher muss ich das SPI vom uC mit einem Isolator
an den IC koppeln. Hierzu habe ich einen ADUM1401 (reichelt) verwendet.
Dessen "Geschwindigkeit" ist aber begrenzt, im Prinzip verzögert er das
Signal etwas. D.h. wenn der Puls zu schnell ist kann es sein dass er
nicht oder falsch erkannt wird.
Aber doch nicht 1 ms. Als propagation delay sind Zeiten von etwa 65 ns
im Datenblatt angegeben. Das kann man vernachlässigen. Zudem werden ja
alle Signale verzögert, wenn man sie ohne Verzögerung in der richtigen
Abfolge losschickt, kommen sie auch richtig auf der anderen Seite an.
Grüße,
Peter
So, nun habe ich ein neues Problem.
Das SPI hängt nun nicht mehr. Allerdings empfange ich immer nur 0xFF,
selbst nach der im Datenblatt beschriebenen SPI synchronisierung.
Jemand noch eine Idee ? :(
Allein der Vollständigkeit wegen....
Ich habe alle Probleme gelöst. Da es nicht ganz unwahrscheinlich ist,
dass jemand diesen IC (CS5463) zusammen mit dem ADUM1401-ARW verwenden
wird möchte ich darauf hinweisen, dass es trotz Datenblatt notwendig ist
die beiden Pins VE1/VE2 auf High zu halten wenn eine Übertragung
gewünscht ist.
Eine eigene Frage?
Dieser Thread ist über 15 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.