Hintergrund
Ich entwickle ein Projekt, das die bescheidenen Mikrocontrollerspezifikationen von erfordert:
- 8 12-Bit-10-kHz-ADCs
- 1 KB RAM
- 48-QFN oder kleinerer Platzbedarf
- 20 kbit / s Daisy-Chain-fähiges, rauschresistentes und fehlerkorrigierendes Kommunikationsprotokoll
Die Anforderungen an die Signalverarbeitung sind relativ gering und die meisten können an den Master-Prozessor im System exportiert werden. Die ersten drei Spezifikationen sind einfach zu erfüllen und können für weniger als 2 USD in Stückzahlen durchgeführt werden. Die Kommunikation findet jedoch in einer sehr lauten Umgebung statt, sodass lärmempfindliche Netzwerke wie LIN und I2C ausfallen. Ein weiteres Argument gegen LIN ist, dass ich das Ganze mit 5 V oder 3,3 V betreiben möchte und LIN-Transceiver 12 V benötigen und daher einen zusätzlichen Regler oder Kabel pro Sensorplatine benötigen würden. Für diese Aufgabe habe ich mich zunächst für CAN entschieden. CAN-Controller verursachen jedoch erhebliche Kosten, und ich bin gespannt, ob dies mit Software möglich ist.
CAN-Physical-Layer
Die CAN-Spezifikation definiert die Datenverbindung und die physikalischen Schichten des OSI-Netzwerkreferenzmodells. Es gibt viele kostengünstige 8-Pin-ICs, wie den NXP TJA1040 / 50 , den Maxim MAX3058 / 59 , den Microchip MCP2551 und den TI SN65HVD1050 , um die physikalische Schicht zu implementieren. Das Implementieren der physikalischen Schicht mit D / A-Wandlern oder Operationsverstärkern wäre schwierig, wenn nicht unmöglich, so dass diese ICs den Wert von 1 USD oder die damit verbundenen Kosten durchaus wert sind.
CAN-Datenverbindung / Protokollschicht
Für die Datenverbindungsschicht fügen einige Mikrocontroller CAN-Protokollmodule zu den grundlegenden UART-, I2C- und SPI-Kommunikationsschichten hinzu. Diese sind jedoch deutlich teurer als die Basischips.
Untersuchung der Kosten von CAN-Protokollmodulen
Um diese Behauptung zu untermauern, hier einige populäre Mikros in CAN- und Nicht-CAN-Versionen:
- ATmega16 - ATMEGA16M1 (mit CAN): 3,87 USD, ATMEGA168A (ohne CAN): 3,23 USD
- dsPIC - DSPIC33FJ64MC802 (mit CAN): 6,14 USD, DSPIC33FJ64GP202 (ohne CAN): 5,48 USD
- PIC18 - PIC18F2480 (mit CAN): 6,80 USD, PIC18F24J10 (ohne CAN): 2,10 USD
- Cortex-M3 - STM32F103C4T6A (mit CAN): 6,50 USD, STM32F100C4T6B (ohne CAN): 2,73 USD
Um fair zu sein, habe ich nur Mikrocontroller mit äquivalenten Speichergrößen verglichen. Viele der Nicht-CAN-Versionen sind jedoch mit kleineren Speichergrößen für weniger verfügbar. Externe CAN-Controller, wie der Microchip MCP2515 , kosten fast 2 US-Dollar. Wenn Sie die Option haben, ist es offensichtlich kostengünstiger , den CAN-Controller in den Mikrocontroller zu integrieren.
Interessanterweise ist das ATmega-Teil das mit Abstand billigste mit CAN ausgestattete Teil in Digikeys Inventar.
Funktion der CAN-Protokollschicht
Das in den dsPIC-Mikrocontrollern enthaltene CAN-Modul führt folgende Aktionen aus:
Das CAN-Bus-Modul besteht aus einer Protokoll-Engine und einer Nachrichtenpufferung / -steuerung. Die CAN-Protokoll-Engine übernimmt alle Funktionen zum Empfangen und Senden von Nachrichten auf dem CAN-Bus. Nachrichten werden übertragen, indem zuerst die entsprechenden Datenregister geladen werden. Status und Fehler können durch Lesen der entsprechenden Register überprüft werden. Jede auf dem CAN-Bus erkannte Nachricht wird auf Fehler überprüft und dann mit Filtern abgeglichen, um festzustellen, ob sie empfangen und in einem der Empfangsregister gespeichert werden soll.
Dies scheint in Software ziemlich machbar zu sein.
Die Frage
Kann eine Softwareprotokollschicht verwendet werden, um die CAN-Spezifikation nur mit einem kostengünstigen Mikrocontroller mit UART-Ausstattung und einem CAN-Transceiver zu implementieren? Wenn ja, gibt es Open-Source-Implementierungen?
Können alternativ CAN-Transceiver mit UARTs verwendet werden, um ein benutzerdefiniertes Protokoll zu implementieren? Ich bin mit einer Single-Master-Topologie einverstanden. Ich verstehe, dass es schwierig sein kann, ein Schiedsverfahren in einem benutzerdefinierten Protokoll durchzuführen.