简单软件实现1-Wire温度器件的硬件CRC校验和串行码流的

简单软件实现1-wire温度器件的硬件crc校验和串行码流的误码检测
所有1-wire温度器件均包含一个唯一的识别码,保存在只读存储器(rom)内,该识别码在1-wire总线中用作唯一的网络地址。另外,部分温度器件的暂存器还有一个crc (循环冗余校验)字节用于1-wire通信验证。本应用笔记以及附带的程序提供了一种简单途径,验证1-wire器件之间通信的正确性,并检测串行数据流的误码。这种方法能够在每个器件中通过软件计算dow (dallas单线) crc,并与器件的硬件crc值进行对比。本文将以ds1822经济型1-wire数字温度计为例进行说明。
crc算法 crc (循环冗余校验)是串行数据流中检测误码最有效的方法,crc校验能够使用户确保温度检测器件之间的数据传输正确,该方法对硬件需求最小。dow (dallas单线) crc用于maxim的1-wire温度检测产品,例如:ds1821、ds1822和ds18b20。dow crc可以利用下列多项式表示:
多项式 = x8 + x5 + x4 + 1 详细的crc算法,请参考应用笔记27:“理解和运用maxim ibutton®产品中的循环冗余校验(crc)”。
从以下硬件电路的功能可以很容易理解crc,通常表示为带反馈的移位寄存器,图1给出了ds1822的硬件电路框图。
图1. crc硬件模型
rom码crc 每个ds1822都在其rom中保存了一个唯一的8字节识别码,该rom码的最低有效字节为ds1822的1-wire家族码:22h。随后6个字节是唯一的序列号,最高有效字节为crc字节,由rom码的前面7个字节计算得到。
暂存器crc ds1822暂存器的前8个字节为高温、低温门限以及配置寄存器。这些字节还包括ds1822读取的温度值和保留备用的寄存器。第9个字节是由前8个字节计算得到的crc值。
用于暂存器和rom的crc字节的计算方法相同,请参考应用笔记27。图1中的移位寄存器的初始条件为每位数值均为零。lsb首先移入寄存器,当所有位均移入寄存器后,其结果即为特定数据的crc值。总之,rom码需要移入56位(7字节)数据,暂存器需要移入64位(8字节)数据。
硬件crc校验 ds1822具有crc硬件电路,可以为rom码或暂存器提供crc计算,该值将传送到1-wire总线。接收到的数据可能被通信接口破坏,利用软件计算的crc可以检验接收到的数据包(rom码为8字节,暂存器为9字节)是否正确。
可使用microsoft® excel表格(采用microsoft excel 2003)计算ds1822的crc值,图2给出了一个屏幕截图示例。
图2. excel crc计算器屏幕截图示例
用户输入rom码的最后7个字节或暂存器的前8个字节后,按下“calculate crc”按钮,即可得到对应的crc值,这些数值可以用来与硬件给出的结果进行比较。
用于开发该excel电子表的vba程序如下。
private sub romcrc_click() dim inhex, outbinstr as string dim outbinarr(1 to 56) as integer dim outdec, i, crc(1 to 8), crctemp as integer inhex = range(rombyte1).value & range(rombyte2).value & range(rombyte3).value & range(rombyte4).value & range(rombyte5).value & range(rombyte6).value & range(rombyte7).value outbinstr = hextobin(inhex) ' convert string to array, lsb = outbinarr(1) for i = 1 to 56 outbinarr(57 - i) = mid$(outbinstr, i, 1) ' split(outbinstr) next i 'initialize crc for i = 1 to 8 crc(i) = 0 next i 'calculate crc for i = 1 to 56 crctemp = crc(1) xor outbinarr(i) crc(1) = crc(2) crc(2) = crc(3) crc(3) = crc(4) xor crctemp crc(4) = crc(5) xor crctemp crc(5) = crc(6) crc(6) = crc(7) crc(7) = crc(8) crc(8) = crctemp next i deccrc = bintodec(crc) range(romcrcvalue).value = deccrc end sub private sub scratchcrc_click() dim inhex, outbinstr as string dim outbinarr(1 to 64) as integer dim outdec, i, crc(1 to 8), crctemp as integer inhex = range(hexbyte1).value & range(hexbyte2).value & range(hexbyte3).value & range(hexbyte4).value & range(hexbyte5).value & range(hexbyte6).value & range(hexbyte7).value & range(hexbyte8).value outbinstr = hextobin(inhex) ' convert string to array, lsb = outbinarr(1) for i = 1 to 64 outbinarr(65 - i) = mid$(outbinstr, i, 1) ' split(outbinstr) next i 'initialize crc for i = 1 to 8 crc(i) = 0 next i 'calculate crc for i = 1 to 64 crctemp = crc(1) xor outbinarr(i) crc(1) = crc(2) crc(2) = crc(3) crc(3) = crc(4) xor crctemp crc(4) = crc(5) xor crctemp crc(5) = crc(6) crc(6) = crc(7) crc(7) = crc(8) crc(8) = crctemp next i deccrc = bintodec(crc) range(deccrcvalue).value = deccrc end sub private function hextobin(hstr) 'convert hex string to binary string cnvarr = array(0000, 0001, 0010, 0011, _ 0100, 0101, 0110, 0111, 1000, _ 1001, 1010, 1011, 1100, 1101, _ 1110, 1111) bstr = for i = 1 to len(hstr) hdgt = mid(hstr, i, 1) cix = cint(&h & hdgt) bstr = bstr & cnvarr(cix) next hextobin = bstr end function function bintodec(bstr) 'convert 8 bit binary number to decimal dim j, out as integer out = 0 for j = 1 to 8 out = out + bstr(j) * 2 ^ (j - 1) next j bintodec = out end function 结论 计算crc可以很容易地保证1-wire器件之间的通信正确,对照基于软件的crc结果和1-wire器件的硬件crc计算结果,从而保证1-wire总线通信的可靠性。

三星Galaxy Z Flip3 5G折叠屏手机的详细介绍
OpenMV初识
OPPO加快5G产品的迭代节奏,助力5G行业快速发展
详细分析SLAM的实现和应用
Molex:75年打下坚实基础 续写下一个辉煌
简单软件实现1-Wire温度器件的硬件CRC校验和串行码流的
与你一起揭开LR寄存器的神秘面纱
云存储的架构及系统组成
纯净音质天籁之声 华为nova 2系列让你的旅途与众不同
从铁塔模式说起5g接入共建共享
Starship推全球最大的机器人配送服务,为用户配送食品或货物
NVIDIA 首席科学家 Bill Dally 将在 Hot Chips 大会发表主题演讲
jtag接口是什么_jtag接口定义
长三角人工智能企业路演暨产业合作研讨会在上海举办
韩国或为中低频5G信号增添470MHz频宽
计数器
红外额温计使用方法_红外额温计使用注意事项
诺基亚五摄新机推迟亮相,有可能会在MWC2019上正式亮相
做好防雷检测的意义和作用
2021亚太机器人世界杯天津国际邀请赛圆满落幕