XMega USART-SPI

OP #5614076
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.