Als Neuling in der PIC-Programmierung suche ich nach einigen Gedanken, wie SPI zwischen einer Master- und Slave-MCU am effizientesten implementiert werden kann.
Der Zweck dieses Systems besteht darin, mithilfe einer softwarekonfigurierbaren „Matrix“ eine äußerst flexible Möglichkeit bereitzustellen, bis zu 32 einzelne Ausgangspins der Slave-MCU einem beliebigen der 32 Eingangspins der Master-MCU zuzuordnen.
Um die Dinge etwas klarer zu machen, habe ich unten eine Zeichnung hinzugefügt:
Eine andere MCU (nicht in der Zeichnung) verwaltet das Port-Mapping-Setup und überträgt diese Informationen als „Port-Matrix“ über I2C an die Slave-MCU.
Im Zeichnungsbeispiel sollte der Slave-Ausgangsport B, Bit 0 (B.0) dem Master-Eingangspin A, Bit 0 (A.0) zugeordnet werden. Außerdem sollte der Ausgang B.3 dem Eingang A.1 und dem Ausgang C zugeordnet werden .6 sollte Eingang B.6 zugeordnet werden
Wenn also Master-Pin A.1 hoch geht, sollte Slave-Pin B.3 auch hoch gehen. Aus Sicht der Anwendung sollte das einfach sein.
Aber was wäre der effizienteste Weg, um 32 Bits von 4 Ports auf dem Master zu lesen und sie auf dem Slave als 32-Bit-Ganzzahl darzustellen, damit die Anwendung die Zuordnung zu ihren Ausgangsports bereitstellen kann?
Der SPI-Takt sollte mindestens 2 MHz betragen, um funktional akzeptabel zu sein. Ist DMA hier eine Lösung? Kann eine solche Transportlösung unterbrechungs-/ereignisbasiert sein, um die CPU davon abzuhalten, Dinge abzufragen? Ziel-MCUs sind PIC32MX795.
Ich könnte definitiv einige Hinweise gebrauchen, um diese Kommunikation in Gang zu bringen.
Vielen Dank im Voraus!
Für die Datenübertragung: Am einfachsten geht das mit Schieberegistern. Sie brauchen sich weder um langsame Mikrocontroller noch um die Programmierung von Hardware in CPLDs zu kümmern.
Nehmen Sie zum Beispiel 74HC164 und 74HC166
Sie können vier 74HC166 kaskadieren, um ein 32-Bit-Parallel-In/Serial-Out-Schieberegister zu erstellen, und dann mit vier 74HC164 (32-Bit-Serial-In/Parallel-Out-Register) deserialisieren. Diese Chips können problemlos 100 MHz ausführen, kosten so gut wie nichts und erfordern nur minimale Schaltungen.
Problem ist, dass Sie die "Pin-Belegungsmatrix" verwenden wollten. Dies mit Toren zu bauen, wäre schmerzhaft.
Wenn Sie das Kommunikationsprotokoll selbst mit Bit-Banging versehen möchten, besteht der schnellste Weg möglicherweise darin, alle 4 Leitungen zum Senden der Pin-Zustände zu verwenden (Daten im Wert von 8 Pins pro Leitung).
Die Idee hier ist, grundsätzlich ein serielles Single-Wire-Protokoll zu verwenden. Da Sie keine Taktleitung haben, müssen Sie eine Art Startbit verwenden, um den Beginn der Übertragung zu identifizieren.
Nehmen wir an, die Datenleitungen werden im Leerlauf hoch gehalten und 0 ist das Startbit. Wenn Sie Pin-Daten im Wert von 0x12345678 (32 Bit) übertragen möchten, übertragen Sie 0x12 in der ersten Zeile, 0x34 in der zweiten Zeile und so weiter.
Das Bitmuster in der ersten Zeile sieht folgendermaßen aus:
0 0 0 0 1 0 0 1 0
^ ist das Startbit
In der zweiten Zeile erhalten Sie:
0 0 0 1 1 0 1 0 0
^ ist das Startbit
Sie können sehen, wohin ich damit gehe. Möglicherweise möchten Sie am Ende ein Prüfsummenbit hinzufügen, um sicherzustellen, dass keine Lesefehler aufgetreten sind. Um dies zu implementieren, müssen Sie warten, bis die Leitung niedrig wird (Sie können dafür einen Interrupt verwenden) und von diesem Punkt an im Wesentlichen jeden anderen seriellen Algorithmus implementieren - die Leitung mehrmals pro Bitperiode abtasten (maximale Dauer eines einzelnen Bits ) und vergewissern Sie sich, dass der Wert stabil ist, bevor Sie ihn aufnehmen.
Dann müssen Sie nur noch die von allen 4 Zeilen gesammelten Daten mit einigen Bitverschiebungen komprimieren und direkt in die Ausgabe schreiben.
Ihre Anforderungen sind ziemlich streng (2 MHz, 10 us Verzögerung), damit dies in einem PIC mit einigen Dutzend MIPS erfolgen kann. Davon abgesehen könnte es möglich sein. Aber es ist immer noch nicht das beste Werkzeug für den Job.
Kennen Sie FPGAs? Sie sind dafür zu groß und zu teuer, aber einige billige kleine CPLD können das auch. Anstatt Software zu schreiben, würden Sie SPI-Bit-Banging in VHDL oder Verilog auf der Master-Seite implementieren, und dann könnte der Slave Ihr CNC-Controller, PIC oder ein anderes CPLD sein.
gbulmer
Peterstevens
trosley
brhans
Peterstevens
Peterstevens