Last active
December 14, 2015 08:48
-
-
Save skinofstars/5060017 to your computer and use it in GitHub Desktop.
WiRC CRC table
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // example body | |
| var buf = new Buffer(9); | |
| // start of frame | |
| buf[0] = '0xAA'; | |
| buf[1] = '0xBB'; | |
| // message to send - crc is based on this | |
| var msg = ['0x01', '0x03', '0x00', '0x00', '0x01']; | |
| // expected crc result | |
| var crc = ['0x21','0xAC']; | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ** Internal function to calculate CRC for a message | |
| * | |
| * @param p_sp_msg the message the CRC shall be calculated for | |
| * @return the calculated CRC16 value | |
| * | |
| * The function calculates CRC-CCITT from the following fields of the message: | |
| * - command code | |
| * - length | |
| * - message body | |
| */ | |
| static uint16_t l_calc_msg_crc_f(const msg_s_message_t* p_sp_msg) | |
| { | |
| uint16_t u16_crc = 0u; | |
| uint8_t u8_index; | |
| uint8_t u8_length; | |
| /* add command code to CRC */ | |
| u16_crc = l_crc_ccitt_f(u16_crc, p_sp_msg->u8_cmd); | |
| /* add length to CRC */ | |
| u16_crc = l_crc_ccitt_f(u16_crc, p_sp_msg->u8_len); | |
| /* add message body to the calculation */ | |
| for(u8_index = 0u, u8_length = p_sp_msg->u8_len; | |
| u8_index < u8_length; ++u8_index) { | |
| u16_crc = l_crc_ccitt_f(u16_crc, p_sp_msg->au8_body[u8_index]); | |
| } | |
| return u16_crc; | |
| } | |
| /** Internal function to calculate CRC-CCIT value | |
| * | |
| * @param p_u16_init initial value of the CRC calculator | |
| * @param p_u8_byte new byte shall be added to the CRC calculation | |
| * @return calculated CRC value | |
| * | |
| * The function implements CRC-CCITT calculation: | |
| * The CRC polynomial: X^16 + X^12 + X^5 + 1 | |
| */ | |
| static inline uint16_t l_crc_ccitt_f(uint16_t p_u16_init, uint8_t p_u8_byte) | |
| { | |
| static const uint16_t l_au16_ccitt_crc16_table_c[256] = { | |
| 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, | |
| 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, | |
| 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, | |
| 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, | |
| 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, | |
| 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, | |
| 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, | |
| 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, | |
| 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, | |
| 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, | |
| 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, | |
| 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, | |
| 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, | |
| 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, | |
| 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, | |
| 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, | |
| 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, | |
| 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, | |
| 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, | |
| 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, | |
| 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, | |
| 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, | |
| 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, | |
| 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, | |
| 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, | |
| 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, | |
| 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, | |
| 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, | |
| 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, | |
| 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, | |
| 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, | |
| 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 | |
| }; | |
| uint16_t u16_crc; | |
| uint8_t u8_idx; | |
| u8_idx = (p_u16_init >> 8) ^ p_u8_byte; | |
| u16_crc = l_au16_ccitt_crc16_table_c[u8_idx] ^ (p_u16_init << 8); | |
| return u16_crc; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment