spi-fifo Verständnisfrage

Gast #4001573
Lesenswert?

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 #4001658
Lesenswert?

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 #4001720
Lesenswert?

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
}
#4002013
Lesenswert?

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

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