AnsweredAssumed Answered

Unable to understand how the CRC calculation is done in the SPI module

Question asked by arnold_w on Mar 22, 2016
Latest reply on Mar 22, 2016 by arnold_w
I am working with the Discovery Development Board and I am trying to understand how the SPI with CRC enabled works. I had a look at Application Note AN4187 ( and on page 7 they have an example that I was able to verify in software:

#define POLYRETURN uint8_t
#define DATATYPE uint8_t
#define MSB_MASK 0x80
#define LOWER 0 /* lower limit */
#define STEP 1 /* step size */
#define CRCUPPER sizeof(DATATYPE)*8 /* CRC software upper limit */
#define CRC_SHIFT 1
  uint8_t bindex = 0;
  /* Initial XOR operation with the previous Crc value */
  Crc = Initial_Crc ^ Input_Data;
  /* The CRC algorithm routine */
  for (bindex = LOWER; bindex < CRCUPPER; bindex = bindex + STEP)
    if (Crc & MSB_MASK)
      Crc = (Crc << CRC_SHIFT) ^ POLY;
      Crc = (Crc << CRC_SHIFT);
  return Crc;
    uint8_t Initial_Crc = 0xFF;
    uint8_t Input_Data = 0xC1;
    uint8_t POLY = 0xCB;
    uint8_t Crc;
    Crc = CrcSoftwareFunc(Initial_Crc, Input_Data, POLY);

When I run the code above, I get the CRC 0x4C, exactly as in the example on page 7. However, the SPI module can't use the polynomial above because the Cube specifies the following: 

* CRC Polynomial
CRCPolynomial should respect this format :Xa+Xb+...+Xc.
where a,b,c are the powers of the polynomial and shouldbe less than 8.
* This parameter hasautomatically changed after your last modification.

So, I change my polynomial to 0x07 in both the code above and in my SPI module. I then call the function above with Input_Data = 0xC1 and compare the result with what the SPI module sends after I transmit 0xC1 on the MOSI line and the results don't match (0xBA vs 0x49). What am I doing wrong, why don't the CRC:s match?