Hallo Forum,
ich arbeite momentan an einer Verbindung eines Drahtlosnetzwerkes mit
einem PC mit folgender Konfiguration:
Netzwerk bestehend aus CC2431
|
| SPI
|
USB-Controller (SiLabs C8051F320)
|
| USB (12 Mbps)
|
PC
Die SPI-Übertragung findet mit 250 kbps statt. Allerdings muss ich
zwischen den einzelnen Bytes eine Pause machen, die der C8051F320
braucht, um das Byte aus dem Register zu laden. Diese Pause verringert
die Übertragungsrate auf unter 100 kbps was äußerst ungünstig ist, da
die Funkdaten im schlimmsten Fall mit 250 kbps ankommen. Selbst 1 Mbps
aufm SPI wird zu 140 kbps durch die Pause (57 µs) und durch eine kürzere
Pause gehen Bytes verloren. DMA hat der C8051F320 nicht und die
auslesende ISR ist so kurz wie möglich:
1 | #pragma vector=SPIF_int
|
2 | __interrupt void SPI_ISR(void) {
|
3 | SPI0CN &= ~0xF0; // alle Flags löschen
|
4 | if (!count) { // erstes ankommendes Byte (Länge)
|
5 | count = SPI0DAT;
|
6 | }
|
7 | else {
|
8 | SPIbuffer[--count] = SPI0DAT;
|
9 | }
|
10 | if (!count) { // am Ende des Paketes
|
11 | txLock = 0; // freigeben für USB
|
12 | }
|
13 | }
|
Gibt es irgendeine elegante Möglichkeit sowas zu erledigen oder ist der
USB-Controller einfach ungeeignet?
VG mario