crc8.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "crc8.h"
  2. /**
  3. * @funtion:crc8多项式冗余校验
  4. * @param 1:pData,计算数据源地址
  5. * @param 2:dataLen,计算数据源长度
  6. * @param 3:initialValue,crc结果初值
  7. * @param 4:polynomial,多项式
  8. *
  9. * @return :校验结果
  10. */
  11. uint8_t crc8( uint8_t *pData,
  12. uint16_t dataLen,
  13. uint8_t initialValue,
  14. uint8_t polynomial )
  15. {
  16. uint8_t i;
  17. uint8_t crc;
  18. crc = initialValue;
  19. while (dataLen --)
  20. {
  21. crc ^= *pData ++;
  22. for( i = 0; i < 8; i++ )
  23. {
  24. if(crc & 0x80)
  25. {
  26. crc <<= 1; // shift left once
  27. crc ^= polynomial; // XOR with polynomial
  28. }
  29. else
  30. {
  31. crc <<= 1; // shift left once
  32. }
  33. }
  34. }
  35. return crc;
  36. }
  37. /**
  38. * @funtion :\
  39. * @param 1:pData,计算数据源地址
  40. * @param 2:dataLen,计算数据源长度
  41. * @param 3:targetCRC,对比结果CRC
  42. *
  43. * @return :对比校验结果,=1校验成功,=0校验失败
  44. */
  45. int cmp_crc8( uint8_t *pData,
  46. uint16_t dataLen,
  47. uint8_t targetCRC)
  48. {
  49. uint8_t crc = crc8(pData, dataLen, 0x55, 0x07);
  50. printf("cmp_crc8 crc = 0x%x\n", crc);
  51. if (crc == targetCRC)
  52. {
  53. return 1;
  54. }
  55. return 0;
  56. }
  57. /**
  58. * @funtion :\
  59. * @param 1:pData,计算数据源地址
  60. * @param 2:dataLen,计算数据源长度
  61. *
  62. * @return :返回CRC结果
  63. */
  64. int get_crc8( uint8_t *pData,
  65. uint16_t dataLen)
  66. {
  67. return crc8(pData, dataLen, 0x55, 0x07);
  68. }