Also: Non PIC specific CRC@
See also:
Archive:
Comments:
I've made PICC18 specific highly optimised routine for CRC16 CCITT calculation. It takes 16 cycles per byte for CRC calculation plus 7 cycles for data fetching from array.uint16 Crc16 (uint8* ptr, uint8 len) { uint8 data, i; union { uint8 Byte[2]; uint16 Word; } CRC16; CRC16.Word = 0xFFFF; for(i=0; i<=len; i++) { data = ptr[i] ^ CRC16.Byte[0]; data ^= data << 4; data * 8; CRC16.Byte[0] = CRC16.Byte[1] ^ (data >> 4) ^ PRODL; CRC16.Byte[1] = data ^ PRODH; } return CRC16.Word; }
See:
Code:
IEEE 802.3 (32-bit CRC) functions: "init", "addbyte" and "invert" data: 1K for crctable CBLOCK 0x000 crc32:4 ENDC crc_hi EQU crc32+0 crc_mh EQU crc32+1 crc_ml EQU crc32+2 crc_lo EQU crc32+3 CrcTable equ 0xXXXXXX crcaddbyte: movwf temp xorwf crc_lo,w mullw 0x04 movff PRODH, TBLPTRH movff PRODL, TBLPTRL movlw (CrcTable>>8)&0xff addwf TBLPTRH movlw CrcTable&0xff addwf TBLPTRL btfsc STATUS, C incf TBLPTRH tblrd*+ movf TABLAT,W xorwf crc_ml,W movwf crc_lo tblrd*+ movf TABLAT,W xorwf crc_mh,W movwf crc_ml tblrd*+ movf TABLAT,W xorwf crc_hi,W movwf crc_mh tblrd*+ movf TABLAT,W xorlw 0x00 movwf crc_hi return crc_init movlw 0xff movwf crc_lo movwf crc_ml movwf crc_mh movwf crc_hi return crc_invert comf crc_lo,f comf crc_ml,f comf crc_mh,f comf crc_hi,f return org CrcTable db 0x00,0x00,0x00,0x00, 0x96,0x30,0x07,0x77, 0x2C,0x61,0x0E,0xEE, 0xBA,0x51,0x09,0x99 db 0x19,0xC4,0x6D,0x07, 0x8F,0xF4,0x6A,0x70, 0x35,0xA5,0x63,0xE9, 0xA3,0x95,0x64,0x9E db 0x32,0x88,0xDB,0x0E, 0xA4,0xB8,0xDC,0x79, 0x1E,0xE9,0xD5,0xE0, 0x88,0xD9,0xD2,0x97 db 0x2B,0x4C,0xB6,0x09, 0xBD,0x7C,0xB1,0x7E, 0x07,0x2D,0xB8,0xE7, 0x91,0x1D,0xBF,0x90 db 0x64,0x10,0xB7,0x1D, 0xF2,0x20,0xB0,0x6A, 0x48,0x71,0xB9,0xF3, 0xDE,0x41,0xBE,0x84 db 0x7D,0xD4,0xDA,0x1A, 0xEB,0xE4,0xDD,0x6D, 0x51,0xB5,0xD4,0xF4, 0xC7,0x85,0xD3,0x83 db 0x56,0x98,0x6C,0x13, 0xC0,0xA8,0x6B,0x64, 0x7A,0xF9,0x62,0xFD, 0xEC,0xC9,0x65,0x8A db 0x4F,0x5C,0x01,0x14, 0xD9,0x6C,0x06,0x63, 0x63,0x3D,0x0F,0xFA, 0xF5,0x0D,0x08,0x8D db 0xC8,0x20,0x6E,0x3B, 0x5E,0x10,0x69,0x4C, 0xE4,0x41,0x60,0xD5, 0x72,0x71,0x67,0xA2 db 0xD1,0xE4,0x03,0x3C, 0x47,0xD4,0x04,0x4B, 0xFD,0x85,0x0D,0xD2, 0x6B,0xB5,0x0A,0xA5 db 0xFA,0xA8,0xB5,0x35, 0x6C,0x98,0xB2,0x42, 0xD6,0xC9,0xBB,0xDB, 0x40,0xF9,0xBC,0xAC db 0xE3,0x6C,0xD8,0x32, 0x75,0x5C,0xDF,0x45, 0xCF,0x0D,0xD6,0xDC, 0x59,0x3D,0xD1,0xAB db 0xAC,0x30,0xD9,0x26, 0x3A,0x00,0xDE,0x51, 0x80,0x51,0xD7,0xC8, 0x16,0x61,0xD0,0xBF db 0xB5,0xF4,0xB4,0x21, 0x23,0xC4,0xB3,0x56, 0x99,0x95,0xBA,0xCF, 0x0F,0xA5,0xBD,0xB8 db 0x9E,0xB8,0x02,0x28, 0x08,0x88,0x05,0x5F, 0xB2,0xD9,0x0C,0xC6, 0x24,0xE9,0x0B,0xB1 db 0x87,0x7C,0x6F,0x2F, 0x11,0x4C,0x68,0x58, 0xAB,0x1D,0x61,0xC1, 0x3D,0x2D,0x66,0xB6 db 0x90,0x41,0xDC,0x76, 0x06,0x71,0xDB,0x01, 0xBC,0x20,0xD2,0x98, 0x2A,0x10,0xD5,0xEF db 0x89,0x85,0xB1,0x71, 0x1F,0xB5,0xB6,0x06, 0xA5,0xE4,0xBF,0x9F, 0x33,0xD4,0xB8,0xE8 db 0xA2,0xC9,0x07,0x78, 0x34,0xF9,0x00,0x0F, 0x8E,0xA8,0x09,0x96, 0x18,0x98,0x0E,0xE1 db 0xBB,0x0D,0x6A,0x7F, 0x2D,0x3D,0x6D,0x08, 0x97,0x6C,0x64,0x91, 0x01,0x5C,0x63,0xE6 db 0xF4,0x51,0x6B,0x6B, 0x62,0x61,0x6C,0x1C, 0xD8,0x30,0x65,0x85, 0x4E,0x00,0x62,0xF2 db 0xED,0x95,0x06,0x6C, 0x7B,0xA5,0x01,0x1B, 0xC1,0xF4,0x08,0x82, 0x57,0xC4,0x0F,0xF5 db 0xC6,0xD9,0xB0,0x65, 0x50,0xE9,0xB7,0x12, 0xEA,0xB8,0xBE,0x8B, 0x7C,0x88,0xB9,0xFC db 0xDF,0x1D,0xDD,0x62, 0x49,0x2D,0xDA,0x15, 0xF3,0x7C,0xD3,0x8C, 0x65,0x4C,0xD4,0xFB db 0x58,0x61,0xB2,0x4D, 0xCE,0x51,0xB5,0x3A, 0x74,0x00,0xBC,0xA3, 0xE2,0x30,0xBB,0xD4 db 0x41,0xA5,0xDF,0x4A, 0xD7,0x95,0xD8,0x3D, 0x6D,0xC4,0xD1,0xA4, 0xFB,0xF4,0xD6,0xD3 db 0x6A,0xE9,0x69,0x43, 0xFC,0xD9,0x6E,0x34, 0x46,0x88,0x67,0xAD, 0xD0,0xB8,0x60,0xDA db 0x73,0x2D,0x04,0x44, 0xE5,0x1D,0x03,0x33, 0x5F,0x4C,0x0A,0xAA, 0xC9,0x7C,0x0D,0xDD db 0x3C,0x71,0x05,0x50, 0xAA,0x41,0x02,0x27, 0x10,0x10,0x0B,0xBE, 0x86,0x20,0x0C,0xC9 db 0x25,0xB5,0x68,0x57, 0xB3,0x85,0x6F,0x20, 0x09,0xD4,0x66,0xB9, 0x9F,0xE4,0x61,0xCE db 0x0E,0xF9,0xDE,0x5E, 0x98,0xC9,0xD9,0x29, 0x22,0x98,0xD0,0xB0, 0xB4,0xA8,0xD7,0xC7 db 0x17,0x3D,0xB3,0x59, 0x81,0x0D,0xB4,0x2E, 0x3B,0x5C,0xBD,0xB7, 0xAD,0x6C,0xBA,0xC0 db 0x20,0x83,0xB8,0xED, 0xB6,0xB3,0xBF,0x9A, 0x0C,0xE2,0xB6,0x03, 0x9A,0xD2,0xB1,0x74 db 0x39,0x47,0xD5,0xEA, 0xAF,0x77,0xD2,0x9D, 0x15,0x26,0xDB,0x04, 0x83,0x16,0xDC,0x73 db 0x12,0x0B,0x63,0xE3, 0x84,0x3B,0x64,0x94, 0x3E,0x6A,0x6D,0x0D, 0xA8,0x5A,0x6A,0x7A db 0x0B,0xCF,0x0E,0xE4, 0x9D,0xFF,0x09,0x93, 0x27,0xAE,0x00,0x0A, 0xB1,0x9E,0x07,0x7D db 0x44,0x93,0x0F,0xF0, 0xD2,0xA3,0x08,0x87, 0x68,0xF2,0x01,0x1E, 0xFE,0xC2,0x06,0x69 db 0x5D,0x57,0x62,0xF7, 0xCB,0x67,0x65,0x80, 0x71,0x36,0x6C,0x19, 0xE7,0x06,0x6B,0x6E db 0x76,0x1B,0xD4,0xFE, 0xE0,0x2B,0xD3,0x89, 0x5A,0x7A,0xDA,0x10, 0xCC,0x4A,0xDD,0x67 db 0x6F,0xDF,0xB9,0xF9, 0xF9,0xEF,0xBE,0x8E, 0x43,0xBE,0xB7,0x17, 0xD5,0x8E,0xB0,0x60 db 0xE8,0xA3,0xD6,0xD6, 0x7E,0x93,0xD1,0xA1, 0xC4,0xC2,0xD8,0x38, 0x52,0xF2,0xDF,0x4F db 0xF1,0x67,0xBB,0xD1, 0x67,0x57,0xBC,0xA6, 0xDD,0x06,0xB5,0x3F, 0x4B,0x36,0xB2,0x48 db 0xDA,0x2B,0x0D,0xD8, 0x4C,0x1B,0x0A,0xAF, 0xF6,0x4A,0x03,0x36, 0x60,0x7A,0x04,0x41 db 0xC3,0xEF,0x60,0xDF, 0x55,0xDF,0x67,0xA8, 0xEF,0x8E,0x6E,0x31, 0x79,0xBE,0x69,0x46 db 0x8C,0xB3,0x61,0xCB, 0x1A,0x83,0x66,0xBC, 0xA0,0xD2,0x6F,0x25, 0x36,0xE2,0x68,0x52 db 0x95,0x77,0x0C,0xCC, 0x03,0x47,0x0B,0xBB, 0xB9,0x16,0x02,0x22, 0x2F,0x26,0x05,0x55 db 0xBE,0x3B,0xBA,0xC5, 0x28,0x0B,0xBD,0xB2, 0x92,0x5A,0xB4,0x2B, 0x04,0x6A,0xB3,0x5C db 0xA7,0xFF,0xD7,0xC2, 0x31,0xCF,0xD0,0xB5, 0x8B,0x9E,0xD9,0x2C, 0x1D,0xAE,0xDE,0x5B db 0xB0,0xC2,0x64,0x9B, 0x26,0xF2,0x63,0xEC, 0x9C,0xA3,0x6A,0x75, 0x0A,0x93,0x6D,0x02 db 0xA9,0x06,0x09,0x9C, 0x3F,0x36,0x0E,0xEB, 0x85,0x67,0x07,0x72, 0x13,0x57,0x00,0x05 db 0x82,0x4A,0xBF,0x95, 0x14,0x7A,0xB8,0xE2, 0xAE,0x2B,0xB1,0x7B, 0x38,0x1B,0xB6,0x0C db 0x9B,0x8E,0xD2,0x92, 0x0D,0xBE,0xD5,0xE5, 0xB7,0xEF,0xDC,0x7C, 0x21,0xDF,0xDB,0x0B db 0xD4,0xD2,0xD3,0x86, 0x42,0xE2,0xD4,0xF1, 0xF8,0xB3,0xDD,0x68, 0x6E,0x83,0xDA,0x1F db 0xCD,0x16,0xBE,0x81, 0x5B,0x26,0xB9,0xF6, 0xE1,0x77,0xB0,0x6F, 0x77,0x47,0xB7,0x18 db 0xE6,0x5A,0x08,0x88, 0x70,0x6A,0x0F,0xFF, 0xCA,0x3B,0x06,0x66, 0x5C,0x0B,0x01,0x11 db 0xFF,0x9E,0x65,0x8F, 0x69,0xAE,0x62,0xF8, 0xD3,0xFF,0x6B,0x61, 0x45,0xCF,0x6C,0x16 db 0x78,0xE2,0x0A,0xA0, 0xEE,0xD2,0x0D,0xD7, 0x54,0x83,0x04,0x4E, 0xC2,0xB3,0x03,0x39 db 0x61,0x26,0x67,0xA7, 0xF7,0x16,0x60,0xD0, 0x4D,0x47,0x69,0x49, 0xDB,0x77,0x6E,0x3E db 0x4A,0x6A,0xD1,0xAE, 0xDC,0x5A,0xD6,0xD9, 0x66,0x0B,0xDF,0x40, 0xF0,0x3B,0xD8,0x37 db 0x53,0xAE,0xBC,0xA9, 0xC5,0x9E,0xBB,0xDE, 0x7F,0xCF,0xB2,0x47, 0xE9,0xFF,0xB5,0x30 db 0x1C,0xF2,0xBD,0xBD, 0x8A,0xC2,0xBA,0xCA, 0x30,0x93,0xB3,0x53, 0xA6,0xA3,0xB4,0x24 db 0x05,0x36,0xD0,0xBA, 0x93,0x06,0xD7,0xCD, 0x29,0x57,0xDE,0x54, 0xBF,0x67,0xD9,0x23 db 0x2E,0x7A,0x66,0xB3, 0xB8,0x4A,0x61,0xC4, 0x02,0x1B,0x68,0x5D, 0x94,0x2B,0x6F,0x2A db 0x37,0xBE,0x0B,0xB4, 0xA1,0x8E,0x0C,0xC3, 0x1B,0xDF,0x05,0x5A, 0x8D,0xEF,0x02,0x2D
;============================================================================ ; ; CRC-16 (x^16+x^15+x^2+x^0) ; Loop Driven CRC Routine ; ; Input: W = Data byte for CRC calculation ; crc_hi:crc_lo 16 bit CRC register ; ; Output: crc_hi:crc_lo updated. ; ; Code written by David Salgado (C) 2005 ;============================================================================ CRC16 ; Save W in crc_buffer BANKSEL crc_buffer movwf crc_buffer ; Start bit counter movlw H'08' movwf bit_count crc16_loop ; Process CRC-16 for single input bit movf crc_lo, W xorwf crc_buffer, W andlw H'01' bcf crc_buffer, 0 iorwf crc_buffer, F clrc rrf crc_buffer, F skpnc call crc16_complement call crc16_rotate ; Decrement the bit counter decfsz bit_count, F goto crc16_loop return crc16_complement ; Complement some bits in CRC Registers movlw B'00000010' xorwf crc_lo, F movlw B'01000000' xorwf crc_hi, F return crc16_rotate ; Rotate the CRC Register bits rrf crc_hi, F rrf crc_lo, F return