Forum: Mikrocontroller und Digitale Elektronik SPI bei meinem ATmega324PA funktioniert nicht


von Tarek T. (tarek_t)


Lesenswert?

Hallo,

ich habe ein Problem mit meinem ATmega324PA. Ich bekomme es einfach 
nicht hin, dass die SPI Schnittstelle funktioniert. Ich habe ein 
JTAGICE3 zum Debuggen und bin mittlerweile soweit, dass ich folgenden 
Sachverhalt herausgefunden habe:

Meine SPI Initialisierungsroutine sieht wie folgt aus:
1
DDRB |= (1<<5) | (1<<7);
2
      
3
/* Enable SPI, Master */
4
SPCR0 = (1<<SPE0) | (1<<MSTR0);
5
      
6
/* Set Double SPI Speed Bit, SPI clock will be fck/2 */
7
SPSR0 = (1<<SPI2X0);

Beim Debuggen ist es jedoch so, dass im Register SPCR0 nur das Bit 6 
gesetzt ist (SPE0). Das Bit 4 (MSTR0) ist immer null! Ich kann es auch 
nicht mit dem Debugger setzen. Wenn ich jedoch mit dem Debugger zunächst 
das Bit SPE0 wieder lösche, kann ich das Bit MSTR0 setzen. Kein Problem. 
Setze ich jedoch wieder das Bit SPE0, wird MSTR0 gelöscht. Warum ist das 
so? Bei einem anderen Board mit einem ATmega324P geht es wunderbar und 
läuft so wie es soll.

Ich sitze schon fast 2 Stunden an dem Problem und bin kurz davor das 
Ding aus dem Fenster zu werfen :-)

von Chris (Gast)


Lesenswert?

Was machst du mit dem SS-Pin? Ist der unbeschaltet?

von Tarek T. (tarek_t)


Lesenswert?

Chris schrieb:
> Was machst du mit dem SS-Pin? Ist der unbeschaltet?

Nein, den benutze ich als Chipselect Pin für ein Display.

von Chris (Gast)


Lesenswert?

Also Ausgang. Zeig doch mal den ganzen Code. Mit dem bisschen kann man 
nicht viel Anfangen.

von Tarek T. (tarek_t)


Lesenswert?

Chris schrieb:
> Also Ausgang. Zeig doch mal den ganzen Code. Mit dem bisschen kann man
> nicht viel Anfangen.

Ich habe die Zeile, die den SS-Pin im Datenrichtungsregister als Ausgang 
schaltet nun einmal VOR die Initialisierungsroutine geholt. Das hat 
tatsächlich das Problem gelöst.

Merkwürdig finde ich nur, dass der gleiche Code (nur mit anderen 
Settings) auf dem einen Controller (ATmega324P) läuft und auf einem 
anderen (ATmega324PA) nicht.

Danke Chris für den Denkanstoß. Wäre ich nie drauf gekommen.

von Chris (Gast)


Lesenswert?

Das liegt daran, dass wenn dieser Pin als Eingang geschaltet ist und 
low, als CS eines anderen SPI-Master sieht und auf slave-spi-mode 
schaltet. Und daher ist es halt ein zufallsprodukt. Er kann eben, bis er 
als Ausgang gesetzt wird, High oder Low sein.

Steht aber auch im Datenblatt :)

von Stone (Gast)


Lesenswert?

>Steht aber auch im Datenblatt :)
Ja, an einer Stelle als Randbemerkung ;). Bin auch schon mal drüber 
gestolpert.

Gruß Matthias

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.