# Documentation ### **Datenaufbau**
ByteRichtungAbkürzungBeschreibung
1->QQQuelladresse
2->ZZZieladresse
3->PBPrimärbefehl
4->SBSekundärbefehl
5->NNZahl der folgenden Bytes
6 bis 5 + NN->DataDatenbytes
6 + NN->CRCPrüfziffer
7 + NN<-ACKPositive Bestätigung des Empfängers (ab hier nicht bei Broadcast-Nachrichten)
8 + NN<-NN2Datenlänge der Antwort
9 + NN bis 8 + NN + NN2<-DataDaten vom Slave an den Master
9 + NN + NN2<-CRCPrüfziffer
10 + NN + NN2->ACK
11 + NN + NN2->SYNKennung, dass Bus wieder bereit ist für andere Teilnehmer
Service/Befehl => Kombination von Pimär und Sekundärbefehl => Darstellung als HEX-Wert z.B. Primärbefehl 07 (Systemdatenbefehle) + Sekundärbefehl 00 (Datum/Zeit Meldung eines Masters) = Service 0700 Primärbefehle b5 sind von Vaillant, also nicht per Standard definiert ### **Kommunikation** Master-Slave Telegramme und Broadcast Telegramme Jeder Master hat auch eine Slave Adresse (Slave = Master + 5) Broadcast-Adresse ist FE ### **CRC** Muss mit expandiertem Datenstring erfolgen ([https://ebus-wiki.org/doku.php/ebus/ebuscrc](https://ebus-wiki.org/doku.php/ebus/ebuscrc)) ```C++ ////////////////////////////////////////////////////////////////////////// // // CRC-Berechnung aus http://www.mikrocontroller.net/topic/75698 // ////////////////////////////////////////////////////////////////////////// #ifdef USE_CRC_TAB const UCHAR CRC_Tab8Value[256] ''/********************************************************************************************************/ /** Function for CRC-calculation with tab operations */ /********************************************************************************************************/ UCHAR crc8(UCHAR data, UCHAR crc_init) { UCHAR crc; crc '' (UCHAR) (CRC_Tab8Value[crc_init] ^ data); return (crc); } #else /********************************************************************************************************/ /** slower, but less memory */ /********************************************************************************************************/ unsigned char crc8(unsigned char data, unsigned char crc_init) { unsigned char crc; unsigned char polynom; int i; crc '' crc_init; for (i '' 0; i < 8; i++) { if (crc & 0x80) { polynom '' (unsigned char) 0x9B; } else { polynom '' (unsigned char) 0; } crc '' (unsigned char)((crc & ~0x80) << 1); if (data & 0x80) { crc '' (unsigned char)(crc | 1) ; } crc '' (unsigned char)(crc ^ polynom); data '' (unsigned char)(data << 1); } return (crc); } #endif UCHAR CalculateCRC( UCHAR**Data, int DataLen ) { UCHAR Crc '' 0; for( int i '' 0 ; i < DataLen ; ++i, ++Data ) { Crc '' crc8(**Data, Crc ); } return Crc; } ```