HI
1 | uint8_t SpiTransmit (uint8_t date){
|
2 | SPIF.DATA = date; // Send data
|
3 | while (SPIF.STATUS == 0); // Wait for the end of transmission
|
4 | return SPIF.DATA;// Read the data
|
5 | }
|
Mit diesem kleinen Codestückchen habe ich ein Problem auf meinem
atxmega. Laut Manual sollte das Statusregister !=0 werden können, wenn
die Daten ganz rausgeschoben wurden (Interrupt-Flag wird gesetzt). Er
hängt sich aber in dieser While-Schleife fest.
Fürs Minimalbeispiel noch die init:
1 | PORTF_DIRSET = (1 << SPIF_MOSI) | (1 << SPIF_SCK) | (1 << SPIF_CS);
|
2 | PORTF_DIRCLR = (1 << SPIF_MISO);
|
3 | PORTF.OUTCLR = (1 << SPIF_MOSI) | (1 << SPIF_SCK) | (1 << SPIF_CS)
|
4 | //über defines werden die Pins festgelegt, zB: #define SPIF_SCK 7
|
5 |
|
6 | SPIF.CTRL = SPI_MODE_0_gc | SPI_PRESCALER_DIV4_gc | (1<< SPI_ENABLE_bp) | (1<< SPI_MASTER_bp)| (1<< SPI_CLK2X_bp);
|
7 | SPIF.INTCTRL = SPI_INTLVL_MED_gc;
|
Was ich mir nicht erklären kann:
Wenn ich den Interrupt ausschalte wird das Statusregister 128
(Interrupt-Flag als höchstes Bit gesetzt), aber die Schleife hängt
trotzdem fest?? Habe mir das Register immer ausgeben lassen.
Kann mir das jemand erklären, warum das passiert? Weil der Slave nix
antwortet? Weil ich einen Fehler reingebaut hab?
PS: Verweist mich ja nicht auf dieses hässlcihe Atmel-Beispielgedönz.
Ich will das Hardware-SPI-Zeug schließlich lernen.