Config Data Stream
Kennung |
Config Data Stream
(0x21,
in CAN-ID: 0x42)
|
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
|
Ü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.
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;
}