Показаны сообщения с ярлыком CAN. Показать все сообщения
Показаны сообщения с ярлыком CAN. Показать все сообщения

пятница, 27 мая 2022 г.

CRC-15/CAN

Решил закрепить навык синтеза алгоритмов CRC с числом бит не кратным 8. Вот что получилось для CRC-15/CAN.
CRC-15/CAN
width=15 poly=0x4599 init=0x0000 refin=false refout=false xorout=0x0000 check=0x059e name="CRC-15"
Таблицы и коды при вычислении выравниваются по старшему биту.
// Табличный алгоритм CRC-15 для таблиц 16 значений
CRC16	CRC15_update(CRC16 crc, uint8_t val){
	crc<<=1;
	crc^= (val<<8);
	crc = (crc << 4) ^ CRC15_Lookup[(crc>>12) & 0xF];
	crc = (crc << 4) ^ CRC15_Lookup[(crc>>12) & 0xF];
	return (crc>>1);
}
// Табличный алгоритм CRC-15 для таблиц 256 значений
CRC16	CRC15_update(CRC16 crc, uint8_t val){
	crc<<=1;
	crc^= (val<<8);
	crc = (crc << 8) ^ CRC15_Lookup[crc>>8];
	return (crc>>1);
}

static const uint16_t CRC15_Lookup[] = {
0x0000, 0x8B32, 0x9D56, 0x1664, 
0xB19E, 0x3AAC, 0x2CC8, 0xA7FA,
0xE80E, 0x633C, 0x7558, 0xFE6A, 
0x5990, 0xD2A2, 0xC4C6, 0x4FF4,
. . .
};