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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
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!
