计算法简单实现crc校验
前一段时间做协议转换器的时间用到CRC-16校验,查了不少资料发现都不理想。查表法要建表太麻烦,而计算法觉得那些例子太罗嗦。最后只好自己写了,最后发现原来挺简单嘛:)
两个子程序搞定。这里用的多项式为:
CRC-16 = X16 + X12 + X5 + X0 = 2^0+2^5+2^12+2^16=0x11021
因最高位一定为“1”,故略去计算只采用0x1021即可
CRC_Byte:计算单字节的CRC值
CRC_Data:计算一帧数据的CRC值
CRC_High CRC_Low:存放单字节CRC值
CRC16_High CRC16_Low:存放帧数据CRC值
;<>-------------------------------------------------------------
; Function: CRC one byte
; Input: CRCByte
; Output: CRC_High CRC_Low
;<>-------------------------------------------------------------
CRC_Byte:
clrf CRC_Low
clrf CRC_High
movlw 09H
movwf v_Loop1
movf CRCByte, w
movwf CRC_High
CRC:
decfsz v_Loop1 ;8次循环,每一位相应计算
goto CRC10
goto CRCend
CRC10
bcf STATUS, C
rlf CRC_Low
rlf CRC_High
btfss STATUS, C
goto CRC ;为0不需计算
movlw 10H ;若多项式改变,这里作相应变化
xorwf CRC_High, f
movlw 21H ;若多项式改变,这里作相应变化
xorwf CRC_Low, f
goto CRC
CRCend:
nop
nop
return
;<>-------------------------------------------------------------
; CRC one byte end
;<>-------------------------------------------------------------
;<>-------------------------------------------------------------
; Function: CRC date
; Input: BufStart(A,B,C)(一帧数据的起始地址) v_Count (要做CRC的字节数)
; Output: CRC16_High CRC16_Low(结果)
;<>-------------------------------------------------------------
CRC_Data:
clrf CRC16_High
clrf CRC16_Low
CRC_Data10
movf INDF, w
xorwf CRC16_High,w
movwf CRCByte
call CRC_Byte
incf FSR
decf v_Count ;需计算的字节数
movf CRC_High, w
xorwf CRC16_Low, w
movwf CRC16_High
movf CRC_Low, w
movwf CRC16_Low
movf v_Count, w ;计算结束?
btfss STATUS, Z
goto CRC_Data10
return
;<>-------------------------------------------------------------
; CRC date end
;<>-------------------------------------------------------------
本文关键字:暂无联系方式综合-其它,单片机-工控设备 - 综合-其它