mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Muss nochmal fragen: SPI Interface nutzen


Autor: Christoph Hoell (webturtle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich blick es einfach nicht.
Ich programmiere seit einigen Monaten AVRs. Ich verwende immer den 
Atmega 8.
Mein erstes Projekt, nach den Einstiegstutorials in ASM war ein 
Controller für einen Schrittmotortreiber. Dieser wurde per SPI 
angesteuert.
Hier im Forum wurde mir erklärt wie ich ein Software SPI in ASM dafür 
implementiere. Ein guter Link zu diversen Macros brachte mich zu einem 
funktionierenden Programm.

Nun mache ich diverse andere Sachen mit SPI und beginne auch erste 
Sachen in C zu schreiben.
Es widerstrebt mir immer ein Software SPI zu implementieren und ich muss 
nun ja auch nicht noch lernen wie es in C funktioniert.

Es muss doch möglich sein, das SPI Interface des µC zu nutzen und ihn 
trotzdem über ISP zu programmieren.

Kann ich einfach zwei Sachen an die entsprechenden Beinchen (MOSI und 
MISO und SCK) anschliessen? CSN kann man ja problemlos manuell machen.

Muss ich gegebenenfalls zus. Bauteile verwenden?

Bitte helft mir, ich werde sonst wahnsinnig. Muss einen recht komplexen 
Kommandointerpreter schreiben. Dafür will ich C verwenden. Inline 
Assembler scheint mir nicht die Lösung.

Oder doch Software SPI in C lernen?

Chris

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es muss doch möglich sein, das SPI Interface des µC zu nutzen und ihn
> trotzdem über ISP zu programmieren.
Du hast verschiedene Möglichkeiten. Verwendung eines Bootloaders 
beispielsweise, denn das läuft auch unter ISP.

Falls du trotzdem Hardware verwenden willst, musst du dafür sorgen, dass 
die angeschlossenen SPI-Slaves deaktiviert sind, wenn programmiert wird 
(/SS der Slaves auf High -> bei direkter Portanbindung während dem Reset 
sichergestellt durch die Resetbedingung der Ports -> hochohmiger Eingang 
mit Pull-Up).

> Kann ich einfach zwei Sachen an die entsprechenden Beinchen (MOSI und
> MISO und SCK) anschliessen? CSN kann man ja problemlos manuell machen.
Siehe oben, wenn der /SS der Slaves deaktiviert ist, sollten die 
Ausgänge hochohmig sein. Im Normalfall bietet eine SPI-Schnittstelle 
eines Controllers eh nur einen Hardware-SlaveSelect, d.h. die anderen 
Select-Leitungen müssen in Software gesteuert werden.

Falls du schon einen Schaltplan hast, zeig mal, dann kann man sich das 
besser vorstellen.

Ralf

Autor: Bensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es muss doch möglich sein, das SPI Interface des µC zu nutzen und ihn
trotzdem über ISP zu programmieren.

Dafür ist das auch gedacht. Bei Atmel gibt es Application Notes mit 
allen Hinweisen- evtl. steht's sogar im Datenblatt.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Kann ich einfach zwei Sachen an die entsprechenden Beinchen (MOSI und
>MISO und SCK) anschliessen? CSN kann man ja problemlos manuell machen.

http://www.atmel.com/dyn/resources/prod_documents/...

MfG Spess

