Forum: Mikrocontroller und Digitale Elektronik Verschiedene SPI Devices mit verschiedenen Modi (Arduino)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Dont K. (dont_k)


Bewertung
0 lesenswert
nicht lesenswert
Hi

Das Problem steht eigentlich schon in der Überschrift.

Ich will 3 verschiedene Devices mit 2 verschiedenen Modi betreiben (der 
Funkchip braucht einen anderen Modus.) Es geht um folgendes Arduino 
Projekt hier: Beitrag "Re: SPI Problem aufgrund von Spannungsversorgung (Arduino Uno & opt. Sensor))"
Ich benutze das normale SPI für zwei Sensoren und Mirf für den Funkchip. 
Leider greift Mirf auch auf das normale SPI zurück und ich kann deswegen 
die Modi nicht separat einstellen.

Eigentlich habe ich die Lösung schon hier gefunden:
http://www.mikrocontroller.net/articles/Serial_Peripheral_Interface
>>Es ist problemlos möglich ICs mit verschiedenen SPI-Modi an einem Bus zu 
>>betreiben, man muss nur vor dem Aktivieren des Chip Select den jeweils 
>>richtigen Modus einstellen.

Nur... Ist damit gemeint, dass ich vor jedem Zugriff den Modus umstellen 
muss? Oder gibt es eine Möglichkeit das von Anfang an zu definieren? 
(Ohne mir ein eigenes SPI für Mirf schreiben/kopieren zu müssen.)

lg

: Bearbeitet durch User
von Frank K. (fchk)


Bewertung
1 lesenswert
nicht lesenswert
Dont K. schrieb:

> Nur... Ist damit gemeint, dass ich vor jedem Zugriff den Modus umstellen
> muss? Oder gibt es eine Möglichkeit das von Anfang an zu definieren?

Du musst vor jedem Zugriff umstellen.

fchk

von Dont K. (dont_k)


Bewertung
0 lesenswert
nicht lesenswert
Ok, danke dir!
Damit wäre das Problem gelöst.

von grundschüler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dont K. schrieb:
> Oder gibt es eine Möglichkeit das von Anfang an zu definieren?

das Macht man am Anfang mit defines:
#define lcd_CS_HIGH()    pinSET(lcd_CS_port,lcd_CS_pin)//;spimode_0
#define lcd_CS_LOW()    pinCLR(lcd_CS_port,lcd_CS_pin)//;spimode_3

von grundschüler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
grundschüler schrieb:
> //

Der Kommentar muss weg:
#define lcd_CS_HIGH()    pinSET(lcd_CS_port,lcd_CS_pin);spimode_0
#define lcd_CS_LOW()    pinCLR(lcd_CS_port,lcd_CS_pin);spimode_3

von Dont K. (dont_k)


Bewertung
0 lesenswert
nicht lesenswert
Ok
Sieht interessant aus. Magst du mir vielleicht erklären was die Zeilen 
tun? Das sieht für mich nicht aus als ob mein Standard SPI das verträgt. 
Werden da irgendwelche Methoden überschrieben?

von grundschüler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dont K. schrieb:
> Ok
> Sieht interessant aus. Magst du mir vielleicht erklären was die Zeilen
> tun? Das sieht für mich nicht aus als ob mein Standard SPI das verträgt.
> Werden da irgendwelche Methoden überschrieben?

Das musst du nach deinem Code selbst definieren, z.B. für AVR:
#define spimode_0   SPCR&=~((1<<CPOL)|(1<<CPHA))
#define spimode_3   SPCR|=(1<<CPOL)|(1<<CPHA)

#define lcd_CS_HIGH()  PORTB|=1<<4;spimode_0

von Dont K. (dont_k)


Bewertung
0 lesenswert
nicht lesenswert
Ok ich blick da zwar noch nicht ganz durch, werds mir aber anschaun.

thx

von W.A. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dont K. schrieb:
> Das sieht für mich nicht aus als ob mein Standard SPI das verträgt.
> Werden da irgendwelche Methoden überschrieben?

Das sind Definitionen für einfache Textersetzungen, die der C 
Preprozessor macht.

Von was für Methoden redest du. Irgendwie musst du doch bei dir der 
SPI-Mode eingestellen werden.

von Dont K. (dont_k)


Bewertung
0 lesenswert
nicht lesenswert
Na ich glaub ich hatte das vorher mit der Textersetzung nicht ganz 
verstanden.

Gut die ersten beiden Zeilen sind recht klar, da werden einfach nur die 
SPI Modes gesetzt (an der definierten Stelle im Quellcode).

#define lcd_CS_HIGH()  PORTB|=1<<4;spimode_0

da wird im Quellcode lcd_CS_HIGH() mit PORTB|=1<<4;spimode_0 
überschrieben. am Ende brauche ich kein ; weil ja mit dem define auch 
keines ersetzt wird.

Was ich nicht ganz vestehe ist:
PORTB|=1<<4
Was bewirkt dieser Teil?
Ist das alles was lcd_CS_HIGH() sonst noch tun soll? Außer den SPI Mode 
setzen?

Das sind derzeit meine high/low Methoden
void adns_com_begin_L(){
  SPI.setDataMode(SPI_MODE3);
  digitalWrite(PIN_NCS_L, LOW);
  digitalWrite(PIN_NCS_R, HIGH);
}

void adns_com_begin_R(){
  SPI.setDataMode(SPI_MODE3);
  digitalWrite(PIN_NCS_L, HIGH);
  digitalWrite(PIN_NCS_R, LOW);
}

void adns_com_end(){
  digitalWrite(PIN_NCS_L, HIGH);
  digitalWrite(PIN_NCS_R, HIGH);
  SPI.setDataMode(SPI_MODE0);
}

: Bearbeitet durch User
von grundschüler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
PORTB|=1<<4; ;=> setze PIN_4 des Port_B auf high
ist - wenn PIN_NCS_L PortB/Pin4 entspricht - identisch mit
 digitalWrite(PIN_NCS_L, HIGH);
Es sind nur die Bezeichnungen aus dem Datenblatt/io.h und nicht von 
arduino.


irgendwo am Anfang von arduino stehen #defines, welches 
digitalWrite(x,y) entsprechend den Registern des AVR umdefinieren. z.B.:

#define GLUE(a, b)  a##b
#define PORT(x)          GLUE(PORT, x)
#define digitalWrite(x,y)  ((y) ? (PORT(x/4)|=(1<<(x%4)) : 
((PORT(x/4)&=~(1<<(x%4)))




deine  high/low Methoden sind ok.

von Dont K. (dont_k)


Bewertung
0 lesenswert
nicht lesenswert
Ok Dankeschön. Inzwischen funktioniert es.

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.