Forum: Mikrocontroller und Digitale Elektronik spi-fifo Verständnisfrage


von grundschüler (Gast)


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.

von lrep (Gast)


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.

von grundschüler (Gast)


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
}

von Jim M. (turboj)


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.

von grundschüler (Gast)


Lesenswert?

Jim Meba schrieb:
>nutzt den 16-Bit SPI Modus, aber nicht den FIFO aus

Das ist code von Elm Chan. Der Fifo wird nicht ausgenutzt, weil der F103 
gar keinen Fifo hat sondern nur eine buffer für einen Wert. Trotzdem 
danke für den Hinweis.

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.