Hallo
Ich hab jetzt angefangen mich mit SPI Übertragung zu befassen, jedoch
klappt es nicht. Für den Anfang wollte ich eine einfache Zahl senden.
Wenn ich das Buch bzw Datenblätter richtig verstanden habe, wird bei
SS-low beim Slave (wenn SPI aktiviert ist) das Daten Byte automatisch
ins Register geladen und anschließend (wenn SPIF 1 wird) ein Interrupt
ausgeführt. Um Fest zustellen das dieser auch ausgeführt wird will ich
zuerst einfach die Leds anders Leuchten lassen, jedoch wird dieser
Interrupt nie ausgeführt und ich weis nicht wieso.
Mit den Oszi hab ich MOSI, PB1/SS sowie SCK gemessen und die Signale
machen genau das was erwartet. (SS geht low für den Zeitraum der
Übertragung, SCK Takted und MOSI sendet).
Ich weis nicht was ich noch Versuchen kann bzw. Wo mein Fehler liegt und
ich hoffe das mir jemand von euch helfen kann?
Zum Aufbau, ich Verwende Zwei ATMEGA8A, mit 8MHZ interner Oszillator
getaktet, einer (der Slave) in STK500 der auf die Leds über PORTC
angeschlossen ist. Der Master ist an einem Experimentier Board und mit
kable verbunden. (ich habe einen skizzenhaften Schaltplan angehängt an
den die SPI Verbindungen ausgezeichnet sind)
Besten Dank für die Hilfe
manhai
Slave
1 | /*
|
2 | * SPI_comunicatin_test_master.c
|
3 | *
|
4 | * Created: 13.10.2014 12:55:19
|
5 | * Author: manhai
|
6 | */
|
7 |
|
8 |
|
9 | #include <avr/io.h>
|
10 | #include <avr/delay.h>
|
11 | #include <avr/interrupt.h>
|
12 | #define F_CPU 8000000
|
13 | volatile char zyklus;
|
14 |
|
15 | //SPI Transfer Complete Interrupt starting on page 124 in datasheet
|
16 | ISR(SPI_STC_vect){
|
17 |
|
18 | PORTC = 0xf0;
|
19 | zyklus = SPDR;
|
20 |
|
21 |
|
22 | }
|
23 |
|
24 |
|
25 | void init_spi_slave()
|
26 | {
|
27 | SPCR |= ((1 << SPIE) | (1 << SPE) | (0 << DORD) | (0 << MSTR) | (1 << CPOL) | (1 << CPHA) | (0 << SPR1) | (0 << SPR0));
|
28 | }
|
29 |
|
30 |
|
31 | void init_Ports_slave()
|
32 | {
|
33 |
|
34 | DDRB |= (1 << 4);
|
35 |
|
36 | DDRC = 0xFF; //für die led ausgabe
|
37 | PORTC = 0x00; //alle aus
|
38 |
|
39 | }
|
40 |
|
41 |
|
42 |
|
43 | int main(void)
|
44 | {
|
45 | unsigned char ubertrag = 0;
|
46 | init_Ports_slave();
|
47 | sei();
|
48 | while(1)
|
49 | {
|
50 |
|
51 | }
|
52 | }
|
Master
1 | /*
|
2 | * SPI_comunicatin_test_master.c
|
3 | *
|
4 | * Created: 13.10.2014 12:55:19
|
5 | * Author: manhai
|
6 | */
|
7 |
|
8 |
|
9 | #include <avr/io.h>
|
10 | #include <avr/delay.h>
|
11 | #include <avr/interrupt.h>
|
12 | #define F_CPU 8000000
|
13 |
|
14 |
|
15 | void init_spi_master()
|
16 | {
|
17 | SPCR |= ((0 << SPIE) | (0 << SPE) | (0 << DORD) | (1 << MSTR) | (1 << CPOL) | (1 << CPHA) | (1 << SPR1) | (1 << SPR0));
|
18 | }
|
19 |
|
20 | void spi_master_aktiv()
|
21 | {
|
22 | SPCR |= ((1 << SPE)); //aktiviert SPI
|
23 | }
|
24 |
|
25 | void init_Ports()
|
26 | {
|
27 | DDRB = 0xFF;
|
28 | DDRB &= ~(1 << PB4);
|
29 |
|
30 | PORTB = 0x00;
|
31 | PORTB |= ((1 << PB1)); //setzt select auf high
|
32 | }
|
33 |
|
34 | void senden8bit(unsigned char wert)
|
35 | {
|
36 | PORTB &= ~(1 << PB1);
|
37 | SPDR= wert; //daten in Buffer schreiben
|
38 | //Wait until transmission complete
|
39 | while(!(SPSR & (1<<SPIF)));
|
40 | wert = SPDR ; //Pseudolesen
|
41 | PORTB |= (1 << PB1); //setzt select auf high
|
42 |
|
43 | }
|
44 |
|
45 |
|
46 |
|
47 | int main(void)
|
48 | {
|
49 |
|
50 | init_Ports();
|
51 | init_spi_master();
|
52 | spi_master_aktiv();
|
53 |
|
54 | while(1)
|
55 | {
|
56 |
|
57 | senden8bit(52);
|
58 | _delay_ms(50);
|
59 | senden8bit(150);
|
60 | _delay_ms(50);
|
61 |
|
62 | }
|
63 | }
|