Hallo zusammen,
ich hoffe ihr könnt mir Helfen. Ich versuche mehrere AVR via SPI zu
verbinden, momentan kommt am ende nur dummes zeug raus. Ich habe mich
die letzten Tage in SPI eingelesen und hab auch schon einiges hier im
Forum gelesen komme jetzt aber nicht mehr weiter.
Anbei hängen die Codes der Master und Slaves.
Mein Problem ist das ich noch nicht mal weiß ob ich das mit dem SPI
richtig verstanden habe. Bei meinem Programm schicke ich z.B. 1,2,3,4
über die serielle schnittstelle und müste ein 0,1,2,3 zurück bekommen.
Ich bekomme aber immer den Wert 255 zurück.
Master: ATMega644
1 | #include <inttypes.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <stdlib.h>
|
5 |
|
6 |
|
7 | ISR(USART0_RX_vect)
|
8 | {
|
9 | uint8_t x;
|
10 | x = UDR0;
|
11 | SPI_MasterT(x);
|
12 | }
|
13 |
|
14 | void USART_Trans (uint8_t data)
|
15 | {
|
16 | while(!(UCSR0A & (1<<UDRE0)));
|
17 | UDR0 = data;
|
18 | }
|
19 |
|
20 | void SPI_MasterInit(void)
|
21 | {
|
22 | PORTB = (1<<PB5)|(1<<PB7);
|
23 | SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
|
24 | }
|
25 |
|
26 | void SPI_MasterT(uint8_t cData)
|
27 | {
|
28 | SPDR = cData;
|
29 | while(!(SPSR & (1<<SPIF)))
|
30 | ;
|
31 | USART_Trans(SPDR);
|
32 | }
|
33 |
|
34 |
|
35 |
|
36 | int main(void)
|
37 | {
|
38 | SPI_MasterInit();
|
39 | UBRR0 = 77;
|
40 | UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
|
41 | UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
|
42 |
|
43 | sei();
|
44 |
|
45 | while (1)
|
46 | {
|
47 | asm volatile("NOP");
|
48 | asm volatile("NOP");
|
49 | asm volatile("NOP");
|
50 | }
|
51 |
|
52 | }
|
Slave:ATMega8515
1 | #include <inttypes.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <stdlib.h>
|
5 |
|
6 | volatile unsigned char Data;
|
7 |
|
8 | void SPI_SlaveInit(void)
|
9 | {
|
10 | PORTB = (1<<PB4);
|
11 | SPCR = (1<<SPE);
|
12 | }
|
13 |
|
14 | void SPI_SlaveR(void)
|
15 | {
|
16 | while(!(SPSR & (1<<SPIF)))
|
17 | ;
|
18 | Data = SPDR;
|
19 | }
|
20 |
|
21 | int main(void)
|
22 | {
|
23 | uint8_t Data;
|
24 |
|
25 | SPI_SlaveInit();
|
26 |
|
27 | sei();
|
28 |
|
29 | while (1)
|
30 | {
|
31 | SPI_SlaveR();
|
32 | SPDR = Data;
|
33 | }
|
34 |
|
35 | }
|