CAN (Controller Area Network) ist ein Controller Area Network, ein serielles Kommunikationsnetzwerk, das eine verteilte Echtzeitsteuerung realisieren kann.
Wenn man an CAN denkt, muss man an das deutsche Unternehmen Bosch denken, denn CAN wird von diesem Unternehmen (und Intel) entwickelt. CAN verfügt über viele hervorragende Funktionen, die es weit verbreitet machen. Zum Beispiel: Die Übertragungsgeschwindigkeit beträgt bis zu 1 Mbit / s, die Kommunikationsentfernung beträgt bis zu 10 km, verlustfreier Bit-Arbitrierungsmechanismus, Multi-Master-Struktur.
In den letzten Jahren sind die Preise für CAN-Controller immer niedriger geworden, und viele MCUs haben auch CAN-Controller integriert. Jetzt ist jedes Auto mit einem CAN-Bus ausgestattet.
Ein typisches CAN-Anwendungsszenario:
CAN-Bus-Standard
Der CAN-Bus-Standard spezifiziert nur die physikalische Schicht und die Datenverbindungsschicht, und die benutzerdefinierte Anwendungsschicht ist erforderlich. Unterschiedliche CAN-Standards unterscheiden sich nur in der physikalischen Schicht.
Der CAN-Transceiver ist für die Umwandlung zwischen Logikpegeln und physikalischen Signalen verantwortlich.
Konvertieren Sie ein logisches Signal in ein physikalisches Signal (Differenzpegel) oder konvertieren Sie ein physikalisches Signal in einen logischen Pegel.
Es gibt zwei CAN-Standards, nämlich IOS11898 und IOS11519, die unterschiedliche Differentialpegel-Eigenschaften aufweisen.
Die Amplitude mit hohem und niedrigem Pegel ist niedrig und die entsprechende Übertragungsgeschwindigkeit ist schnell;
* Der Twisted Pair-Gleichtakt eliminiert Interferenzen, da sich der Pegel gleichzeitig ändert und die Spannungsdifferenz unverändert bleibt.
Physikalische Schicht
CAN verfügt über drei Schnittstellengeräte
Wenn mehrere Knoten verbunden sind, ist der Bus niedrig, solange einer von ihnen niedrig ist, und nur wenn alle Knoten hoch ausgegeben werden, ist er hoch. Die sogenannte "Linie und".
Nachdem der CAN-Bus 5 aufeinanderfolgende identische Bits hat, fügen Sie ein entgegengesetztes Bit ein, um eine Übergangsflanke für die Synchronisation zu erzeugen. Dadurch werden akkumulierte Fehler beseitigt.
Wie bei 485 und 232 ist die Übertragungsgeschwindigkeit von CAN umgekehrt proportional zur Entfernung.
CAN-Bus, Anschlusswiderstandsanschluss:
Warum ist es 120Ω, weil die charakteristische Impedanz des Kabels 120Ω beträgt, um eine unendliche Übertragungsleitung zu simulieren
Datenübertragungsebene
Die CAN-Bus-Übertragung ist ein CAN-Rahmen, der CAN-Kommunikationsrahmen ist in fünf Arten unterteilt, nämlich Datenrahmen, Fernrahmen, Fehlerrahmen, Überlastrahmen und Rahmenintervall.
Datenrahmen werden zum Senden und Empfangen von Daten zwischen Knoten verwendet und sind der am häufigsten verwendete Rahmentyp. Remote-Rahmen werden zum Empfangen von Daten von einem empfangenden Knoten zu einem sendenden Knoten verwendet. Fehlerrahmen sind Rahmen, die verwendet werden, um andere Knoten zu benachrichtigen, wenn ein Knoten a findet Rahmenfehler, Überlastungsrahmen sind ein Rahmen, der vom empfangenden Knoten verwendet wird, um den sendenden Knoten über seine Empfangsfähigkeit zu informieren, ein Rahmen, der verwendet wird, um Datenrahmen und entfernte Rahmen von vorherigen Rahmen zu isolieren.
Der Datenrahmen wird entsprechend der Länge des Arbitrierungsabschnitts in einen Standardrahmen (2,0A) und einen erweiterten Rahmen (2,0B) unterteilt
Rahmenanfang
Der Rahmenstart besteht aus einem dominanten Bit (niedriger Pegel), der sendende Knoten sendet den Rahmenstart und andere Knoten werden mit dem Rahmenstart synchronisiert;
Das Ende des Rahmens besteht aus 7 unsichtbaren Bits (hoher Pegel).
Schiedsstelle
Wie löst der CAN-Bus das Problem des Mehrpunktwettbewerbs?
Die Antwort gibt der Schiedsbereich.
Der CAN-Bus-Controller überwacht den Buspegel beim Senden von Daten. Wenn die Pegel unterschiedlich sind, stoppt er das Senden und führt eine andere Verarbeitung durch. Befindet sich das Bit im Arbitrierungsabschnitt, wird der Buswettbewerb beendet, und wenn es sich in anderen Abschnitten befindet, wird ein Fehlerereignis generiert.
Je kleiner die Frame-ID ist, desto höher ist die Priorität. Da sich das RTR-Bit des Datenrahmens auf der dominanten Ebene befindet und der entfernte Rahmen auf der rezessiven Ebene liegt, hat der Datenrahmen Vorrang vor dem entfernten Rahmen, da das Rahmenformat und die Rahmen-ID gleich sind, da das IDE-Bit des Standardrahmen ist auf der dominanten Ebene. Das IDE-Bit des erweiterten Rahmens ist unsichtbar. Bei Standardrahmen und erweiterten Rahmen mit derselben ID in den ersten 11 Bits ist die Priorität des Standardrahmens höher als die des erweiterten Rahmens.
Kontrollabschnitt
Insgesamt gibt es 6 Bits. Der Steuerabschnitt des Standardrahmens besteht aus dem erweiterten Rahmenflagbit Bit IDE, dem reservierten Bit r0 und dem Datenlängencode DLC, der erweiterte Rahmensteuerabschnitt besteht aus IDE, r1, r0 und DLC.
Datensegment
0-8 Bytes, kurze Rahmenstruktur, gute Echtzeitleistung, geeignet für Bereiche der Automobil- und Industriesteuerung;
CRC-Stufe
Das CRC-Prüfsegment besteht aus einem 15-Bit-CRC-Wert und einem CRC-Begrenzer.
ACK-Bühne
Wenn vom Beginn des vom empfangenden Knoten empfangenen Rahmens an das CRC-Segment kein Fehler auftritt, sendet er einen dominanten Pegel im ACK-Segment, der sendende Knoten sendet einen rezessiven Pegel und die Zeile und das Ergebnis sind dominant Niveau.
Remote-Frame
Der entfernte Rahmen ist in 6 Segmente unterteilt, die auch in Standardrahmen und erweiterte Rahmen unterteilt sind, und das RTR-Bit ist 1 (rezessiver Pegel).
CAN ist ein sehr zuverlässiger Bus, hat aber auch fünf Fehler.
CRC-Fehler: Dieser Fehler tritt auf, wenn die gesendeten und empfangenen CRC-Werte unterschiedlich sind.
Formatfehler: Der Fehler tritt auf, wenn das Frame-Format unzulässig ist.
Antwortfehler: Dieser Fehler tritt auf, wenn der sendende Knoten die Antwortnachricht in der ACK-Phase nicht empfängt.
Bit-Sendefehler: Der Sendeknoten stellt fest, dass die Busebene beim Senden von Informationen nicht mit der Sendeebene übereinstimmt, und dieser Fehler tritt auf.
Bit-Stuffing-Fehler: Dieser Fehler tritt auf, wenn die Kommunikationsregeln auf dem Kommunikationskabel verletzt werden.
Wenn einer dieser fünf Fehler auftritt, sendet der sendende Knoten oder der empfangende Knoten einen Fehlerrahmen
Um zu verhindern, dass einige Knoten ständig Fehler machen und Fehlerrahmen senden, was die Kommunikation anderer Knoten stört, legt das CAN-Protokoll drei Zustände und Verhaltensweisen von Knoten fest
Überlastungsrahmen
Wenn ein Knoten nicht empfangsbereit ist, sendet er einen Überlastungsrahmen, um den sendenden Knoten zu benachrichtigen.
Rahmenintervall
Es wird verwendet, um Datenrahmen, entfernte Rahmen und Rahmen vor ihnen zu isolieren, und vor Fehlerrahmen und Überladungsrahmen wird kein Rahmenintervall hinzugefügt.
CAN-Knoten erstellen
Konstruieren Sie einen Knoten, um eine entsprechende Steuerung zu realisieren. Er ist von unten nach oben in vier Teile unterteilt: CAN-Knotenschaltung, CAN-Controller-Treiber, CAN-Anwendungsschichtprotokoll, CAN-Knoten-Anwendungsprogramm.
Obwohl die von verschiedenen Knoten ausgeführten Funktionen unterschiedlich sind, haben sie alle dieselbe Hardware- und Softwarestruktur.
Der CAN-Transceiver und die Steuerung entsprechen der physikalischen Schicht bzw. der Datenverbindungsschicht von CAN, um das Senden und Empfangen von CAN-Nachrichten abzuschließen, die Funktionsschaltung führt bestimmte Funktionen aus, wie z. B. Signalerfassung oder Steuerperipherie, die Hauptsteuerung und die Anwendungssoftware folgen Das Nachrichtenformat analysiert die Nachricht und vervollständigt das entsprechende Steuerelement.
Der CAN-Hardwaretreiber ist ein Programm, das auf dem Hauptcontroller ausgeführt wird (z. B. P89V51). Er führt hauptsächlich die folgenden Aufgaben aus: Registerbasierte Operationen, Initialisieren des CAN-Controllers, Senden von CAN-Nachrichten und Empfangen von CAN-Nachrichten;
Wenn Sie den CAN-Hardwaretreiber direkt verwenden, müssen Sie das obere Anwendungsprogramm ändern, wenn Sie den Controller wechseln, da die Portabilität schlecht ist. Durch Hinzufügen einer virtuellen Laufwerksschicht zur Anwendungsschicht und zur Hardware-Laufwerksschicht können die Unterschiede zwischen verschiedenen CAN-Controllern abgeschirmt werden.
Zusätzlich zum Vervollständigen der Kommunikationsfunktion enthält ein CAN-Knoten auch einige spezifische Hardwarefunktionsschaltungen. Die Funktionsschaltung steuert die abwärts gerichtete direkte Steuerfunktionsschaltung an, und die aufwärts gerichtete Schaltung ist die Funktionsschnittstelle der Steuerfunktionsschaltung für die Anwendungsschicht. Spezifische Funktionen umfassen Signalerfassung, Mensch-Maschine-Anzeige usw.
Der CAN-Transceiver soll den Austausch von CAN-Controller-Logikpegel und Differenzpegel auf dem CAN-Bus realisieren. Es gibt zwei Schemata zum Implementieren von CAN-Transceivern: Das eine ist die Verwendung des CAN-Transceiver-IC (zusätzliche Stromversorgungsisolation und elektrische Isolation erforderlich) und das andere die Verwendung des CAN-Isolations-Transceivermoduls. Der zweite Typ wird empfohlen.
Der CAN-Controller ist die Kernkomponente von CAN. Er implementiert alle Funktionen der Datenverbindungsschicht im CAN-Protokoll und kann die Analyse des CAN-Protokolls automatisch abschließen. Im Allgemeinen gibt es zwei Arten von CAN-Controllern: den Controller-IC (SJA1000) und den in den CAN-Controller integrierten MCU (LPC11C00).
Die MCU ist für die Steuerung der Funktionsschaltung und des CAN-Controllers verantwortlich: Wenn der Knoten gestartet wird, initialisiert sie die CAN-Controller-Parameter, liest und sendet CAN-Frames über den CAN-Controller, und wenn der CAN-Controller unterbrochen wird, behandelt er die Interrupt-Ausnahme des CAN-Controllers; Ausgangssteuersignale gemäß den empfangenen Daten;
Schnittstellenverwaltungslogik: Interpretieren Sie die MCU-Anweisungen, adressieren Sie die Registereinheiten jedes Funktionsmoduls im CAN-Controller und stellen Sie dem Hauptcontroller Interrupt- und Statusinformationen zur Verfügung.
Der Sendepuffer und der Empfangspuffer können die vollständigen Informationen im CAN-Bus-Netzwerk speichern.
Die Akzeptanzfilterung dient zum Vergleichen des gespeicherten Verifizierungscodes mit dem CAN-Nachrichtenidentifikationscode, und nur der CAN-Rahmen, der mit dem Verifizierungscode übereinstimmt, wird im Empfangspuffer gespeichert.
Der CAN-Kern implementiert alle Protokolle der Datenverbindung.
Übersicht über die Anwendungsschicht des CAN-Protokolls
Der CAN-Bus bietet nur zuverlässige Übertragungsdienste. Wenn ein Knoten eine Nachricht empfängt, muss er das Protokoll der Anwendungsschicht verwenden, um zu bestimmen, wer die Daten gesendet hat und welche Bedeutung die Daten haben. Übliche Protokolle der CAN-Anwendungsschicht sind: CANOpen, DeviceNet, J1939, iCAN usw.
Der Protokolltreiber der CAN-Anwendungsschicht ist ein Programm, das auf dem Hauptcontroller ausgeführt wird (z. B. P89V51). Er definiert die CAN-Nachricht gemäß dem Protokoll der Anwendungsschicht und schließt die Analyse und Zusammenstellung der CAN-Nachricht ab. Beispielsweise verwenden wir die Frame-ID, um die Knotenadresse anzugeben. Wenn die empfangene Frame-ID die eigene Knoten-ID nicht übergibt, wird sie direkt verworfen, andernfalls wird sie zur Verarbeitung an die obere Schicht übergeben, beim Senden lautet die Frame-ID auf die Adresse des empfangenden Knotens setzen.
CAN-Transceiver
Es gibt viele Ausgangsmodi des SJA1000. Der am häufigsten verwendete ist der normale Ausgangsmodus. Der Eingangsmodus wählt normalerweise nicht den Komparatormodus aus, wodurch die Kommunikationsentfernung vergrößert und der Strom im Ruhezustand verringert werden kann.
Entsprechend der Kommunikationsgeschwindigkeit ist der Transceiver in einen Hochgeschwindigkeits-CAN-Transceiver und einen fehlertoleranten CAN-Transceiver unterteilt.
Der gleiche CAN-Transceiver sollte im gleichen Netzwerk verwendet werden.
Es gibt viele Interferenzsignale auf der CAN-Verbindungsleitung, und es ist erforderlich, der Hardware Filter und Anti-Interferenz-Schaltkreise hinzuzufügen
Ein CAN-Isolationstransceiver (integrierter Filter und Entstörungsschaltung) kann ebenfalls verwendet werden.
Verbindungsmodus von CAN-Controller und MCU
SJA1000 kann als externer RAM betrachtet werden, die Adressbreite beträgt 8 Bit und es werden bis zu 256 Register unterstützt
#define REG_BASE_ADDR 0xA000 // 寄存器基址
unsigned char *SJA_CS_Point = (unsigned char *) REG_BASE_ADDR ;
// 写SJA1000寄存器
void WriteSJAReg(unsigned char RegAddr, unsigned char Value) {
*(SJA_CS_Point + RegAddr) = Value;
return;
}
// 读SJA1000寄存器
unsigned char ReadSJAReg(unsigned char RegAddr) {
return (*(SJA_CS_Point + RegAddr));
}
Schreiben Sie die Daten im Puffer kontinuierlich in das Register
…… for (i=0;i<len;i++) { WriteSJAReg(RegAdr+i,ValueBuf[i]); }……
Lesen Sie kontinuierlich mehrere Register in den Puffer
……for (i=0;i<len;i++) { ReadSJAReg(RegAdr+i,ValueBuf[i]); }……
Die Header-Datei enthält das Schema:
Jedes Programm enthält die verwendeten Header-Dateien
Jedes Programm enthält eine gemeinsame Header-Datei, die alle anderen Header-Dateien enthält
#ifndef __CONFIG_H__ // 防止头文件被重复包含
#define __CONFIG_H__
#include <8051.h> // 包含80C51寄存器定义头文件
#include "SJA1000REG.h" // 包含SJA1000寄存器定义头文件
// 定义取字节运算
#define LOW_BYTE(x) (unsigned char)(x)
#define HIGH_BYTE(x) (unsigned char)((unsigned int)(x) >> 8)
// 定义振荡器时钟和处理器时钟频率(用户可以根据实际情况作出调整)
#define OSCCLK 11059200UL
// 宏定义MCU的时钟频率
#define CPUCLK (OSCCLK / 12)
#endif // __CONFIG_H__
SJA1000 befindet sich nach dem Einschalten im Reset-Zustand und muss initialisiert werden, bevor es funktionieren kann.
(1) Setzen Sie Bit0 des Modusregisters, um in den Rücksetzmodus zu gelangen.
(2) Stellen Sie das Taktfrequenz-Teilungsregister ein, um die Taktfrequenz und den CAN-Modus auszuwählen;
(3) Akzeptanzfilter, Verifizierungscode und Abschirmungscode einstellen;
(4) Stellen Sie das Bus-Timer-Register 0 und 1 ein, um die CAN-Baudrate einzustellen;
(5) Stellen Sie den Ausgabemodus ein;
(6) Löschen Sie Bit0 des Modusregisters, um den Rücksetzmodus zu verlassen.
Modusregister
Nur-Erkennungsmodus: SJA1000 überprüft das Antwortbit beim Senden von CAN-Frames nicht.
Nur-Listen-Modus: In diesem Modus sendet SJA1000 keine Fehlerrahmen zur automatischen Erkennung der Baudrate. SJA1000 empfängt CAN-Rahmen mit unterschiedlichen Baudraten. Wenn CAN-Rahmen empfangen werden, werden die aktuelle Baudrate und die Busbaudrate gleich angezeigt.
Einstellung der Baudrate
Der CAN-Bus hat keinen Takt und verwendet eine asynchrone serielle Übertragung. Die Baudrate sind die in 1 Sekunde gesendeten Datenbits.
CAN-Frame-Übertragung:
Schritte zum Senden des CAN-Frames: 1. Überprüfen Sie das Statusregister und warten Sie, bis der Sendepuffer verfügbar ist.
2. Füllen Sie die Nachricht in den Sendepuffer.
3. Beginnen Sie mit dem Senden.
SJA1000 hat einen 12-Byte-Puffer. Die zu sendende Nachricht kann über das Register 16-28 geschrieben oder über das Register 96-108 geschrieben oder gelesen werden
Sende-Modus einstellen
char SetSJASendCmd(unsigned char cmd) {
unsigned char ret;
switch (cmd) {
default:
case 0:
ret = SetBitMask(REG_CAN_CMR, TR_BIT); //正常发送
break;
case 1:
ret = SetBitMask(REG_CAN_CMR, TR_BIT|AT_BIT); //单次发送
break;
case 2:
ret = SetBitMask(REG_CAN_CMR, TR_BIT|SRR_BIT);//自收自发
break;
case 0xff:
ret = SetBitMask(REG_CAN_CMR, AT_BIT);//终止发送
break;
}
return ret;
}
Sendefunktion
unsigned char SJA_CAN_Filter[8] = { // 定义验收滤波器的参数,接收所有帧
0x00, 0x00, 0x00, 0x00,
// ACR0~ACR3
0xff, 0xff, 0xff, 0xff
// AMR0~AMR3
};
unsigned char STD_SEND_BUFFER[11] = { // CAN 发送报文缓冲区
0x08, // 帧信息,标准数据帧,数据长度 = 8
0xEA, 0x60, // 帧ID = 0x753
0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa // 帧数据
};
void main(void) // 主函数,程序入口{
timerInit();// 初始化
D1 = 0;
SJA1000_RST = 1; // 硬件复位SJA1000
timerDelay(50); // 延时500ms
SJA1000_RST = 0;
SJA1000_Init(0x00, 0x14, SJA_CAN_Filter); // 初始化SJA1000,设置波特率为1Mbps
// 无限循环,main()函数不允许返回
for(;;) {
SJASendData(STD_SEND_BUFFER, 0x0);
timerDelay(100); // 延时1000ms
}
}
Warum ist die Frame-ID 0x753? Dies hängt mit dem Speicherformat des CAN-Frames im Puffer zusammen.
Der Anschlusswiderstand ist sehr wichtig. Wenn die Baudrate hoch ist und der Anschlusswiderstand nicht addiert wird, ist das Signalüberschwingen sehr schwerwiegend.
SJA1000 verfügt über einen 64-Byte-Empfangspuffer (FIFO), der die MCU-Anforderungen reduzieren kann. Die MCU kann bestätigen, dass SJA1000 die Nachricht nach dem Empfang der Nachricht durch Abfrage oder Unterbrechung liest.
2. Kann das Open Source RISC-V das Gegenmittel gegen Chinas "Kernknappheit" werden?
3. Raspberry Pi Pico: MCU für nur 4 US-Dollar
4. Es gibt viele Gründe, warum die MCU die AI-Funktion ~ unterstützt
5. Im Jahr 2020 habe ich 20 Prinzipien der Softwareentwicklung gelernt ~
6. Die Anwendung von Zustandsmaschinenideen in der eingebetteten Entwicklung ~
Haftungsausschluss: Dieser Artikel wird online reproduziert und das Copyright liegt beim ursprünglichen Autor. Wenn Sie in Urheberrechtsfragen verwickelt sind, kontaktieren Sie uns bitte. Wir werden das Urheberrecht anhand der von Ihnen bereitgestellten Materialien zur Urheberrechtsbescheinigung bestätigen und die Vergütung des Autors zahlen oder den Inhalt löschen.