Forum: Mikrocontroller und Digitale Elektronik SPI: MOSI phasenverschoben


von Andre T. (fxtech)


Angehängte Dateien:

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
}

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

>jedoch ist das Signal phasenverschoben

Bei 200us/Div kannst du nicht sehen ob die Daten vor
der steigenden Flanke liegen. Geh mal mit der Zeitbasis
weiter runter in den ns Bereich.

von Stefan W. (dl6dx)


Lesenswert?

Andre T. schrieb:
1
USARTC1.CTRLC = USART_CMODE_MSPI_gc | SPI_MODE_0_gc | USART_CHSIZE_8BIT_gc;

Hast du denn geprüft, ob diese Makros tatsächlich das gewünschte control 
word ergeben?

Lies mal das hier:
Beitrag "Re: XMega SPI über USART"

Grüße

Stefan

von MWS (Gast)


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.

von Stefan F. (Gast)


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.

von Andre T. (fxtech)


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;

: Bearbeitet durch User
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.