v2.0 working

Dependencies:   mbed

Committer:
krishanprajapat
Date:
Thu Jul 30 12:39:50 2015 +0000
Revision:
2:2b08032d9678
Parent:
0:8ed3ad791ca2
read from sd card and send to adf working;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
krishanprajapat 0:8ed3ad791ca2 1 //EDITS
krishanprajapat 0:8ed3ad791ca2 2 //changed the initial remainder from 0x0000 to 0xffff according to the standards
krishanprajapat 0:8ed3ad791ca2 3 //made two seperate functions crc16_gen and crc8_gen
krishanprajapat 0:8ed3ad791ca2 4
krishanprajapat 0:8ed3ad791ca2 5 #define TOPBIT16 (1 << 15)
krishanprajapat 0:8ed3ad791ca2 6 #define TOPBIT8 (1 << 7)
krishanprajapat 0:8ed3ad791ca2 7 #define POLYNOMIAL16 0x1021
krishanprajapat 0:8ed3ad791ca2 8 #define POLYNOMIAL8 0xEA
krishanprajapat 0:8ed3ad791ca2 9
krishanprajapat 0:8ed3ad791ca2 10 namespace CRC{
krishanprajapat 0:8ed3ad791ca2 11 typedef unsigned short int crctype16;
krishanprajapat 0:8ed3ad791ca2 12 crctype16 crc16_gen(const unsigned char message[], unsigned int nBytes){
krishanprajapat 0:8ed3ad791ca2 13 crctype16 remainder = 0xffff;
krishanprajapat 0:8ed3ad791ca2 14 int byte;
krishanprajapat 0:8ed3ad791ca2 15 char bit;
krishanprajapat 0:8ed3ad791ca2 16
krishanprajapat 0:8ed3ad791ca2 17 for( byte = 0 ; byte < nBytes ; byte++ ){
krishanprajapat 0:8ed3ad791ca2 18 /*
krishanprajapat 0:8ed3ad791ca2 19 Bring the data byte by byte
krishanprajapat 0:8ed3ad791ca2 20 each time only one byte is brought
krishanprajapat 0:8ed3ad791ca2 21 0 xor x = x
krishanprajapat 0:8ed3ad791ca2 22 */
krishanprajapat 0:8ed3ad791ca2 23 remainder = remainder ^ ( message[byte] << 8 );
krishanprajapat 0:8ed3ad791ca2 24
krishanprajapat 0:8ed3ad791ca2 25 for( bit = 8 ; bit > 0 ; bit--){
krishanprajapat 0:8ed3ad791ca2 26 /*
krishanprajapat 0:8ed3ad791ca2 27 for each bit, xor the remainder with polynomial
krishanprajapat 0:8ed3ad791ca2 28 if the MSB is 1
krishanprajapat 0:8ed3ad791ca2 29 */
krishanprajapat 0:8ed3ad791ca2 30 if(remainder & TOPBIT16){
krishanprajapat 0:8ed3ad791ca2 31 remainder = (remainder << 1) ^ POLYNOMIAL16;
krishanprajapat 0:8ed3ad791ca2 32 /*
krishanprajapat 0:8ed3ad791ca2 33 each time the remainder is xor-ed with polynomial, the MSB is made zero
krishanprajapat 0:8ed3ad791ca2 34 hence the first digit of the remainder is ignored in the loop
krishanprajapat 0:8ed3ad791ca2 35 */
krishanprajapat 0:8ed3ad791ca2 36 }
krishanprajapat 0:8ed3ad791ca2 37 else{
krishanprajapat 0:8ed3ad791ca2 38 remainder = (remainder << 1);
krishanprajapat 0:8ed3ad791ca2 39 }
krishanprajapat 0:8ed3ad791ca2 40 }
krishanprajapat 0:8ed3ad791ca2 41 }
krishanprajapat 0:8ed3ad791ca2 42
krishanprajapat 0:8ed3ad791ca2 43 return remainder;
krishanprajapat 0:8ed3ad791ca2 44 }
krishanprajapat 0:8ed3ad791ca2 45
krishanprajapat 0:8ed3ad791ca2 46 typedef unsigned char crctype8;
krishanprajapat 0:8ed3ad791ca2 47 crctype8 crc8_gen(const unsigned char message[], unsigned int nBytes){
krishanprajapat 0:8ed3ad791ca2 48
krishanprajapat 0:8ed3ad791ca2 49 crctype8 remainder = 0xff;
krishanprajapat 0:8ed3ad791ca2 50
krishanprajapat 0:8ed3ad791ca2 51 for(int byte = 0 ; byte < nBytes ; byte++ ){
krishanprajapat 0:8ed3ad791ca2 52 /*
krishanprajapat 0:8ed3ad791ca2 53 Bring the data byte by byte
krishanprajapat 0:8ed3ad791ca2 54 each time only one byte is brought
krishanprajapat 0:8ed3ad791ca2 55 0 xor x = x
krishanprajapat 0:8ed3ad791ca2 56 */
krishanprajapat 0:8ed3ad791ca2 57 remainder = remainder ^ ( message[byte] );
krishanprajapat 0:8ed3ad791ca2 58
krishanprajapat 0:8ed3ad791ca2 59 for(int bit = 8 ; bit > 0 ; bit--){
krishanprajapat 0:8ed3ad791ca2 60 /*
krishanprajapat 0:8ed3ad791ca2 61 for each bit, xor the remainder with polynomial
krishanprajapat 0:8ed3ad791ca2 62 if the MSB is 1
krishanprajapat 0:8ed3ad791ca2 63 */
krishanprajapat 0:8ed3ad791ca2 64 if(remainder & TOPBIT8){
krishanprajapat 0:8ed3ad791ca2 65 remainder = (remainder << 1) ^ POLYNOMIAL8;
krishanprajapat 0:8ed3ad791ca2 66 /*
krishanprajapat 0:8ed3ad791ca2 67 each time the remainder is xor-ed with polynomial, the MSB is made zero
krishanprajapat 0:8ed3ad791ca2 68 hence the first digit of the remainder is ignored in the loop
krishanprajapat 0:8ed3ad791ca2 69 */
krishanprajapat 0:8ed3ad791ca2 70 }
krishanprajapat 0:8ed3ad791ca2 71 else{
krishanprajapat 0:8ed3ad791ca2 72 remainder = (remainder << 1);
krishanprajapat 0:8ed3ad791ca2 73 }
krishanprajapat 0:8ed3ad791ca2 74 }
krishanprajapat 0:8ed3ad791ca2 75 }
krishanprajapat 0:8ed3ad791ca2 76
krishanprajapat 0:8ed3ad791ca2 77 return remainder;
krishanprajapat 0:8ed3ad791ca2 78 }
krishanprajapat 0:8ed3ad791ca2 79 }
krishanprajapat 0:8ed3ad791ca2 80