下面是我参考的一个CRC生成子程序,有以下几点不太明白 1:生成多项式是什么?看起来像X15+X10+X3,生成多项式可以随意改吗?
2:为什么计算的过程中采用右移并检测C,只有C=1才和多项式异或? 3:程序开头 movf loca0,w addwf fsr,f clrf indf incf fsr,f clrf indf 的意义是把要发送的数据右移16位吗?
;===================================================================== ;crc生成子程序crcgenerator ;功能: 将一串二进制数据加上crc校验码 ;入口参数: ; fsr是待编码的数据首地址 ; loca0是待编码的数据的字节数(不包括crc) ;返回参数: ; loca1是crc低字节(先发送) ; loca2是crc高字节(后发送) ;==================================================================== crcgenerator: movf loca0,w addwf fsr,f clrf indf incf fsr,f clrf indf decf fsr,f movf loca0,w subwf fsr,f
bcf status,c rlf loca0,f rlf loca0,f rlf loca0,f ;数据区预留crc的位置并清零
movf indf, w ;loca1, loca2, loca3暂存连续的三个字节 movwf loca1 incf fsr, f movf indf, w movwf loca2 incf fsr, f movf indf, w movwf loca3 movlw 8 movwf loca4
crcloop1: rrf loca3, f rrf loca2, f rrf loca1, f btfss status, c ;检测c标志 goto crccont1 movlw 084h ;b'10000100' xorwf loca2, f movlw 08h ;b'00001000' xorwf loca1, f crccont1: decfsz loca4, f goto crccont2 movlw 8 movwf loca4 incf fsr, f movf indf, w movwf loca3 crccont2: decfsz loca0, f goto crcloop1
decf fsr, f ;调整fsr至正确值 decf fsr, f return |