原创 单总线数据发送“零耗时CRC检测”算法的软件实现

2007-4-13 23:25 5323 6 6 分类: MCU/ 嵌入式

文章编号:1144----加入日期:2004-2-12


『关闭窗口』


单总线数据发送“零耗时CRC检测”算法的软件实现(灌水作)(hotpower)



hotpower 发表于 11/25/2003 2:23:22 PM 侃单片机 ←返回版面    

;单总线数据发送“零耗时CRC检测”算法的软件实现(灌水作)
;------------------------------------------------------------------
;看“刀客”如何将HotPower“斩立决”的程度,再决定是否发
;单总线数据接收“零耗时CRC检测”算法的软件实现(灌水作)
;当然,“死人”是不会发言的,更不可能灌水了。
;让HotPower的文章中,不出现“漏水”现象是不可能的,也是万万不能的。
;不搞笑的论坛——永远是“死水一潭”。。。。。。。。。。。。。。。。
;否则,HotPower“到此一游”不就变成“悼词一忧”了吗???
;“笑比哭好”,“刀客收剑”才能“立地成佛”呀。。。
;------------------------------------------------------------------
BBCOUT  BIT INT0;发送数据管脚定义
BBCIN   BIT INT1;接收数据管脚定义
;-------单总线1字节数据发送子程序-------------------------------
BBCOUTPROC:
;--------------------------------------------------------------
;算法:  动态右移CRC8算法(经典是静态CRC8,非典是动态CRC8)
;本算法的最大优点是在发送期间,实时进行CRC运算。(“零耗时”)
;不会出现“作弊”现象,主从设备都是同时收到CRC运算结果!!!
;通讯速率可达16.3KBPS到32KBPS(51主频为11.0592MHz时)
;本算法与经典的CRC算法最大的不同点:
;经典CRC8是以字节为单位的,而非典的CRC8则是以位为单位的。
;参见HotPower在EMC的主题“群魔乱舞的CRC...”
;--------------------------------------------------------------
;入口:
;       CRC0  主设备发送实时CRC码
;       CRC1  主设备发送线路CRC码
;       ACC   发送数据
;出口:
;       ACC=0 一字节数据发送成功
;--------------------------------------------------------------
        MOV   R2,#08H;每次发送8位
BBCOUTPROC_LOOP:
;-------主设备发送同步脉冲---------------------------------
        CLR   BBCOUT;发送同步脉冲(低电平)
;----------------------------------------------------------        
        RRC   A;取发送数据位DX
;-------BBC总线为双向电路,自发自收,用于总线测试------------
        JB    BBCIN,$;等待收到同步脉冲
;-------主设备发送1位数据----------------------------------
        MOV   BBCOUT,C;发送数据位DX
;-------“零耗时”CRC运算----------------------------------
        MOV   R7,A;暂存移位后的数据
        RLC   A;还原移位前的数据
        XRL   A,CRC0;比较移位前数据和实时CRC码的最低位
        RRC   A;得到比较结果位CY
        MOV   A,CRC0;取实时CRC码
        JNC   BBCOUTPROC_NEXT0;比较结果位相同,不取反
;-------8位右移CRC“权”X^8+X^5+X^4+1-----------------------        
        XRL   A,#18H;取反ACC4,ACC3
BBCOUTPROC_NEXT0:
        RRC   A;8位右移CRC算法,ACC右移一位
        MOV   CRC0,A;得到本次的实时CRC码
        MOV   A,B;取回收数据
;-------释放总线,“零耗时”CRC运算刚好结束------------------
        SETB  BBCOUT;由于本系统传输时延较大,故将此句提前
;-------主设备也在45uS处(左右)采样数据-----------------------        
;目的是检测线路上传输的CRC是否正确,模拟从设备接收的CRC结果
;由于系统约定的主从设备的收发硬件电路相同,当总线有人“捣乱”
;时,主设备的“刀客”立即就会发现,“爱国者导弹”就可立即升空
;拦截,以保证通讯线路的“畅通无阻”,“教主万寿无疆”。。。
;这样,主从设备都可同时发现目标,不需应答就可“先斩后奏”
;哈哈,“生命诚可贵,灌水价更高。”
;“砍头不要紧,只要主义真。杀了我一个,自有后来人”!
;------------------------------------------------------------
        MOV   C,BBCIN;回收的线路输出的数据
;-------计算主设备输出的CRC----------------------------------
        RRC   A
        MOV   B,A;保存回收数据(为何不将HotPower放入回收站)
        RL    A;还原移位前的数据,但不破坏CY
        XRL   A,CRC1;比较移位前回收数据和线路CRC码的最低位
        RRC   A
        MOV   A,CRC1
        JNC   BBCOUTPROC_NEXT1;比较结果位相同,不取反
;-------8位右移CRC“权”X^8+X^5+X^4+1-----------------------        
        XRL   A,#18H;取反ACC4,ACC3
BBCOUTPROC_NEXT1:
        RRC   A
        MOV   CRC1,A;保存
;-------“零耗时”CRC运算结束---------------------------------
;所谓“零耗时”,并非不耗时。
;主要是在“刀客”行刑前,再为人民做些好事,不想“虚度光阴”
        MOV   A,R7;恢复移位后的数据
;-------传输时延较小时,释放总线命令可放与此处----------------        
;       SETB  BBCOUT;由于本系统传输时延较大,故将此句提前
;-------------------------------------------------------------        
        JNB   BBCIN,$;等待释放总线
        DJNZ  R2,BBCOUTPROC_LOOP;8位数据未发完,继续
;-------检测主设备发送数据是否正常----------------------------        
;“刀客”在此判断,若CRC0<>CRC1,可以“斩立决”,毫不留情
;在此下手,HotPower心服口服。绝不说半个“不”字!!!
;在此封帖,“群魔乱舞单总线”就会开出“鲜花”来。
        MOV   A,CRC0
        XRL   A,CRC1
        RET;退出子程序,HotPower要下线了,拜拜了您啦,哈哈

;本文纯属搞笑,有得罪之处,请见谅。

文章评论0条评论)

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