Hallo, ich möchte 2 µC per SPI verbinden. Det atmega8 (16 Mhz) sendet in einer Endlosschleife ein Byte was jede Sekunde um 1 erhöht wird. Slave ist der ATMega644 (20 Mhz). Er wartet testweise auf die zu empfangenen Bytes und gibt das empfangene Byte auf einem Display als Zahl aus. Um zu überprüfen wie viele Byte bereits empfangen wurden wird in der 2. Zeile angegeben wie viele Bytes bisher empfangen wurden. Leider steht in der 2. Zeile immer eine 0 und die erste Zeile bleibt leer. Er empfängt also nichts. Um zu überprüfen ob die Sendeschleife auch läuft habe ich nach jedem Senden einen Ausgangspin invertiert -> Ja, er sendet. MOSI <=> MOSI MISO <=> MISO SS <=> SS GND <=> GND Master:
1 | void SPI_MasterInit(void) |
2 | {
|
3 | /* Set MOSI and SCK output, all others input */
|
4 | DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); |
5 | /* Enable SPI, Master, set clock rate fck/16 */
|
6 | SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); |
7 | }
|
8 | |
9 | void SPI_MasterTransmit(char cData) |
10 | {
|
11 | /* Start transmission */
|
12 | SPDR = cData; |
13 | /* Wait for transmission complete */
|
14 | while(!(SPSR & (1<<SPIF))) |
15 | ;
|
16 | }
|
17 | |
18 | int main(void) |
19 | {
|
20 | char i = 0; |
21 | SPI_MasterInit(); |
22 | DDR_SPI |= (1<<DD_SS); |
23 | while(1) |
24 | {
|
25 | PORTB &=~(1<<DD_SS); // Aktiviere Slave |
26 | wait_ms(1); |
27 | SPI_MasterTransmit(i++); |
28 | wait_ms(1); |
29 | PORTB |=(1<<DD_SS); // Deaktiviere Slave |
30 | wait_ms(1000); |
31 | }
|
32 | return 0; |
33 | }
|
Slave:
1 | void SPI_SlaveInit(void) |
2 | {
|
3 | /* Set MISO output, all others input */
|
4 | DDR_SPI = (1<<DD_MISO); |
5 | /* Enable SPI */
|
6 | SPCR = (1<<SPE); |
7 | }
|
8 | |
9 | char SPI_SlaveReceive(void) |
10 | {
|
11 | /* Wait for reception complete */
|
12 | while(!(SPSR & (1<<SPIF))) |
13 | ;
|
14 | /* Return Data Register */
|
15 | return SPDR; |
16 | }
|
17 | |
18 | int main(void) |
19 | {
|
20 | uint16_t i=0; |
21 | char string[20]; |
22 | DDRB=1; |
23 | |
24 | LCDInit(); |
25 | SPI_SlaveInit(); |
26 | |
27 | |
28 | while(1) |
29 | {
|
30 | itoa(i++,string,10); |
31 | LCDSetCursorPos(1,0); |
32 | LCDWrite(string); |
33 | |
34 | itoa(SPI_SlaveReceive(),string,10); |
35 | LCDSetCursorPos(0,0); |
36 | LCDWrite(string); |
37 | }
|
38 | return 0; |
39 | }
|
Weiß jemand woran das liegen könnte? Danke schonmal. Tobi