Hallo Zusammen, hänge grad ein einem echten Anfängerproblem. Ich versuche über die SPI-Schnittstelle eines ATmegas16 Daten zu senden und zu empfangen. Die Funktionen liefen ohne Probleme auf einem Atmega8. Nun ist es aber so das das Programm an
1 | while(!(SPSR & (1<<SPIF))); |
hängen bleibt. Ich weis nicht warum. Wäre toll wenn ihr mir einen kleinen Denkanstoss geben könntet.
1 | #include <avr/io.h> |
2 | #include <stdlib.h> |
3 | #include <util/delay.h> |
4 | #include "lcd-routines.h" |
5 | #include <avr/interrupt.h> |
6 | #include <string.h> |
7 | |
8 | |
9 | #ifndef F_CPU
|
10 | #define F_CPU 8000000UL
|
11 | #endif
|
12 | |
13 | |
14 | int i, data_received ; |
15 | |
16 | //------------------- Unterprogramme--------------------
|
17 | // SPI-Daten senden
|
18 | void spi_senden(int data) |
19 | { PORTB &= ~(1 << PB1); |
20 | SPDR = data; |
21 | while(!(SPSR & (1<<SPIF))); |
22 | PORTB |= (1 << PB1); |
23 | }
|
24 | |
25 | // SPI-Daten empfangen
|
26 | int spi_empfangen(void) |
27 | { PORTB |= (1<<PB0); |
28 | while (!(SPSR & (1 << SPIF))); |
29 | data_received= SPDR; |
30 | PORTB &= ~(1<<PB0); |
31 | return data_received; |
32 | }
|
33 | |
34 | //-----------------Hauptprogramm----------------------------
|
35 | |
36 | int main(int argc, char **argv) { |
37 | |
38 | DDRB |= (1 << PB0); // |
39 | DDRB |= (1 << PB1); // |
40 | DDRB |= (1 << PB2); // |
41 | DDRB |= (1 << PB3); // |
42 | |
43 | |
44 | SPCR |= ((1 << SPE) | (1 << MSTR) | (1 << SPIE)) ; |
45 | sei(); |
46 | |
47 | while(1) |
48 | { PORTB |= (1<<PB2); |
49 | data_received=spi_empfangen(); |
50 | _delay_ms(50); |
51 | spi_senden(0x55); |
52 | PORTB &=~ (1<<PB2); |
53 | }
|
54 | }
|
Ich Danke