|
PIC单片机实现CRC的小程序PIC单片机实现Dallas的iButton通讯时,编了段产生和校验CRC的子程序。IC单片机 www.pic16.com #include ;------------------------------- cblock 0x20datBuff:8 ;assign 8 byte data bufferbit_cnt ;bit counting CRC_COUNT ;number of bytes for CRCCRC_RESULT ;CRC resulrcrc_temp ;temporary data buffer during CRC endc;-------------------------------#define skp0 btfsc#define skp1 btfss;=============================== org 0x000 movlw .7 movwf CRC_COUNT movlw datBuff movwf FSR ;FSR point to data buffer call CRC_CHECK movwf datBuff+7 goto $;===============================;CHECK THE CRC FOR ? BYTES DATA;For the polynomial of X^8 + X^5 + X^4 + 1;Derived from Dallas's iButton standard;Before calling, FSR = data buffer; CRC_COUNT = number of bytes for CRCCRC_CHECK ;""""""""""""""" clrf CRC_RESULT ;initialize the CRC buffer_crc_00 movlw .8 ;number of bits for one byte movwf bit_cnt ;set bit counter movf INDF,w ;get one data byte movwf crc_temp ;copy to temporary location_crc_01 rrf crc_temp,f ;get LSB in C skpc ;is this LSB=1? goto _crc_02 ;go if LSB=0 movlw 0x01 ;do if LSB=1 xorwf CRC_RESULT,f_crc_02 rrf CRC_RESULT,w ;get LSB of CRC skpc ;test LSB goto _crc_03 ;go if LSB=0 movlw 0x18 ;do if LSB=1 xorwf CRC_RESULT,f ;polynomial implementation_crc_03 rrf CRC_RESULT,w ;whole byte right rotate rrf CRC_RESULT,f decfsz bit_cnt,f ;bit counting goto _crc_01 ;go on until aa 8 bits done incf FSR,f ;pointer update to next byte decfsz CRC_COUNT,f ;byte counting goto _crc_00 ;go on until all byte done movf CRC_RESULT,w ;get CRC, Z set if CRC=0 return ;return with CRC in W END
|
|