Documentation
Datenaufbau
Byte | Richtung | Abkürzung | Beschreibung |
1 | -> | Quelladresse | |
2 | -> | ZZ | Zieladresse |
3 | -> | PB | Primärbefehl |
4 | -> | SB | Sekundärbefehl |
5 | -> | NN | Zahl der folgenden Bytes |
6 bis 5 + NN | -> | Data | Datenbytes |
6 + NN | -> | CRC | Prüfziffer |
7 + NN | <- | ACK | Positive Bestätigung des Empfängers (ab hier nicht bei Broadcast-Nachrichten) |
8 + NN | <- | NN2 | Datenlänge der Antwort |
9 + NN bis 8 + NN + NN2 | <- | Data | Daten vom Slave an den Master |
9 + NN + NN2 | <- | CRC | Prüfziffer |
10 + NN + NN2 | -> |
ACK |
|
11 + NN + NN2 | -> | SYN | Kennung, 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)
//////////////////////////////////////////////////////////////////////////
//
// 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;
}
No Comments