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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.