spi-fifo Verständnisfrage

Gast #4001573
ich habe einen stm f103 mit sd-Karte und enc28j60 Modul.

Bei der sd-Karte (Elm Chan) wird das Statusregister nach BSY abgefragt. 
Beim enc nach TXE und RXNE. Das hat doch zur Folge, dass immer nur ein 
einzelner Wert in DR geschrieben wird. Bis der verarbeitet ist, ist das 
BSY-Bit gesetzt. TXE ist gesetzt, wenn kein Wert im Fifo steht. Es wird 
also maximal ein Wert in den Fifo geschrieben.

Das kann doch nicht der Sinn eines Fifo sein. warum wird dieser nicht 
blockweise bis zum OVR-Bit gefüllt? Gibt es Code, der das macht? Bringt 
das Zuwachs an Geschwindigkeit? Im Prinzip suche ich also für den Fifo 
optimierten Spi-Code.
Gast
grundschüler schrieb:
> warum wird dieser nicht
> blockweise bis zum OVR-Bit gefüllt?

Keine Ahnung, was deine Abkürzungen bedeuten, aber wenn Overrun 
signalisiert wird, ist es zu spät, dann sind bereits Daten verloren 
gegegangen.
Viele Fifos hatten außer Full- und Empty-Flags noch eine Half-Full-Flag.
Wenn diese nicht gesetzt ist, kann man ohne weiter hinzusehen garantiert 
einen Datenblock von der halben Fifolänge schreiben.
Gast
elm chan hat sich offenbar auc zu diesem Problem schon Gedanken gemacht. 
hatte ich übersehen:
1
void xmit_spi_multi (
2
  const BYTE *buff,  /* Pointer to the data */
3
  UINT btx      /* Number of bytes to send (even number) */
4
)
5
{
6
  WORD d;
7

8

9
  SPIx_CR1 &= ~_BV(6);
10
  SPIx_CR1 |= (_BV(6) | _BV(11));    /* Set SPI to 16-bit mode */
11

12
  d = buff[0] << 8 | buff[1];
13
  SPIx_DR = d;
14
  buff += 2;
15
  btx -= 2;
16
  do {          /* Receive the data block into buffer */
17
    d = buff[0] << 8 | buff[1];
18
    while (SPIx_SR & _BV(7)) ;
19
    SPIx_DR;
20
    SPIx_DR = d;
21
    buff += 2;
22
  } while (btx -= 2);
23
  while (SPIx_SR & _BV(7)) ;
24
  SPIx_DR;
25

26
  SPIx_CR1 &= ~(_BV(6) | _BV(11));  /* Set SPI to 8-bit mode */
27
  SPIx_CR1 |= _BV(6);
28
}
Diese Routine nutzt den 16-Bit SPI Modus, aber nicht den FIFO aus. Er 
liesst und schreibt jeweils nur ein Wort.

Die Routine für den Fifo ist hässlich, weil man aufpassen muss das RX 
nicht überläuft. Was im xmit case - beim Schreiben - eigentlich egal 
wäre, solange man hinterher den RX Fifo aufräumt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 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.