Forum: Mikrocontroller und Digitale Elektronik China AVR - SPI defekt?


von Luggi F. (luggi_f)


Angehängte Dateien:

Lesenswert?

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

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Luggi F. schrieb:
> Nun passiert auf dem Bus laut Logikanalysator fast nichts.

Der Bus wird sich zu Tode langweilen bei 1ms Pausen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Luggi F. schrieb:
> Oder ich mache einen einfachen Fehler und seh ihn einfach nicht...

     SPDR = 0x01;                //Senderegister
 Um zu sehen, ob es überhaupt funktioniert, sendet man normalerweise
 0x55 oder 0xAA.

 Mit deinen ms kann keiner etwas anfangen. Sollten us sein.

 MOSI bleibt die ganze Zeit auf HIGH.

 SCK bleibt die ganze Zeit auf HIGH.

 EDIT:

 Mensch, setze doch die Labels und Signale richtig zueinander.

: Bearbeitet durch User
von Luggi F. (luggi_f)


Angehängte Dateien:

Lesenswert?

Ok, habs nochmal mit 0x55 als Zeichen und einer Mikrosekunde als Pause 
durchgeführt. Ändert kaum etwas.
Der Puls bei SCK scheint "zufällig" da zu sein, ist nicht immer da.

Marc V. schrieb:
> Mensch, setze doch die Labels und Signale richtig zueinander.

Geht leider nicht, die sind da fest... Richtig benannt sind sie ja.

: Bearbeitet durch User
von Forist (Gast)


Angehängte Dateien:

Lesenswert?

Luggi F. schrieb:
> Unbenannt.PNG

Nun reicht es aber mit Schmierpapier.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Luggi F. schrieb:
> Der Puls bei SCK scheint "zufällig" da zu sein, ist nicht immer da.

 a) Dein Arduino ist kaputt.
 b) Du hast Arduino und MCP falsch verbunden.

 Lass mal Arduino ohne MCP nur mit LA laufen.

Forist schrieb:
> Nun reicht es aber mit Schmierpapier.

 Ich habe auch 2 Screenshots gemacht um überhaupt etwas zu verstehen.

von chris (Gast)


Lesenswert?

Marc V. schrieb:
> a) Dein Arduino ist kaputt.
>  b) Du hast Arduino und MCP falsch verbunden.

c) Der LogicAnalyzer ist zu langsam für den SPI-Takt

von Luggi F. (luggi_f)


Lesenswert?

Forist schrieb:
> Nun reicht es aber mit Schmierpapier.
Tut mir Leid, auf dem betreffenden PC gibts nur Win XP/Paint.

Marc V. schrieb:
> a) Dein Arduino ist kaputt.
Naja, 3 Stück, frisch aus der Tüte? Nicht unmöglich, aber 
unwahrscheinlich.

>  b) Du hast Arduino und MCP falsch verbunden.
Steckt momentan eh nicht dran. Mit MCP ändert sich aber auch nichts. 
Einer von den AVRs hat den MCP noch nie gesehen, von da kommt also auch 
kein Defekt.

von Luggi F. (luggi_f)


Lesenswert?

chris schrieb:
> c) Der LogicAnalyzer ist zu langsam für den SPI-Takt

Hab ich auch schon dran gedacht, aber hab den Taktvorteiler auch schon 
auf 1/128 von 16 MHz gehabt, also 125 kHz. Das hör ich ja noch fast...

von S. Landolt (Gast)


Lesenswert?

Ich sehe im Programm nichts zu PB2 = /SS, nach einem Reset steht der auf 
Eingang!
Datenblatt 19.3.2 Master Mode:
"If /SS is configured as an input, it must be held high to ensure Master 
SPI operation..."

von Luggi F. (luggi_f)


Lesenswert?

S. Landolt schrieb:
> Ich sehe im Programm nichts zu PB2 = /SS, nach einem Reset steht der auf
> Eingang!

JA! Das wars. PB2 als Output gesetzt und schon ist der Takt da. Nett, 
dass das im Initialisierungsbeispiel im Datenblatt nicht erwähnt ist...

Danke, jetzt schläft es sich gleich viel besser :-D

von Forist (Gast)


Lesenswert?

Luggi F. schrieb:
> Forist schrieb:
>> Nun reicht es aber mit Schmierpapier.
> Tut mir Leid, auf dem betreffenden PC gibts nur Win XP/Paint.

Genau damit (mit MSPaint) habe ich die Zeichnung mit 3 Klicks zurecht 
gestutzt (Auswahl, Rechteckige Auswahl, Bereich markieren, Copy, Größe 
ändern auf z.B. 1%, Einfügen, Speichern).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.