Forum: Mikrocontroller und Digitale Elektronik SPI mit Atmega32


von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich möchte mich mal ans SPI Modul des Atmega32 wagen (den Magnet Encoder 
AS5040 auslesen), hab dazu aber noch Unklarheiten.

- Gemäss Atmel Datenblatt ist das SPI Modul full-duplex, was bedeutet, 
dass ich auf einen Slave gleichzeitig (über die MOSI Leitung) schreiben 
und davon (über die MISO Leitung) lesen kann. Auslesen des SPI Data 
Register – SPDR ".. causes the Shift Register Receive buffer to be 
read". Wenn ich das richtig verstehe, aktiviert also ein Lesezugriff auf 
das SPDR den SPI Clock. Aber dann würde zum Zeitpunkt des SPDR-Zugriffs 
(Auslösung des SPI Clocks) die Daten ja erst übertragen. Muss ich daher 
zwei Mal auf das SPDR zugreifen um die gewünschten Daten zu erhalten?

- Zudem verstehe ich den Code-Schnipsel (in diesem Beispiel ist der uC 
jedoch als Slave konfiguriert) aus dem Datenblatt von Atmel 
(http://www.atmel.com/images/atmel-8155-8-bit-microcontroller-avr-atmega32a_datasheet.pdf, 
S. 183) nicht:
1
void SPI_SlaveInit(void)
2
{
3
   /* Set MISO output, all others input */
4
   DDR_SPI = (1<<DD_MISO);
5
   /* Enable SPI */
6
   SPCR = (1<<SPE);
7
}
8
char SPI_SlaveReceive(void)
9
{
10
   /* Wait for reception complete */
11
   while(!(SPSR & (1<<SPIF)))
12
      ;
13
   /* Return Data Register */
14
   return SPDR;
15
}

Mit SPI_SlaveReceive() setze ich meinen uC doch in eine Endlosschleife, 
wenn er nichts empfängt!?!

- Des Weitern sehe ich ein Problem mit dem Timing des AS5040 (ist 
angehängt) bzw. der Clock Phase des uC. Nachdem ich den ChipSelect 
aktiviere (activ low) möchte ich doch eigentlich mein erstes Bit (D9) 
bei der 2. fallenden und nicht schon bei der 1. steigenden Clock Flanke 
auslesen, da mein Slave noch min T_Do_valid Zeit braucht um das Bit 
korrekt herauszugeben. Slave-Bit 1 bei 2. Clock gäbe doch ein völliges 
Durcheinander und ist mit Hilfe von Clock Phase und Clock Polarity auch 
nicht zu erreichen.

Danke für die Hilfe!

von Helfer (Gast)


Lesenswert?

Markus schrieb:
> Wenn ich das richtig verstehe, aktiviert also ein Lesezugriff auf
> das SPDR den SPI Clock.

nein, sondern ein Schreibzugriff auf das SPDR des Masters

Markus schrieb:
> Mit SPI_SlaveReceive() setze ich meinen uC doch in eine Endlosschleife,
> wenn er nichts empfängt!?!

ja, so ist es.


http://www.koervernet.de/component/phocadownload/file/5-as5040-library-fuer-atmega

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.