SPI: MOSI phasenverschoben

OP #3562574
Lesenswert?

Hallo,

ich habe die USART Schnittstelle des ATxmega128A1 als SPI (master mode) 
konfiguriert und möchte damit einen Funkchip ansteuern.
Wie auf dem Scope-Bild zu erkennen wird auch die richtige Bitfolge auf 
der MOSI Leitung übertragen, jedoch ist das Signal phasenverschoben.
Die Daten sollten eigentlich vor dem Clock Signal anliegen und nicht 
gleichzeitig.

Ich würde mich freuen, wenn mir jemand bei dem Problem weiterhelfen kann 
:)


Die SPI Schnittstelle wurde als "SPI Mode 0" konfiguriert:
1
void init_usart_spi(void) 
2
{
3
  // baud rate generator - set USART SPI clock
4
  USARTC1.BAUDCTRLA  = BSEL;
5
  // enable RX and TX
6
  USARTC1.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
7
  // set USART SPI master mode
8
  USARTC1.CTRLC = USART_CMODE_MSPI_gc | SPI_MODE_0_gc | USART_CHSIZE_8BIT_gc;
9
}
10

11
void usart_spi_write(uint8_t byte)
12
{
13
  // wait until data register is empty
14
  while(!(USARTC1.STATUS & USART_DREIF_bm));
15
  // write register address
16
  USARTC1.DATA = byte;
17
  // wait for TX complete
18
  while(!(USARTC1.STATUS & USART_TXCIF_bm));
19
  // clear TX complete flag
20
  USARTC1.STATUS = USART_TXCIF_bm;
21
}
Angehängte Dateien:
Gast #3562662
Lesenswert?

Da passiert in der iox128a1.h Merkwürdiges, was sicher so nicht gedacht 
ist:
1
typedef enum SPI_MODE_enum
2
{
3
    SPI_MODE_0_gc = (0x00<<2),  /* SPI Mode 0 */
4
    SPI_MODE_1_gc = (0x01<<2),  /* SPI Mode 1 */
5
    SPI_MODE_2_gc = (0x02<<2),  /* SPI Mode 2 */
6
    SPI_MODE_3_gc = (0x03<<2),  /* SPI Mode 3 */
7
} SPI_MODE_t;
Damit wird neben UCPHA, welches Teil der SPI-Mode Einstellung ist, auch 
das daneben liegende UDORD beschrieben. UDORD gibt an, ob das LSB oder 
MSB zuerst ausgegeben wird, hat jedoch nichts mit Mode 0-3 zu tun.

Eingestellt werden die UART-SPI-Modi mit UCPHA und INVEN, siehe 
Datenblatt. INVEN gehört zum Portkontrollregister und bestimmt 
(invertiert) das Verhalten von SCK. Der Zustand des INVEN-Bits geht aus 
dem Code nicht hervor.
Gast #3562688
Lesenswert?

Komisch, das Oszillogramm stimmt deutlich sichtbar nicht mit dem von Dir 
zittierten Auszug aus dem Datenblatt überein.

Ich bin bei WinAVR2010 auch schonmal auf falsche Enumerations gestoßen. 
Aber WinAvr ist uralt.

Der Xmega128a3 ist jedoch nicht gerade eine Neuheit, da sollte man 
annehmen dürfen, dass die Enumerations in der aktuellen Fassung der 
Library richtig sind. Ich finde das echt doof.
OP #3562713
Lesenswert?

Vielen Dank für eure schnelle Hilfe :)

Ich habe den Makros einfach vertraut und vorher nicht überprüft ob die 
richtigen Bits dadurch gesetzt werden.

Durch das Makro USART_CHSIZE_8BIT_gc wurde also UCPHA gesetzt, daher 
liegen die Daten erst bei fallender Taktflanke an.

Richtig lautet die Konfiguration dann also:
1
USARTC1.CTRLC = USART_CMODE_MSPI_gc;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren