Application Example

Quick example for ARM PK60N512.

#include<stdio.h>
#define CRC16START 0xFEF            // CRC16/Checksum Start Value (seed value according to .crc file)
unsigned char CalcCRC16(void);   

unsigned int crc16calc(unsigned short crc16, unsigned char data);  
unsigned long 
Memory[]={0x00000800,0x00000801,0x00000802,0x00000803,0x00000804}; //Array of addresses for which we want to calculate checksum


unsigned char CalcCRC16(void)
{
unsigned short checked_data = CRC16START;       // Start value of CRC16/Check-Sum

unsigned char data;                             // current data to be calculated

int index,SIZE;

unsigned long checksum_address=0x7F400;  //Destination address from calc_crc.crc file

unsigned short checksum_value;

checksum_value=*(unsigned short *)checksum_address;

SIZE=(sizeof(Memory)/sizeof(long));

for (index=0; index<SIZE; index++)

{

data = *(unsigned char *)Memory[index];

checked_data = crc16calc(checked_data, data);  // Calculate Checksum for each byte in current memory  block

}

return (checked_data != checksum_value); // is calculated value equal to stored value

}

/*function to calculate checksum */

unsigned int crc16calc(unsigned short crc16, unsigned char next)

{

unsigned char  token1, token2;

unsigned short quick1, quick2;

token1 = (unsigned char)((crc16 >> 8) ^ next);

token2= (unsigned char)crc16;

crc16= (unsigned short)(token2 << 8);

quick1 = (unsigned short)(token1 ^ (token1 >> 4));

crc16 ^= quick1;

quick2 = quick1 << 4;

crc16 ^= quick2 << 1;

crc16 = crc16 ^ quick2 << 8;

return crc16;

}

int main(void)

{

if (CalcCRC16())

    printf("CRC fail!"); 

        else

          printf("CRC pass"); 

return 0;

}