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!