请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:ADS112C04 大家好、
我的一位客户正在评估 ADS112C04。 但 CRC 错误发生在 CRC 校验过程中。 他们请求我们提供任何 CRC 校验样例程序、因为他们的 CRC 校验程序可能错误。
那么、您能给我一个 C 语言的示例程序吗?
非常感谢您的答复。
此致、
Kazuya Nakai。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好、Nakai-San、
ADS112C04使用16位 CRC、并针对返回的整个数据(除实际 CRC 数据外的所有数据)进行计算。 了解在传输 CRC 时发生的操作(RDATA、RREG 等)会有所帮助。 CRC 计算的一个示例如下:
/** * 16位 CRC 的计算。 * *\详细说明了基于发送到函数并计算为16位 * CRC 的数据的 CRC 结果。 计算结果为无符号短整型。 * *\paramu8数据捕获的数据。 *\paramu8用于计算的数据长度(以字节为单位)。 * *\返回16位计算出的 CRC 值。 // uint16_t calcCRC (uint8_t * u8Data、uint8_t u8Length) { uint8_t u8i; uint16_t u16CRC= 0xFFFF;// CRC 寄存器的初始值*/ uint16_t u16Poly= 0x1021;//* CRC polynomial (不包括 uint832/ uint32/ uint32/ ut 数据掩码= 0xuint8)//数据 MSB 的位置*/ bool bDataMSb;// 数据字节的 MSB */ bool bCrcMSb;// CRC 字节的 MSB*/ //*从数据字节构造数据字*/ for (u8i = 0;u8i < u8Length; u8i++) { u32Data ||(uint32_t)(u8Data[u8i]<< 8*(u8Length - u8i - 1)); } //减少计算周期数(通过跳过任何未使用的字节)*/ u32MsbMask >=8 *(4-u8Length); /* CRC 算法*/ while (u32MsbMask > 0) { /*检查 MSB 值*/ bDataMSb =(bool)(u32Data & u32MsbMask); bCrcMSb=(bool)(u16CRC & 0x8000); if (bDataMSb ^^ bCrcMSb){u16CRC =(u16ool)<*和 u16CRC <* uShift +* u16CRC = 1);if (u16* u16* u16COR)/*仅移位*/* 移位 MSB 指针并确保右移始终产生0 */ u32MsbMask =(u32MsbMask >> 1)& 0x7FFFFFFF; } return (u16CRC); }
此致、
Bob B