Forum: Mikrocontroller und Digitale Elektronik XMega USART-SPI


von Daniel K. (daniel_k80)


Angehängte Dateien:

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

von Mitlesa (Gast)


Lesenswert?

Daniel K. schrieb:
> Wo habe ich da einen Fehler gemacht?

Vermutlich in der Konfiguration deiner Schnittstelle. Denn
die Clockphase und -Polarität kann man üblicherweise einstellen.

von Daniel K. (daniel_k80)


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
  }

von Mitlesa (Gast)


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 ....

von Daniel K. (daniel_k80)


Lesenswert?

Mmh interessant. Mit Mode 0 funktioniert es...
Wenn ich jetzt noch den Fehler beim Mode 3 finden würde, wäre ich 
komplett glücklich :D

von Sascha W. (sascha-w)


Lesenswert?

Hallo Daniel,

ich verwende auch Mode 0. Mode 3 ging bei mir auch nicht.

Sascha

von Daniel K. (daniel_k80)


Lesenswert?

Hallo Sascha,

gut zu wissen. Naja das Display kann auch Mode 0... . Von daher ist das 
nicht ganz so tragisch.

von Mitlesa (Gast)


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.

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.