Config Data Stream


Kennung
Config Data Stream (0x21, in CAN-ID: 0x42)

Format

Prio Command Resp. Hash DLC D-Byte 0 D-Byte 1 D-Byte 2 D-Byte 3 D-Byte 4 D-Byte 5 D-Byte 6 D-Byte 7
2+2 Bit 8 Bit 1 Bit 16 Bit 4 Bit 8 Bit 8 Bit 8 Bit 8 Bit 8 Bit 8 Bit 8 Bit 8 Bit
Message Prio CFG Data Stream 0|1 - 6 Dateilänge / Streamlänge in Bytes CRC    
High - - Low High Low
Message Prio CFG Data Stream 0|1 - 7 Dateilänge / Streamlänge in Bytes CRC Free  
High - - Low High Low
Prio CFG Data Stream 1 - 8 D-Byte 0 D-Byte 1 D-Byte 2 D-Byte 3 D-Byte 4 D-Byte 5 D-Byte 6 D-Byte 7

Beschreibung

Überträgt den Datenstrom einer Konfigurationsdatei. 

Folgt unmittelbar auf das (letzte) Antwortframe der "Config Data Anforderung" oder zum Mitteilen einer Konfigurationsänderung per Broadcast. Durch die DLC wird der Inhalt unterschieden: 

DLC = 6: 

Ist das erste Paket im Datenstrom. Es definiert den Datenstrom als Antwort auf eine Config Data Anfrage. Es enthält die Dateilänge in Bytes, sowie die CRC der zu übertragenden Bytes. Bei diesem Typ des Datenstroms wird zur Kollisionsauflösung der Hash des Empfängers verwendet. 

DLC = 7: 

Ist das erste Paket im Datenstrom. Es definiert den Datenstrom als Broadcast einer Konfigänderung. Es enthält die Dateilänge in Bytes, sowie die CRC der zu übertragenden Bytes, sowie einem reservierten Byte. Der Datenstrom ist bei dieser Übertragungsform immer(?) Zlib-Komprimiert. Bei diesem Typ des Datenstroms wird zur Kollisionsauflösung der Hash des Senders verwendet. 

DLC = 8:

Datenpaket: Es enthält immer 8 Byte an Daten. Stehen weniger Daten zur Verfügung, so wird mit 0x00 gepaddet. Wird immer ab dem 2.ten Datenpaket gesendet. Hash richtet sich nach obiger Systematik. Alle anderen DLC-Längen: Tritt im Datenstrom eine andere Länge auf, so ist der Empfang abzubrechen bzw zu beenden.

Beispiel

Antwort

Besonderheiten

Pakete werden nicht bestätigt und werden mit niedriger Prio im CAN übertragen

Der CRC ist ein 16-Bit-CRC mit dem Startwert 0xFFFF und dem Polynom 0x1021, der nach folgendem Algorithmus berechnet wird.

u16 CtDataSender::updateCRC (u16 CRC_acc, u8 CRC_input)
{
#define POLY 0x1021
// Create the CRC "dividend" for polynomial arithmetic (binary arithmetic with no carries)
CRC_acc = CRC_acc ^ (CRC_input << 8);
// "Divide" the poly into the dividend using CRC XOR subtraction CRC_acc holds the
// "remainder" of each divide. Only complete this division for 8 bits since input is 1 byte
for (int i = 0; i < 8; i++) {
// Check if the MSB is set (if MSB is 1, then the POLY can "divide" into the "dividend")
if ((CRC_acc & 0x8000) == 0x8000) {
// if so, shift the CRC value, and XOR "subtract" the poly
CRC_acc = CRC_acc << 1;
CRC_acc ^= POLY;
}
else {
// if not, just shift the CRC value
CRC_acc = CRC_acc << 1;
}
}
// Return the final remainder (CRC value)
return CRC_acc;
}