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