一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

MAX22190和MAX22192八进制工业数字输入诊断CRC算法实现指南

来源:analog 发布时间:2023-09-13

摘要: MAX22190和MAX22192八进制数字输入器件高度集成,容错,电流下降,符合IEC 61131-2工业输入。它们将24V输入转换为串行spi兼容输出。SPI接口提供对数字输入数据、诊断数据和高级配置的访问。为了增加安全性,硬件CRC电路可选地保护SPI接口免受位错误。本应用说明提供了在微控制器中实现CRC生成和检测算法的示例c代码。

MAX22190和MAX22192是符合IEC 61131-2标准的工业数字输入设备。它们将8个电流下沉的工业输入转换为串行spi兼容输出。MAX22190/MAX22192提供先进的诊断功能,如断线检测,过温监测,欠压监测,并通过SPI接口循环冗余检查(CRC)通信错误。MAX22192还具有集成的电流隔离SPI和数字控制信号。

MAX22190/MAX22192中的硬件CRC电路可以选择性地保护与微控制器的所有数据通信免受误码。但是,在MAX22190/MAX22192中启用CRC功能是不够的。微控制器还必须在软件中实现相同的CRC算法,以计算和附加校验位到发送到MAX22190/MAX22192的数据,并验证从它们接收的数据。

实现这一目标的一种方法是读取MAX22190/MAX22192数据表并创建自定义固件来实现必要的CRC功能。一个更快的解决方案是使用本应用程序说明中提供的CRC代码片段。CRC代码是用C编写的,应该证明很容易移植到任何常见的微控制器上。有关MAX22190/MAX22192引脚、工作模式和控制寄存器的详细信息,请参见MAX22190/MAX22192数据表。

串口的CRC错误检测

串行数据的MAX22190/MAX22192 CRC错误检测可以使SDI和SDO信号的数据损坏导致的错误操作或错误信息最小化。通过配置M1和M0输入,将SPI接口模式设置为SPI mode 0或SPI mode 2,使能错误检测功能。

M0 = 0 (M1 = 0或1)时,SPI模式配置为24位帧长,开启CRC错检功能。当使能错误检测时,MAX22190/MAX22192执行以下操作:

  • 对它从微控制器接收到的SDI数据的前19位执行CRC计算,并与SDI数据的最后5位进行比较,如果它们相同。

  • 计算SDO数据的前19位的CRC位,并将5位的CRC附加到SDO数据上,SDO数据发送给微控制器。


这确保了设备从微控制器接收到的数据(设置/配置)和它发送到微控制器的数据(诊断/状态)都具有较低的未检测到错误的可能性。

在独立的slave (SPI Mode 0)和daisy-chain (SPI Mode 2)操作模式下都支持CRC错误检测。


从主机SDI上输入数据


当SPI模式0或SPI模式2使能CRC特性时,SDI信号上的19位数据流附加5位CRC校验和。这个19位的数据流可以是一个写操作,它由一个W/R位(MSB = 1), 7位寄存器地址,8位寄存器值和3个零位。它也可以是一个读操作,由W/组成R位(MSB = 0), 7位寄存器地址,11位零位。

5位CRC校验和由主机根据第一个19位数据流计算,其中填充了5位初始字00111。然后使用多项式X(5) + X(4) + X(2) + X(0)处理24位数据流。计算完成后,将5位的CRC结果附加到原来的19位数据流中,形成24位的SPI数据帧,呈现在SDI上,发送给MAX22190/MAX22192。图1显示了读或写操作中的SDI数据结构。


图1所示 读或写操作中的SDI数据结构。

在SDI上接收到数据帧后,MAX22190/MAX22192使用前19位校验5位CRC校验和,如果没有检测到错误,MAX22190/MAX22192执行命令读取DI状态、读取寄存器或更新设备配置。如果检测到CRC错误,MAX22190/MAX22192忽略该命令,不改变设备配置。相反,MAX22190/MAX22192在FAULT1寄存器中设置CRC位。在接收到未损坏的数据帧之前,CRC位不会重置。

如果设置了FAULT1EN寄存器中的CRC使能位CRCE,则的错当FAULT1寄存器中的CRC位被设置时,pin被设置为低电平。的的错引脚向主机提供中断信号,以进一步指示SPI接口上的通信错误。


从MAX22190/MAX22192M在SDO上输出数据


MAX22190/MAX22192附加到SDO数据的CRC校验和在SPI模式0或SPI模式2中具有图2所示的格式。

在SPI模式0中,MAX22190/MAX22192在非菊花链模式下工作,当SDI数据帧被时钟输入时,解码读取或写入命令。命令立即执行,来自指定寄存器的数据在同一SPI帧的SDO上被打卡。当SDI上的命令是写操作时,MAX22190/MAX22192时钟输出8位数字输入数据、8位断线数据、VDD24电压低状态位(24VL)、VDD24电压缺失状态位(24VM)、断线状态位(WBG)和SDO上的5位CRC校验和。当SDI上的命令是读操作时,MAX22190/MAX22192时钟输出8位数字输入日期、8位指定寄存器值、24VL、24VM、WBG和5位CRC校验和。SDO上的5位CRC由MAX22190/MAX22192根据SDO上的前19位计算。

