Данные передаются фреймами. Протокол является адресным, с поддержкой широковещательных запросов и проверкой соответствия полученного ответа отправленному запросу.

Формат фрейма

Максимальный размер фрейма составляет 255 байт, общий размер технической полей фрейма - 10 байт. Таким образом, максимально возможный размер полезных данных возможен до 245 байт.

ПолеADDRESSFNLENPAYLOADIDCRC
ФорматBCD MSBUINT8UINT8BLOBUINT16UINT16
Размер4110...24522

Для многобайтовых полей по умолчанию (если не указано явно) используется прямой порядок байт (LSB). Поля FLOAT32 и FLOAT64 являются числами IEEE.754 одинарной и двойной точности соответственно.

Описание полей:

  • ADDRESS - адрес конечного устройства. Значение 0x00000000 является широковещательным адресом и указывается только в запросе. Ответ на широковещательный запрос будет содержать конкретный адрес конечного устройства.
  • FN - функция (код запроса). Значение 0x00 зарезервировано под ответ с кодом ошибки.
  • LEN - общая длина фрейма в байтах (включая сам байт длины). Допустимы значения от 10 до 255.
  • PAYLOAD - полезные данные. Содержимое зависит от указанного кода запроса.
  • ID - идентификатор запроса. Псевдослучайное число, генерируемое мастером при формировании запроса. Конечное устройство должно ответить тем же значением.
  • CRC - контрольная сумма фрейма. При формировании фрейма считается от всех данных, исключая само поле контрольной суммы.

Параметры и расчет контрольной суммы

Характеристики:

  • Стандарт: CRC-26-IBM.
  • Полином: 0xA001.
  • Начальное значение: 0xFFFF.
  • Начинать с: LSB.
  • XOR в конце: нет.
Пример кода на языке C89
#include <stddef.h>
#include <stdint.h>

uint16_t crc(void const *data, size_t size)
{
	uint8_t i;
	uint16_t result = 0xFFFF;
	uint8_t const *buf = (uint8_t const *)data;
	
	while (size--)
	{
		result ^= *buf++;
		for (i = 0; i < 8; i++)
		result = (result & 1) ? (result >> 1) ^ 0xA001 : result >> 1;
	}
	
	return result;
}

При валидации входящего фрейма удобно считать контрольную сумму от всех байт, включая само поле контрольной суммы. В случае верного значения контрольной суммы результат вычислений должен быть равен 0x0000.

Алгоритм валидации входящего фрейма для конечного устройства

Ниже представлена блок-схема алгоритма валидации:

Алгоритм валидации входящего фрейма для мастера

Ниже представлена блок-схема алгоритма валидации:


  • No labels