Autor: Christoph Hoell (webturtle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> http://www.atmel.com/dyn/resources/prod_documents/...

Ja steht im Prinzip drin wie es geht. Danke dafür.
Wenn ich jetzt noch weiss welchen Wert der Widerstand in Reihe haben 
soll? Es steht leider kein Wert im Datenblatt.

Einen Schaltplan habe ich noch nicht, ist zur Zeit alles auf einem 
Steckbrett.
Werde versuchen nachher grob anzureissen wie ich es habe. Vielleicht 
komme ich da aber auch erst heut Abend zu.

Danke vorab für die Hilfe, bin zuversichtlich dass es klappen wird. 
Chris

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR042: AVR Hardware Design Considerations

http://www.atmel.com/dyn/resources/prod_documents/...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph Hoell schrieb:
> Es widerstrebt mir immer ein Software SPI zu implementieren und ich muss
> nun ja auch nicht noch lernen wie es in C funktioniert.

Warum nicht?
SPI ist so ziemlich das einfachste:

#include <avr/io.h>

struct bits {
  uint8_t b0:1;
  uint8_t b1:1;
  uint8_t b2:1;
  uint8_t b3:1;
  uint8_t b4:1;
  uint8_t b5:1;
  uint8_t b6:1;
  uint8_t b7:1;
} __attribute__((__packed__));

#define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)


#define SPI_CLK         SBIT( PORTB, 0 )        // clock
#define SPI_CLK_DDR     SBIT( DDRB,  0 )
#define SPI_MOSI        SBIT( PORTB, 1 )        // data out
#define SPI_MOSI_DDR    SBIT( DDRB,  1 )
#define SPI_MISO_PIN    SBIT( PINB,  2 )        // data in


uint8_t shift_io( uint8_t b )   // send / receive byte
{
  SPI_CLK_DDR = 1;              // set as output
  SPI_MOSI_DDR = 1;

  for( uint8_t i = 8; i; i-- ){         // 8 bits
    SPI_MOSI = 0;
    if( b & 0x80 )              // high bit first
      SPI_MOSI = 1;
    b <<= 1;
    SPI_CLK = 1;
    if( SPI_MISO_PIN )
      b++;
    SPI_CLK = 0;
  }
  return b;
}


Peter

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werner B. schrieb:
> AVR042: AVR Hardware Design Considerations
>
> http://www.atmel.com/dyn/resources/prod_documents/...

Sorry, ich meinte
http://www.atmel.com/dyn/resources/prod_documents/...

Zitat von Seite 2:
The value of the
resistors should be chosen depending on the circuitry connected to the 
SPI bus.

Also denk dir was aus.

Autor: Christoph Hoell (webturtle)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also, erst mal danke Peter.
Das sieht wirklich nicht so schwer aus.
Das werde ich auf jeden Fall testen.

Aber um es endgültig zu klären hier mal schnelle Schaltbilder.

Einmal ohne Anpassungen ISP und SPI direkt verkabelt.

Dann mit einem Pullup von 10K an SS nach VCC (ist das richtig so?)

Dann mit den 3 Reihenwiderständen an MOSI, MISO und SCK wie im 
Datenblatt.

Habe mal 4K7 eingetragen, aber kann das, auch mit den Tips von Werner B, 
nicht wirklich begründen. Da fehlt mir das Wissen zu. Falls jemand Zeit 
wäre hier eine Erklärung der Zusammenhänge toll.

Der anzusteuernde Chip ist ein Trinamic TMC 246 und auch der Slave. An 
diesen wirden 2 Byte gesendet damit sich der Motor dreht. Er antwortet 
mit 2 Byte als "Zustandsdaten".

Unabhängig davon dass ich es über Software SPI testen werde, dank Peter, 
es kann ja auch mal sein dass ich einfach die 4 Pins die ich fürs 
Software SPI nutze dringend brauchen werde, daher die Frage: Welche 
Version, Pullup oder Reihe ist besser oder sinnvoller? Sind die versch. 
Versionen überhaupt korrekt?

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab das mal aus dem Datenblatt des TMC246 rausgesucht.

Zitat:
SDO is tristated whenever ENN is inactive (high) or CSN is inactive 
(high).

Der Pull-Up an SS reicht völlig aus.

Autor: Christoph Hoell (webturtle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werner B. schrieb:
> Der Pull-Up an SS reicht völlig aus.

Danke. Ich denke dass ich es auch richtig verkabelt habe und auch der 
Wert okay ist.
Werde das mal so versuchen in einem zweiten Testaufbau.

P.S. Die Lernkurve am Anfang ist ja wirklich extrem steil, aber Spass 
machts.

Autor: wswbln (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...zu den Schaltplänen: sehe ich das richtig, dass Du Master-out (MOSI) 
mit Serial-Data-Out (SDO) des Slaves verbinden willst? Keine gute Idee!

Autor: Christoph Hoell (webturtle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wswbln schrieb:
> ..zu den Schaltplänen: sehe ich das richtig, dass Du Master-out (MOSI)
> mit Serial-Data-Out (SDO) des Slaves verbinden willst? Keine gute Idee!

Ne, das ist ein Fehler im Plan. Ich tue mir immer schwer mit MISO und 
MOSI und habe es wieder mal verwechselt.... Dumm von mir.

Es soll natürlich MOSI an SDI und MISO an SDO

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.