Hallo Ich probiere mich gerade an der SPI Schnittstelle auf einem Atmega 2560 für mein Projekt. Habe einen Quellcode vom Lehrer erhalten doch leider will die SPI Schnittstelle nicht so wie wir. Vieleicht kann ja jemand einmal über den Code schauen.
1 | /**************************************************************
|
2 | Es soll alle halbe Sekunde im Wechsel 0 bzw. 1 gesendet werden.
|
3 | Am korrespondierenden Slave soll zur Indikation jeweils die
|
4 | LEDs an bzw. aus gehen
|
5 | Verdrahtung: MISO(Master) --> MISO(Slave)
|
6 | MOSI(Master) --> MOSI(Slave)
|
7 | SCK(Master) --> SCK(Slave)
|
8 | PB0(Master) --> SS(Slave)
|
9 | **************************************************************/
|
10 | |
11 | #include <avr/io.h> |
12 | #include <avr/interrupt.h> |
13 | #include <avr/signal.h> |
14 | |
15 | unsigned char status = 0; |
16 | volatile unsigned char count; |
17 | |
18 | void timer1 (void); |
19 | void master_init (void); |
20 | void master_transmit (unsigned char data); |
21 | |
22 | SIGNAL (SIG_SPI) { |
23 | return; |
24 | }
|
25 | |
26 | SIGNAL (SIG_OVERFLOW1) { //Senderoutine |
27 | if (count == 1) { |
28 | master_transmit ('1'); |
29 | count--; |
30 | PORTL = 0xFF; |
31 | return; |
32 | }
|
33 | if (count == 0) { |
34 | master_transmit ('0'); |
35 | PORTL = 0x00; |
36 | count++; |
37 | }
|
38 | }
|
39 | |
40 | void timer1 (void) { |
41 | TIMSK1 |= (1<<TOIE1); //Timer Overflow Interrupt enable |
42 | TCNT1 = 0; //Rücksetzen des Timers |
43 | TCCR1B = (1<<CS10) | (1<<CS11); //8MHz/65536/64 = 1,91Hz --> 0,5s |
44 | }
|
45 | |
46 | void master_init (void) { |
47 | DDRB = (1<<PB1) | (1<<PB2) | (1<<PB0); // setze SCK,MOSI,PB0 (SS) als Ausgang |
48 | PORTB = (1<<PB1) | (1<<PB0); // SCK und PB0 high (ist mit SS am Slave verbunden) |
49 | SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //Aktivierung des SPI, Master, Taktrate fck/16 |
50 | status = SPSR; //Status löschen |
51 | }
|
52 | |
53 | void master_transmit (unsigned char data) { |
54 | PORTB &= ~(1<<PB0); //SS am Slave Low --> Beginn der Übertragung |
55 | SPDR = data; //Schreiben der Daten |
56 | while (!(SPSR & (1<<SPIF))); |
57 | PORTB |= (1<<PB0); //SS High --> Ende der Übertragung |
58 | }
|
59 | |
60 | int main (void) { |
61 | DDRL = 0xFF; |
62 | master_init (); |
63 | timer1 (); |
64 | sei (); |
65 | |
66 | for (;;); |
67 | return 0; |
68 | }
|