Hi Lukas,
Thank you for response. I will try to enable INV bit and check. However I want to know why I need to enable INV bit to match with some of the online calculator.
Based on my couple of week research I found on algo from net which matches with nxp 32 bit calculation. But that only matches with data input of all zeros. (0x00, 0x00....). When I change zeros to some values and zeros as well then it does not match. I tried various options (like byte swap, reverse bytes) in my algo but did not work. So I expect nxp must be having some source code which will generate 32 bit check sum matching with nxp. Also no where i found which polynimial nxp used in there way of calculating 32 bit checksum.
I am providing source code which I used to calculate 32 bit check sum. Please recommend if you have anything.
#include <stdio.h> DWORD Crc32( DWORD Crc, DWORD Data ) { int i; Crc = Crc ^ Data; for ( i = 0; i < 32; i++ ) if ( Crc & 0x80000000 ) Crc = ( Crc << 1 ) ^ 0x04C11DB7; // Polynomial used in STM32 else Crc = ( Crc << 1 ); return ( Crc ); } DWORD Crc32Fast( DWORD Crc, DWORD Data ) { static const DWORD CrcTable[ 16 ] = { // Nibble lookup table for 0x04C11DB7 polynomial 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD }; Crc = Crc ^ Data; // Apply all 32-bits // Process 32-bits, 4 at a time, or 8 rounds Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; // Assumes 32-bit reg, masking index to 4-bits Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; // 0x04C11DB7 Polynomial used in STM32 Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; return ( Crc ); } void test( void ) { BYTE vector[ 12 ] = { 0x02, 0x07, 0x02, 0x00, 0x18, 0x8A, 0xD0, 0x23, 0x25, 0x2B, 0x09, 0x00 }; DWORD Crc; int i; for ( i = 0; i < 12; i++ ) printf( "%02X ", vector[ i ] ); putchar( '\n' ); Crc = 0xFFFFFFFF; // Initial state for ( i = 0; i < 12; i += 4 ) { Crc = Crc32Fast( Crc, *( (DWORD *) &vector[ i ] ) ); // 4-bytes at a time } printf( "%08X test\n", Crc ); } int main( int argc, char **argv ) { printf( "%08X\n\n", Crc32( 0xFFFFFFFF, 0x12345678 ) ); // 0xDF8A8A2B printf( "%08X\n\n", Crc32Fast( 0xFFFFFFFF, 0x12345678 ) ); // 0xDF8A8A2B test( ); return ( 1 ); }
I will soon let you know INV bit enable result.
Thanks
Amar