Hallo zusammen Ich habe den ATMega48 wie folgt als SPI-Slave konfiguriert: void SPI_SlaveInit(void) { // Port B initialization PORTB=0x00; DDRB=0x10; /* Set MOSI and SCK output, all others input */ DDRB = (1<<DDB3); /* Enable SPI, Master, set clock rate fck/16 */ SPCR = (1<<SPE); } char SPI_SlaveReceive(void) { /* Wait for reception complete */ while (!(SPSR) & (1<<SPIF)); return SPDR; } void SPI_SlaveTransmit(char cData){ /* Start transmission */ SPDR = cData; /* Wait for reception complete */ while (!(SPSR & (1<<SPIF))); } Sobald ich jedoch SPI_SlaveReceive() ausführe in einer while(1) loop wird nicht gewartet bis ein Zeichen anliegt und wird demzufolge nicht ausgelesen. Hab ich irgendwas in der Konfiguration vergessen? Vielen Dank.
vielleicht solltest du mal anstat
1 | while (!(SPSR) & (1<<SPIF)); |
das hier probieren:
1 | while ( !( (SPSR) & (1<<SPIF) ) ); |
aber ist nur so ne Vermutung :)
Aber was passiert nun wenn das nächste Byte kommt? Darf ich dann umgehend mit 2ndbyte = SPI_SlaveReceive() das nächste Byte einlesen oder muss da eine bestimmte Zeit noch gewartet werden?
So viel ich weiß kannst du sofort danach die receive Funktion nochmal aufrufen um ein 2. Byte auszulesen. Wenn du mit return SPDR das Byte zurückgibst wird es nämlich intern wieder gelöscht und du kannst sofort das nächste Byte empfangen. So ist es jedenfalls bei UART und ich glaub nicht, dass das bei SPI anders ist. Was aber wahrscheinlich komfortabler wäre, ist das ganze mit Interrupts zu lösen. Da wird dann bei jedem empfangenen Byte eine Interrupt-Funktion aufgerufen die das Byte ausließt und z.B. in nem char-Array speichert. Wenn du dann ein bestimmtes Stoppzeichen (z.B. \n (LF)) erhälst ruft die Interrrupt-Funktion dann eine Funktion auf, die das Array dann auswertet. So würde ich das jedenfalls machen.
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.