Ich bin grade dabei, die grundsätzliche Verkabelung eines recht komplexen Projekts festzulegen. Die Frage ist, welche serielle Schnittstelle für was? (Diese Post enthält zwei Fragen, siehe unten!)
1) Komponenten/Setup:
-
3x Motortreiber, standart SPI, nur Setup
-
Bewegungssensor, standart SPI, ständiger Datenstrom wärend des Betriebs
-
Display/Speicher, standart SPI, ständiger Datenstrom wärend des Betriebs
-
Funkmodul, UART, ständiger Datenstrom wärend des Betriebs
-
Lanc Kamerasteuerung, halbduplex UART (langsam), ständiger Datenstrom wärend des Betriebs
-
Kameraobjektivanschluß, halbduplex SPI (schnell!), ständiger Datenstrom wärend des Betriebs
-
"Due Core" (Arduino Due clone, http://www.inhaos.com), alle Pins des Atmel SAM3X8E sind zugänglich
2) Stand der Dinge
Ich habe mir gedacht, die standart SPI-Komponenten häng ich an den Hardware SPI-Port und nutze dazu auch die 4 Hardware CS-Pins, also:
3x Motortreiber, Bewegungssensor <-> Hardware SPI + 4 CS-Pins
Dabei müssen die Motortreiber nur am Anfang per SPI eingestellt werden (und ggf. mal zwischendurch das Setup angepaßt werden), wärend die Daten vom Bewegungssensor (nach dem Setup) kontinuierlich übertragen und verarbeitet werden müssen. Durch die Hardware CS-Pins passiert das Umschalten zwischen den Komponenten automatisch und muss nicht extra programmiert werden.
Auf dem Display-Shield ist ein Speicherbaustein mit drauf, in den ich die verarbeiteten Bewegungsdaten schreiben will. Außerdem muss natürlich das Display ständig aktualisiert werden, also:
Display/Speicher <-> UART(RX1/TX1) in SPI mode
Das Funkmodul sendet und empfängt ständig Daten(-Pakete), die dann von der CPU verarbeitet werden müssen, kann aber kein SPI, also:
Funkmodul <-> UART(RX0/TX0)
So kann ich den Datenfluss durch Verwendung der DMA-Controller weitestgehend ohne CPU-Belastung bewerkstelligen.
Da mir langsam die seriellen Schnittstellen ausgehen (RX3/TX3 wird ja anscheinend in der Arduino IDE nicht unterstützt), die Lanc-Schnittstelle mit 9600baud eher gemütlich unterwegs ist und nur im Halbduplex-Verfahren über eine Leitung arbeitet, würde ich diese über Software einbinden, also:
Lanc-Kamerasteuerung <-> Bitbanging (halbduplex) seriell
Und als letztes...das größte Problem: FourThirds und Micro-FourThirds Objektive direkt ansteuern.
Der FourThirds-Anschluss ist im wesentlichen Halbduplex-SPI und besteht aus Clock (500kHz, immer von der Kamera/dem Arduino), Data, 2 Signalleitungen (Lens>Body, Body>Lens). Dabei wird über die Datenleitung immer von dem Gerät aus gesendet, dass ZUERST seine Signalleitung auf LOW zieht. Es wird aber erst gesendet, wenn das andere Gerät seine Bereitschaft anzeigt und seine Signalleitung auch auf LOW zieht.
Da der Anschluss mit 500kHz arbeitet und die CPU viele andere (zeitkritische) Aufgaben hat, würde ich das gerne über einen der Hardware-Ports laufen lassen (also kein Bitbanging). Und da das Protokoll mit den zwei "CS"-Leitungen nicht ganz Standart ist, bringt mir der Hardware-SPI Port keine Vorteile gegenüber einem UART in SPI mode (der dazu auch noch gepuffert wäre). Deshalb:
Objektivsteuerung <-> UART(RX2/TX2) in SPI mode
3) Macht das so Sinn?
Ist das die optimale Verteilung der Komponenten auf die Schnittstellen? Oder habe ich was übersehen?
Oder ergibt sich ein Vorteil, wenn z.B. der Hardware-SPI Port mit einem der UART in SPI mode Ports getauscht wird? (siehe dazu auch 4) )
Verbesserungsvorschläge?
4) Halbduplex-SPI Elektronik
Das Kameraobjektiv empfängt und sendet Daten über eine Leitung, die dazu an MOSI/TX und MISO/RX hängen muss. (Das ist nicht das Gleiche wie one-wire-SPI!)
Dazu habe ich zwei mögliche Schaltungen gefunden:
A) MOSI über Widerstand an der Datenleitung, MISO direkt.
B) MOSI und MISO hängen über einen Analog-Switch an der Datenleitung, den ich über einen extra I/O Pin entsprechend schalten muss.
Welche Möglichkeit ist hier zu bevorzugen?
Gibt es zwischen Hardware-SPI und UART in SPI mode irgend einen schaltungstechnischen/elektrischen Unterschied, der hier bei diesen Schaltungen wichtig ist?