mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik XMega USART-SPI


Autor: Daniel K. (daniel_k80)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
#define AT45DB642D_CMD_READ_ID    0x9F

USART_SPI_Transmit(&USARTD0, AT45DB642D_CMD_READ_ID);
ID[0] = USART_SPI_Transmit(&USARTD0, 0x00);
...

uint8_t USART_SPI_Transmit(USART_t* Device, uint8_t Data)
{
  while(!(Device->STATUS & USART_DREIF_bm));
  Device->DATA = Data;
  
  while(!(Device->STATUS & USART_RXCIF_bm));
  return Device->DATA;
}

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

Autor: Mitlesa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel K. (daniel_k80)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

    GPIO_SetDirection(&PORTD, SPI_MOSI_PIN, GPIO_DIRECTION_OUT);
    GPIO_Set(&PORTD, SPI_MOSI_PIN);
    
    GPIO_SetDirection(&PORTD, SPI_MISO_PIN, GPIO_DIRECTION_IN);
    GPIO_Set(&PORTD, SPI_MISO_PIN);
    
    // Setup INVEN
    if((Config->Mode == SPI_MODE_2) || (Config->Mode == SPI_MODE_3))
    {
      GPIO_InvEnable(&PORTD, SPI_SCK_PIN);
    }
    else
    {
      GPIO_InvDisable(&PORTD, SPI_SCK_PIN);
    }
  }

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

  // Setup Clock Phase
  if((Config->Mode == SPI_MODE_1) || (Config->Mode == SPI_MODE_3))
  {
    Device->CTRLC |= 0x02;
  } 
  else 
  {
    Device->CTRLC &= ~0x02;
  }

Autor: Mitlesa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ....

Autor: Daniel K. (daniel_k80)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha W. (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Daniel,

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

Sascha

Autor: Daniel K. (daniel_k80)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sascha,

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

Autor: Mitlesa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.