Hi Leute,
ich krieg noch eine Krise, ich versuche jetzt schon stunden lang eine
SPI Kommunikation auf zu bauen und es geht einfach nicht.
Konkret soll mein µC mit einer SD Karte und mit einem Messchip (CS5463)
kommunizieren. (die SD Karte ist jetzt einmal egal, ich versuche mich
gerade am Messchip).
auf PB4 hängt SS von Messchip und auf PB3 der von SD Karte.
Hier schonmal meine erste Frage (mein erster Verdacht, wo Fehler liegen
könnte):
1 | /*******************************************************
|
2 | Funktion : Wähle Messchip aus
|
3 | Eigenschaften: PB4 als Ausgang => auf low
|
4 | Übergabewert: -
|
5 | Rückgabewert: -
|
6 | ********************************************************/
|
7 | void SPI_select_Messchip(void)
|
8 | {
|
9 | DDR_SPI = (1 << PB3) | ( 1 << PB4); // 3 & 4 als Ausgang
|
10 | PORTB |= (1 << PB3); // SD-Karte CS ausschalten
|
11 | PORTB &= ~(1 << PB4); // Messchip CS einschalten (löschen von PB4)
|
12 | }
|
13 |
|
14 |
|
15 |
|
16 | /*******************************************************
|
17 | Funktion : Wähle SD-Karte aus
|
18 | Eigenschaften: PB 3 als Ausgang => auf low
|
19 | Übergabewert: -
|
20 | Rückgabewert: -
|
21 | ********************************************************/
|
22 | void SPI_select_SDcard(void)
|
23 | {
|
24 | DDR_SPI = (1 << PB3) | ( 1 << PB4); // 3 & 4 als Ausgang
|
25 | PORTB |= (1 << PB4); // Messchip CS ausschalten
|
26 | PORTB &= ~(1 << PB3); // SD-Karte CS einschalten (löschen von PB3)
|
27 | }
|
Stimmt diese zuordnung, also das dann damit wirklich der Messchip
ausgewählt ist???
so jetzt habe ich folgendes Verhalten:
Wenn ich SPI_select_Messchip(); aufrufe und danach SPI_init(); und
folgenden Code aufrufe:
1 | SPI_send_start_conversions();
|
2 | SPI_send_sync1();
|
Bleibt es beim 2ten mal Send hängen. (Im Prinzip ist egal was bei
send_sycn1 usw. drinsteht, beide rufen einfach nur SPI_send(data) auf)
Hier der Code dazu:
1 | void SPI_send(uint8_t data)
|
2 | {
|
3 | SPDR = data; // Gib Daten in Übertragungspuffer
|
4 | while(!(SPSR & (1 << SPIF)) ); // Warte bis Übertragung fertig
|
5 | }
|
Hier noch kurz meine initalisierungsfunktion:
1 | void SPI_init(void)
|
2 | {
|
3 | // Mosi + Clock als Output setzen
|
4 | DDR_SPI = (1 <<SPI_MOSI) | (1 <<SPI_CLK);
|
5 |
|
6 | // Schalte SPI ein und fck/16
|
7 | SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
|
8 | }
|
Hat jemand eine Ahnung, warum ich nur 1nen Befehl senden kann? Ich kann
auch anstatt SPI_send_sycn1 irgend einen anderen Send-Befehl nehmen,
allerdings bleibt es trotzdem hängen (bleibt in einer Endlosschleife).
Wenn ich SPSR zwischen den beiden Send Befehlen mir anzeigen lasse habe
ich 0b11000000.
Ihr würdet mir wirklich sehr helfen, wenn jemand eine Idee hat!