在SPI模式2中,MAX22190/MAX22192以雏菊链模式工作。SPI接口作为移位寄存器操作,并且链中的每个设备都不知道它应该解码比特流的哪一部分CSde-asserted。为了适应这一点,它需要两个SPI数据帧来读取或写入寄存器,第一个SPI帧在SDI上发送命令,第二个SPI帧根据前一个命令在SDO上输出数据。无论前面的SPI命令是写还是读操作,CRC值总是基于SDO数据的前19位计算,其数据结构与SPI模式下相同。

当主机在SDO上接收到数据帧时,它可以根据数据帧的前19位计算CRC校验和,并与最后5位的CRC值进行比较。如果CRC值不匹配,则主机知道SDO数据包含错误,并且应该丢弃数据包。


图2 读或写操作中的SDO数据结构。

源代码

本应用笔记提供了实现MAX22190/MAX22192 CRC算法的C源代码。它计算基于任何MAX22190/MAX22192读或写命令的CRC校验和。MAX22190/MAX22192使用24位(3字节)数据包与微控制器通信。源代码提供了一个基于24位数据包计算5位CRC值的函数。

getCRC(字节data2,字节data1,字节data0)


CRC函数返回5位的CRC值,该值被定义为字节类型变量。该函数有3个输入变量,都定义为字节类型:

  • data2是24位数据包(MSB)的前8位。

  • 数据1是第二个8位。

  • data0是最后8位(LSB)。


数据包的值可以是在SDI上发送的读或写命令,也可以是从SDO接收到的24位数据值。

CRC校验和是根据前19位加上5位CRC初始字00111计算的。

字节c_init = 0x07;//5位初始化字,常量,00111
//构造24位数据帧
UInt32 datainput = (UInt32)((data2 <<16) + (data1 <<8) + data0);
Datainput = (Datainput &0xffffe0) + crc_init;


CRC算法使用生成多项式X(5) + X(4) + X(2) + X(0),即110101。对于数据包中的每一个比特,它计算中间的6位CRC步长值,并使用前一个值的MSB位来计算下一个CRC步长值。第一个CRC步长值是数据包的前6位。最后的CRC校验和是最后一个CRC步长值的最后5位。

图3和图4显示了CRC计算的示例和所有中间步骤,如下面的源代码所示。


图3 由SDI上的微控制器发送的CRC数据。


图4 MAX22190/MAX22192在SDO上发送的CRC数据。

/ / / & lt; summary>/// 24位帧后5位丢弃,数据长度为19位///多项式P(x) = x5+x4+x2+x0 ->110101 ///初始化字追加到19位数据->00111 /// </summary>/// <参数名称="data2">MSB Byte </参数>/// <参数名="data1">中间字节</参数>/// <参数名="data0">LSB字节</参数>/// <return >5位CRC </returns>公共字节getCRC(字节data2,字节data1,字节data0) {int长度= 19;// crc_init = 0x07;//5位初始化字,常量,00111字节//6位多项式,常数,110101字节;字节crc_result;字节tmp;//构造24位数据帧UInt32 datainput = (UInt32)((data2 <<16) + (data1 <<8) + data0);//向第一个19位的数据追加5位的初始化字datainput = (datainput &0xffffe0) + crc_init;//第一步,获取crc_step 0 TMP = (byte)((datainput &0 xfc0000)在祝辞18);//crc_step 0= data[18:13] //next crc_step = crc_step[5] = 0 ?(crc_step[5:0] ^ crc_poly): crc_step[5:0] if ((tmp &0x20) == 0x20) crc_step = (byte)(tmp ^ crc_poly);否则crc_step = tmp;//步骤1-18 for (int I = 0;我& lt;长度- 1;I ++){//将下一个数据位附加到前一个crc_step[4:0], {crc_step[4:0],下一个数据位}TMP = (byte)(((crc_step &0 x1f) & lt; & lt;1) + ((datainput >>(length - 2 - i)) &0 x01));//下一步crc_step = crc_step[5] = 0 ?(crc_step [5:0] ^ crc_poly): crc_step(5:0)如果(tmp和0 x20) = = 0 x20) crc_step =(字节)(tmp ^ crc_poly);否则crc_step = tmp;} crc_result = (byte)(crc_step &0 x1f);//crc result = crc_step[4:0] return crc_result;返回crc_result;}

结论

本应用说明展示了如何在与MAX22190八进制工业数字输入或MAX22192八进制工业数字输入隔离通信的微控制器上编码CRC算法。此代码使用MAX22190EVKIT和MAX22192EVKIT以及相应的gui进行了测试。通过利用本应用笔记中的C代码示例,工程师有一个经过验证的解决方案来实现这种额外的数据通信保护。在某些情况下,应该在目标微控制器上执行一些基准测试,特别是在优先考虑快速执行速度的情况下。



声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: