SENT CRC calculation
After a lot of searching, comprising going on the SAE J2716 norm to see exactly what was the implementation like, I found out that the code was wrong. The order of the operations was inverted, and of course you should be sure that you are not accessing items out of bounds, like you would with your code.

The correct implementation should be:

uint8_t calculatedCRC, i;
const uint8_t CrcLookup[16] = {0, 13, 7, 10, 14, 3, 9, 4, 1, 12, 6, 11, 15, 2, 8, 5};
calculatedCRC = 5; // initialize checksum with seed "0101"

for (i = 0; i &lt; 6; i++)
{
    calculatedCRC = CrcLookup[calculatedCRC];
    calculatedCRC = (calculatedCRC ^ Data[i]) &amp; 0x0F;
}
// One more round with 0 as input
calculatedCRC = CrcLookup[calculatedCRC];


If you have, like in my case, the complete payload in a 32-bit variable in the format SDDDDDDC (S is the status nibble, C the CRC you have to verify), then the code can be modified in this way:

uint32_t crcData = YourOriginal32BitSentFrame;

uint8_t calculatedCRC, i;
const uint8_t CrcLookup[16] = {0, 13, 7, 10, 14, 3, 9, 4, 1, 12, 6, 11, 15, 2, 8, 5};
calculatedCRC = 5; // initialize checksum with seed "0101"

for (i = 0; i &lt; 6; i++)
{
    uint8_t crcDatum = (crcData &gt;&gt; 24) &amp; 0x0F;

    calculatedCRC = CrcLookup[calculatedCRC];
    calculatedCRC = calculatedCRC ^ crcDatum;
    crcData &lt;&lt;= 4;
}
// One more round with 0 as input
calculatedCRC = CrcLookup[calculatedCRC];


Best regards