Hallo!
Ich hab hier einen Atmega328p vom Chinesen (auf einem "Nano" Board, aber
ohne Arduino). Eigentlich will ich einen kleinen CAN Bus aufbauen,
scheitere aber gerade an der simpelsten SPI Kommunikation. Also erstmal
ein Minimalbeispiel zu SPI programmiert.
1 | //Init
|
2 | DDRB |= (1<<PB3)|(1<<PB5); //MOSI, SCK als Ausgang
|
3 | PORTD |= (1<<PD5); //CS aus
|
4 | DDRD |= (1<<PD5); //CS als Ausgang
|
5 |
|
6 | SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //SPI init: enable, master, f0/16
|
7 | //Erstes Zeichen
|
8 | PORTD &= ~(1<<PD5); //CS
|
9 | SPDR = 0x01; //Senderegister
|
10 | while(!(SPSR & (1<<SPIF))); //Warten auf Senden
|
11 | _delay_ms(1);
|
12 | PORTD |= (1<<PD5); //~CS
|
13 | _delay_ms(1);
|
14 | //Zweites Zeichen
|
15 | PORTD &= ~(1<<PD5);
|
16 | SPDR = 0x01;
|
17 | while(!(SPSR & (1<<SPIF)));
|
18 | _delay_ms(1);
|
19 | PORTD |= (1<<PD5);
|
20 | _delay_ms(1);
|
Nun passiert auf dem Bus laut Logikanalysator fast nichts. Auf den
Bildern im Anhang kann man sich gut an der Chip Select Linie
orientieren. Achtung, die Labels stehen tiefer als man denkt, Linien
zählen!
Außerdem bleibt das Programm beim zweiten gesendeten Zeichen in der
Warteschleife hängen, sieht man auch am Bild.
SPI langsamer zu stellen hab ich probiert, ändert nichts. uC läuft mit
16 MHz, ob der CAN Controller (MCP2515) dran hängt oder nicht macht auch
keinen Unterschied.
Langsam fällt mir blos noch ein Hardwaredefekt ein, allerdings ist es
bei zwei gleichen Boards genauso....
Oder ich mache einen einfachen Fehler und seh ihn einfach nicht...
Achja: Programmieren lässt er sich über ISP problemlos.
Danke für Denkanstöße,
Luggi