Muss nochmal fragen: SPI Interface nutzen

OP #1609844
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
Gast #1609977
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
Gast #1609992
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.
OP #1610216
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
#1610262
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
OP #1610279
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?
Angehängte Dateien:
OP #1610433
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren