idem
idem

Reputation: 13

6-bit CRC datasheet confusion STMicroelectronics L9963E

I’m working on the SPI communication between a microcontroller and the L9963E. The datasheet of the L9963E shows little information about the CRC calculation, but mentions:

The documentation also mentions in the SPI protocol details that the CRC is a value between 0x00 and 0x3F, and is "calculated on the [39-7] field of the frame", see Table 22.

I'm wondering: What is meant by "field [39-7]"? The total frame length is 40bits, out of this the CRC makes up 6 bits. I would expect a CRC calculation over the remaining 34 bits, but field 39-7 would mean either 33 bits (field 7 inclusive) or 32 bits (excluding field 7).

Since I have access to a L9963E evaluation board, which includes pre-loaded firmware, I have hooked up a logic analyser. I have found the following example frames to be sent to the L9963E from the eval-board, I am assuming that these are valid, error-free frames.

0xC21C3ECEFD
0xC270080001
0xE330081064
0xC0F08C1047
0x827880800E
0xC270BFFFF9
0xC2641954BE

Could someone clear up the datasheet for me, and maybe advise me on how to implement this CRC calculation?

Upvotes: 1

Views: 510

Answers (3)

rcgldr
rcgldr

Reputation: 28826

All of the special frames have CRC == 0:

(0000000016 xor E000000000) mod 59 = 00
(C1FCFFFC6C xor E000000000) mod 59 = 00
(C1FCFFFC87 xor E000000000) mod 59 = 00
(C1FCFFFCDE xor E000000000) mod 59 = 00
(C1FCFFFD08 xor E000000000) mod 59 = 00

and as noted by Mark Adler only one of the messages in the question works:

(C270BFFFF9 xor E000000000) mod 59 = 00

Upvotes: 2

Mark Adler
Mark Adler

Reputation: 112404

If a 40-bit message is in the low bits of uint64_t x;, then this:

    x ^= (uint64_t)0x38 << 34;
    for (int j = 0; j < 40; j++)
        x = x & 0x8000000000 ? (x << 1) ^ ((uint64_t)0x19 << 34) : x << 1;
    x &= 0xffffffffff;

gives x == 0 for all of the example messages in the document. But only for one of your examples in the question. You may not be extracting the data correctly.

Upvotes: 1

Tom V
Tom V

Reputation: 5470

Bit ranges in datasheets like this are always inclusive.

I suspect that this is just a typo, or the person who wrote it temporarily forgot that the bits are numbered from zero.

Looking at the other bit-field boundaries in Table 19 of the document you linked it wouldn't make sense to exclude the bottom bit of the data field from the CRC, so I suspect the datasheet should say bits 39 to 6 inclusive.

There is a tool called pycrc that can generate C code to calculate a CRC with an arbitrary polynomial.

Upvotes: 1

Related Questions