原创 CRC-4校验

2008-9-25 13:22 4678 2 2 分类: MCU/ 嵌入式

; CRC-4生成程序
; g(x) = x4 + x + 1
;
dataBuffer  EQU      0x20
           
            org      0x000
Start:
            mov      SP, #0x50
;
            mov      dataBuffer,      0x08    
            mov      dataBuffer + 1,0x20        
            mov      dataBuffer + 2,0x08
            mov      dataBuffer + 3,0x09
            mov      dataBuffer + 4,0x23
            mov      dataBuffer + 5,0x12      
            mov      dataBuffer + 6,0x34
            mov      dataBuffer + 7,0x50     ; 注意:最后字节的低4位保留给CRC


            mov      R1,#dataBuffer             ; 数据首地址
            mov      R5,#0x08                     ; 数据字节数
            acall     CRCEngine
   
            sjmp     $
; *************************************************************************
; 功能:     计算4位CRC校验
; 入口参数: R1-数据首址, R5-数据字节数
; 出口参数: R7-CRC校验码
; *************************************************************************
CRCEngine:
            mov      R6,0x01


            mov      R4,0x06
            inc        R6
            mov      R0,0x04
            mov      A,@R0
            mov      R4,A                        ; 将首字节内容装入crc


            dec      R5                             ; 字节数减1


CRCEngine_1:
            mov      A,R5    
            jz          CRCEngine_2           ; 判定所有字节计算结束
                                
            mov      R3,0x06
            inc        R6
            mov      R0,0x03
            mov      A,@R0
            mov      R3,A                        ; 将缓冲内容装入移位buf 


            clr      A
            mov      R7,A


CRCEngine_1_1:
            clr      CY
            mov      A, R3
            rlc        A
            mov      R3, A                       ; buf左移
            mov      A,R4
            rlc         A                             ; CRC左移


CRCEngine_1_2:
            jnc      CRCEngine_1_3
            xrl      A,#0x30                     ; CY为1则与立即数0x30相异或


CRCEngine_1_3:
            mov      R4,A     


            inc       R7
            cjne     R7,#0x08, CRCEngine_1_1     ; 不够8位则继续
            dec      R5
            sjmp     CRCEngine_1


CRCEngine_2:
            clr         A
            mov      R7,A


CRCEngine_2_1:
            clr        CY
            mov      A, R4
            rlc         A
            jnc        CRCEngine_2_2
            xrl        A,#0x30                     ; CY为1则与立即数0x30相异或


CRCEngine_2_2:
            mov      R4,A


CRCEngine_2_3:
            inc       R7
            cjne     R7, #0x04, CRCEngine_2_1    ; 校验位添零,继续


            mov      A,R4
            swap     A
            anl        A,#0x0F
            mov      R7,A                    ; 返回CRC值
            ret


            END

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /4 下一条