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


von Christoph H. (webturtle)


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

von Ralf (Gast)


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

von Bensch (Gast)


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.

von spess53 (Gast)


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/doc2521.pdf

MfG Spess

von Christoph H. (webturtle)


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

von Werner B. (werner-b)


Lesenswert?


von Peter D. (peda)


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:
1
#include <avr/io.h>
2
3
struct bits {
4
  uint8_t b0:1;
5
  uint8_t b1:1;
6
  uint8_t b2:1;
7
  uint8_t b3:1;
8
  uint8_t b4:1;
9
  uint8_t b5:1;
10
  uint8_t b6:1;
11
  uint8_t b7:1;
12
} __attribute__((__packed__));
13
14
#define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)
15
16
17
#define SPI_CLK         SBIT( PORTB, 0 )        // clock
18
#define SPI_CLK_DDR     SBIT( DDRB,  0 )
19
#define SPI_MOSI        SBIT( PORTB, 1 )        // data out
20
#define SPI_MOSI_DDR    SBIT( DDRB,  1 )
21
#define SPI_MISO_PIN    SBIT( PINB,  2 )        // data in
22
23
24
uint8_t shift_io( uint8_t b )   // send / receive byte
25
{
26
  SPI_CLK_DDR = 1;              // set as output
27
  SPI_MOSI_DDR = 1;
28
29
  for( uint8_t i = 8; i; i-- ){         // 8 bits
30
    SPI_MOSI = 0;
31
    if( b & 0x80 )              // high bit first
32
      SPI_MOSI = 1;
33
    b <<= 1;
34
    SPI_CLK = 1;
35
    if( SPI_MISO_PIN )
36
      b++;
37
    SPI_CLK = 0;
38
  }
39
  return b;
40
}


Peter

von Werner B. (werner-b)


Lesenswert?

Werner B. schrieb:
> AVR042: AVR Hardware Design Considerations
>
> http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf

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

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.

von Christoph H. (webturtle)


Angehängte Dateien:

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?

von Werner B. (werner-b)


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.

von Christoph H. (webturtle)


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.

von wswbln (Gast)


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!

von Christoph H. (webturtle)


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

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.