- 24 -
УБЗ-302-01
NOVATEK-ELECTRO
Пример запроса и ответа приведён на рисунке 2.3.
Рисунок 2.3 - Пример запроса и ответа подфункции 00h - возврат данных запроса.
Подфункция 01h – рестарт опций связи.
Периферийный порт УБЗ должен быть инициализирован и вновь запущен.
Пример запроса и ответа приведён на рисунке 2.4.
Рисунок 2.4 - Пример запроса и ответа подфункции 01h - рестарт опций связи.
2.4.4.5
CRC
– код циклического контроля
Контрольная сумма (CRC16) представляет собой циклический проверочный код на основе
полинома A001h. Передающее устройство формирует контрольную сумму для всех байт
передаваемого сообщения. Принимающее устройство аналогичным образом формирует контрольную
сумму для всех байт принятого сообщения и сравнивает ее с контрольной суммой, принятой от
передающего устройства. При несовпадении сформированной и принятой контрольных сумм
генерируется сообщение об ошибке.
Поле контрольной суммы занимает два байта. Контрольная сумма в сообщении передается
младшим байтом вперед.
Контрольная сумма формируется по следующему алгоритму:
1) загрузка CRC регистра (16 бит) единицами (FFFFh);
2) исключающее ИЛИ с первыми 8 битами байта сообщения и содержимым CRC регистра;
3) сдвиг результата на один бит вправо;
4) если сдвигаемый бит = 1, исключающее ИЛИ содержимого регистра со значением A001h;
5) если сдвигаемый бит = 0, повторить шаг 3;
6) повторять шаги 3, 4, 5, пока не будут выполнены 8 сдвигов;
7) исключающее ИЛИ со следующими 8 битами байта сообщения и содержимым CRC регистра;
8) повторять шаги 3 – 7, пока все байты сообщения не будут обработаны;
9) конечное содержимое регистра будет содержать контрольную сумму.
Пример программы CRC генерации кода с использованием языка С
.
Функция берет два аргумента:
Unsigned char* data <- a pointer to the message buffer
Unsigned char length <- the quantity of bytes in the message buffer
The function returns the CRC value as a type of unsigned integer.
Unsigned int crc_chk(unsigned char* data, unsigned char length)
{int j;
unsigned int reg_crc=0xFFFF;
while(length--)
{
reg_crc ^= *data++;
for(j=0;j<8;j++)
{
if(reg_crc & 0
х01) reg_crc=(reg_crc>>1) ^ 0xA001; // LSB(b0)=1
else reg_crc=reg_crc>>1;
}