Moin.
Bei meinem aktuellen Problem gehts zwar nicht um AVRs, dennoch um C.
Auf einem LCP1114 gibts ein Stück Code, das nicht so will, wie es soll.
Das Problem ist jetzt nicht die SPI-Funktionalität, sondern der Unterschied zwischen den beiden Funktionen, wenn ich nur 1 Byte haben will:
Code:
uint8_t SSPReceiveByte(void)
{
uint8_t retval = 0;
LPC_SSP->DR = SPI_DUMMY_BYTE;
/* Wait until the Busy bit is cleared */
while ( (LPC_SSP->SR & (SSPSR_BSY|SSPSR_RNE)) != SSPSR_RNE );
retval = LPC_SSP->DR;
return retval;
}
void SSPReceive( uint8_t *buf, uint32_t Length )
{
uint32_t i;
for ( i = 0; i < Length; i++ )
{
LPC_SSP->DR = SPI_DUMMY_BYTE;
/* Wait until the Busy bit is cleared */
while ( (LPC_SSP->SR & (SSPSR_BSY|SSPSR_RNE)) != SSPSR_RNE );
*buf = LPC_SSP->DR;
buf++;
}
return;
}
Welchen Unterschied macht es für die Variable uint8_t ReadByte, ob ich sie jetzt mit
ReadByte = SSPReceiveByte();
oder mit
SSPReceive(&ReadByte, 1);
befülle?
Es gibt hier nämlich folgendes Problem. In einer Aufrufkette wird vom SPI ein Byte gelesen. D.h. A ruft B auf, B C, C D und D holt sich mit SSPReceive(,) ein Byte. D übergibt die Variable dann direkt als Return-Wert an B. Nun gibts das Problem, dass immer wieder dieser zurückgegebene Wert in B totaler Käse ist (während er in C noch passt.).
Fehlerhäufigkeit: 0,03%. Nicht viel, aber leider eben 0,03% zu viel.
Verwend ich stattdessen in D die SSPReceiveByte()-Funktion, passt alles wunderbar und es gibt auch nach 6 Mio. Durchläufen keinen einzigen Fehler.
Wie kann das sein?
mfG
Lesezeichen