Hi,
ich möchte via SPI große Arrays übertragen, so dass ich überlege
inwiefern eine interrupt-gesteuerte Datenübertragung Sinn macht. Der DMA
Support wird für das SPI nicht unterstützt. Als Controller verwende ich
den LPC1758.
In meinem Interrupt lese ich das Statusregister, cleare das
Interruptregister und schreibe das nächste Byte in das SPDR Register,
welches anschließend übertragen werden soll. Der Datentransfer
funktioniert.
1 | static unsigned char buffer[512];
|
2 |
|
3 | void SPI_IRQHandler(void)
|
4 | {
|
5 | unsigned int state = LPC_SPI->SPSR;
|
6 | switch(state)
|
7 | {
|
8 | case SPISTATE_SPIF:
|
9 | if(pos < 512)
|
10 | LPC_SPI->SPDR = buffer[pos++];
|
11 | else
|
12 | { //Datenübertragung beenden
|
13 | LPC_SPI->SPDR; //read dummy
|
14 | SPI_SetCS(HIGH);
|
15 | }
|
16 | break;
|
17 | }
|
18 | LPC_SPI->SPINT = SPIINT_SPIF;
|
19 | }
|
Aber macht das überhaupt wirklich Sinn, die Datenübertragung
interrupt-basierend zu gestalten, weil der zeitliche Abstand zwischen
dem Beenden des SPI-Interrupts und einem neuen SPI-Interrupt ist so
kurz, dass mein Timer Interrupt beispielsweise in dieser Zeit gar nicht
ausgelöst wird. Erst wenn der SPI Datentransfer beendet ist,
funktioniert der Timer (Intervall: 1ms) wieder ordnungsgemäß.
Des Weiteren kann ich während der SPI Übertragungszeit auch keine andere
Datenübertragung die interrupt-basierend erfolgt wie z.B. I2C anstoßen,
weil sich die Interrupts von SPI und I2C sonst in die Querre kommen. Ich
erhalte in einem solchen Fall beispielsweise zwar die richtige Anzahl an
ausstehenden I2C Receive Interrupts, die allerdings verzögert statt
finden. Die erhaltenen I2C Daten werden allerdings überschrieben, weil
das I2C-Datenregister nur ein Byte aufnehmen kann. Die restlichen
erhaltenen Bytes sind demnach 0xFF....
Ab welchem Zeitpunkt denkt ihr darüber nach, einen Datenübertragung
interrupt-basierend zu machen? Und wie stellt ihr sicher, dass andere
Schnittstellen in dieser Zeit nicht mittels Interrupts angesprochen
werden?
Gruß
Lars