|
用PIC单片机和Dallas的iButtON通讯时,编了段产生和校验CRC的子程序。
#include
;-------------------------------
cblock??? 0x20
datBuff:8??????????? ;assign 8 byte data buffer
bit_cnt??????????????? ;bit counting
CRC_COUNT??????????? ;number of bytes for CRC
CRC_RESULT??????????? ;CRC resulr
crc_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 CRC
CRC_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
欲知详情,请登录维库电子市场网(www.dzsc.com)
|
|