打印

求助!!!CRC校验算法

[复制链接]
2316|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
beiwei23du|  楼主 | 2009-4-21 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CRC, ov, RF, fm, go

下面是我参考的一个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

相关帖子

沙发
beiwei23du|  楼主 | 2009-4-21 11:08 | 只看该作者

自己顶一下

使用特权

评论回复
板凳
red1986| | 2009-4-21 21:01 | 只看该作者

直接给你上代码了呵呵

/*******************************************************************/ 
/*  函 数 名 称:    BuildTable16 
  功 能 描 述:    创建CRC16所需要的Table 
  参 数 说 明:    aPoly[in]:创建表所需要的多项式 
                Table_CRC[in][out]:Table表的buff 
  返回值 说明:    void 
  更 新 日 期:    2003.12.19 
/*******************************************************************/ 
void BuildTable16( unsigned short aPoly , unsigned long* Table_CRC ) 

    unsigned short i, j; 
    unsigned short nData; 
    unsigned short nAccum; 
 
    for ( i = 0; i < 256; i++ ) 
    { 
        nData = ( unsigned short )( i << 8 ); 
        nAccum = 0; 
        for ( j = 0; j < 8; j++ ) 
        { 
            if ( ( nData ^ nAccum ) & 0x8000 ) 
                nAccum = ( nAccum << 1 ) ^ aPoly; 
            else 
                nAccum <<= 1; 
            nData <<= 1; 
        } 
        Table_CRC = ( unsigned long )nAccum; 
    } 

使用特权

评论回复
地板
hotpower| | 2009-4-21 23:11 | 只看该作者

x16+x12+x5+1 右移CRC16 权=0x8408

把左移的CRC16 1021  "倒着看"~~~

即D15是D0,D14是D1,....D1是D14,D0是D15~~~

详见下面的“权选择规则”~~~

可以选择右移CRC16,权选0x8408即可~~~

此表达式(权)左右移CRC16都取各自方的x16+x12+x5+1
即“正看”左移CRC16 权1021
  “反看”右移CRC16 权8408  而非8810~~~

使用特权

评论回复
5
beiwei23du|  楼主 | 2009-4-22 10:55 | 只看该作者

谢谢菜农,我现在似乎明白了一些....


  因为我传输数据是用的是645规约,低位数据在前,高位数据在后,那么相应的生成多项式应反转(低位与高位互换)。如CRC16-CCITT为0x1021,反转后为0x8408。
但是还有一点不明白 ox11021为啥简记为0x1021?最高一位为什么不参与运算?

使用特权

评论回复
6
hotpower| | 2009-4-22 12:57 | 只看该作者

这个很详细~~~

使用特权

评论回复
7
beiwei23du|  楼主 | 2009-4-22 17:22 | 只看该作者

参考 谢谢楼上

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

167

帖子

1

粉丝