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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.