XMega USART-SPI

OP #5614076
Lesenswert?

Hallo zusammen,

ich möchte auf meinem XPlained256A3BU den Flash (AT45DB642D) mittels 
USART-SPI auslesen (Mode 3). Die Schnittstelle habe ich soweit am 
laufen, allerdings bekomme ich unschlüssige Daten beim Auslesen der 
Device ID. Laut Datenblatt soll das erste Byte ein 0x1F sein, ich 
erhalte aber 0x0F. Die Antwort vom SPI-Flash habe ich mal mit einem 
Scope aufgezeichnet und angehängt.
Dazu verwende ich den USARTD mit den folgenden Pins:
SCK = 1
MISO = 2
MOSI = 3
Ich sende erst den Befehl und dann ein Dummybyte um die Antwort 
auszulesen:
1
#define AT45DB642D_CMD_READ_ID    0x9F
2

3
USART_SPI_Transmit(&USARTD0, AT45DB642D_CMD_READ_ID);
4
ID[0] = USART_SPI_Transmit(&USARTD0, 0x00);
5
...
6

7
uint8_t USART_SPI_Transmit(USART_t* Device, uint8_t Data)
8
{
9
  while(!(Device->STATUS & USART_DREIF_bm));
10
  Device->DATA = Data;
11
  
12
  while(!(Device->STATUS & USART_RXCIF_bm));
13
  return Device->DATA;
14
}

Die Konfiguration der Schnittstelle habe ich ebenfalls als Screenshot 
angehängt. Für mich sieht das so aus, als ob der SPI die Daten bei einer 
fallenden Flanke und nicht bei einer steigenden (so wie es sein soll) 
sampled. Nach dem Oszilloskopbild kann ich keinen Fehler in der 
Übertragung erkennen. Wenn ich die Bits bei der steigenden Flanke 
betrachte wird da 0x1F übertragen.

Wo habe ich da einen Fehler gemacht?

Vielen Dank für die Hilfe.
Gruß
Daniel
Angehängte Dateien:
OP #5614153
Lesenswert?

Hallo,

laut Datenblatt muss man für Mode 3 INVEN aktivieren und UCPHA im 
CTRLC-Register des USART setze (das habe ich getan).
1
  if(Config->Device == &USARTD0)
2
  {
3
    GPIO_SetDirection(&PORTD, SPI_SCK_PIN, GPIO_DIRECTION_OUT);
4
    GPIO_Set(&PORTD, SPI_SCK_PIN);
5

6
    GPIO_SetDirection(&PORTD, SPI_MOSI_PIN, GPIO_DIRECTION_OUT);
7
    GPIO_Set(&PORTD, SPI_MOSI_PIN);
8
    
9
    GPIO_SetDirection(&PORTD, SPI_MISO_PIN, GPIO_DIRECTION_IN);
10
    GPIO_Set(&PORTD, SPI_MISO_PIN);
11
    
12
    // Setup INVEN
13
    if((Config->Mode == SPI_MODE_2) || (Config->Mode == SPI_MODE_3))
14
    {
15
      GPIO_InvEnable(&PORTD, SPI_SCK_PIN);
16
    }
17
    else
18
    {
19
      GPIO_InvDisable(&PORTD, SPI_SCK_PIN);
20
    }
21
  }
22

23
  // Enable USART Master SPI
24
  USART_SetMode(Device, USART_MODE_MSPI);
25

26
  // Setup Clock Phase
27
  if((Config->Mode == SPI_MODE_1) || (Config->Mode == SPI_MODE_3))
28
  {
29
    Device->CTRLC |= 0x02;
30
  } 
31
  else 
32
  {
33
    Device->CTRLC &= ~0x02;
34
  }
Gast #5614173
Lesenswert?

Daniel K. schrieb:
> laut Datenblatt muss man für Mode 3 INVEN aktivieren

Nachdem es nicht viele Möglichkeiten (nämlich genau vier)
der Kombination von Clock Phase und Clock Polarity gibt
würde ich einfach mal die anderen ausprobieren.

Ein flüchtiger Blick ins Datenblatt lässt vermuten dass man
auch mit Mode 0 glücklich werden könnte ....
Gast #5615892
Lesenswert?

Daniel K. schrieb:
> Naja das Display kann auch Mode 0... . Von daher ist das
> nicht ganz so tragisch.

Heisser Geheimtipp: man kann auch dynamisch die SPI-Modi
umschalten zwischen den Zugriffen auf verschiedene SPI-
Teilnehmer. Solange deren Chip Selects deaktiviert sind
sollte denen Schaltflanken aufgrund von Umkonfigurationen
egal sein.

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