Verschiedene SPI Devices mit verschiedenen Modi (Arduino)

OP #4065537
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
Gast #4065644
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
Gast #4065665
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.
OP #4065718
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
1
void adns_com_begin_L(){
2
  SPI.setDataMode(SPI_MODE3);
3
  digitalWrite(PIN_NCS_L, LOW);
4
  digitalWrite(PIN_NCS_R, HIGH);
5
}
6

7
void adns_com_begin_R(){
8
  SPI.setDataMode(SPI_MODE3);
9
  digitalWrite(PIN_NCS_L, HIGH);
10
  digitalWrite(PIN_NCS_R, LOW);
11
}
12

13
void adns_com_end(){
14
  digitalWrite(PIN_NCS_L, HIGH);
15
  digitalWrite(PIN_NCS_R, HIGH);
16
  SPI.setDataMode(SPI_MODE0);
17
}
Gast #4067671
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.