SPI Problem - Atmega1284p

Gast #2903001
Lesenswert?

Hallo Zusammen,
ich habe folgendes Problem: Ich habe den vs1011 am Laufen am SPI, ich 
kann auch senden (Mastermode).

Sobald ich jedoch folgendes Konstrukt aufrufe, stoppt alles. Nichts geht 
mehr weiter. Was mach ich falsch?

uint8_t SPIreadwrite (uint8_t data)
{
  while(!(SPSR & (1<<SPIF)));
  SPDR=data;
  while(!(SPSR & (1<<SPIF)));
  return SPDR;
}

Das hier geht ohne weiteres: (ich schreibe nur zum vs1011 und lese 
nicht)
void SPIwrite (uint8_t data)
{
  while(!(SPSR & (1<<SPIF)))
  ;
  SPDR=data;
}

Vielen Dank

freddyv.95
Gast #2903014
Lesenswert?

When a serial transfer is complete, the SPIF Flag is set. An interrupt 
is generated if SPIE in
SPCR is set and global interrupts are enabled. If SS is an input and is 
driven low when the SPI is
in Master mode, this will also set the SPIF Flag. SPIF is cleared by 
hardware when executing the
corresponding interrupt handling vector. Alternatively, the SPIF bit is 
cleared by first reading the
SPI Status Register with SPIF set, then accessing the SPI Data Register 
(SPDR).

Beantwortet deine frage eingentlich schon.
Gast #2903032
Lesenswert?

Danke erstmal, ist mir auch klar und so wie ichs gepostet habe, kanns 
also wirklich nicht gehen. Aber:
Ich habe jetzt die erste while gelöscht und es funktioniert trotzdem 
nicht.

Der Aufruf sieht so aus:
ENC28j60port &= ~(1<<ENC28j60cs);
SPIreadwrite(0x1F);
SPIreadwrite(0xFF);
ENC28j60port|= (1<<ENC28j60cs);
Sobald ich die SPIreadwrite auskommentiere geht der Rest wieder.
Gast #2903144
Lesenswert?

OK, habs gefunden.
Danach hab ich dann wieder die SPIwrite aufgerufen und das geht 
natürlich nicht, weil die dann hängen bleibt.

Vielen Dank!!

Noch was: Kann man das SPIF-bit eigentlich auch selbst setzen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren