Searching \ for '[OT]: CRC16?' in subject line. ()
Make payments with PayPal - it's fast, free and secure! Help us get a faster server
FAQ page: www.piclist.com/techref/method/errors.htm?key=crc
Search entire site for: 'CRC16?'.

Exact match. Not showing close matches.
PICList Thread
'[OT]: CRC16?'
2000\08\21@012528 by Peter McAlpine

flavicon
face
Hi All,
working on some software to interface via a serial port
protocol which requires CRC16. This is using a non-pic
micro that has a CRC16 generator on board.. but it
gives a different result than a known good CRC value...

Is there different standards for CRC16 calculations?
How is CRC16 generally calculated on a string of
data?

Thanks!
Regards
Peter Mcalpine

--
http://www.piclist.com hint: To leave the PICList
spam_OUTpiclist-unsubscribe-requestTakeThisOuTspammitvma.mit.edu>

2000\08\21@091056 by Bob Ammerman

picon face
There are several variations on CRC16 calculation.

Some of the things you should look out for:

1: The polynomial. Although the term CRC16 is supposed to indicate the use
of a specific polynomial (don't have it handy here), many people use the
term CRC16 to refer to _any_ 16-bit CRC calculation.

2: The initial value of the CRC register. Again, CRC16 provides a standard,
but you'll see variations.

3: What bytes are included in the computation. Often some bytes of the
message are _not_ included in the CRC compution.

Bob Ammerman
RAm Systems
(contract development of high performance, high function, low-level
software)

--
http://www.piclist.com hint: To leave the PICList
.....piclist-unsubscribe-requestKILLspamspam@spam@mitvma.mit.edu>

2000\08\21@095642 by David Kott

flavicon
face
> There are several variations on CRC16 calculation.
>
> Some of the things you should look out for:
>
> 1: The polynomial. Although the term CRC16 is supposed to indicate the use
> of a specific polynomial (don't have it handy here), many people use the
> term CRC16 to refer to _any_ 16-bit CRC calculation.
>
> 2: The initial value of the CRC register. Again, CRC16 provides a
standard,
{Quote hidden}

I agree whole-heartedly with everything that Bob has stated here.  It
mirrors my experience when attempting to code to the, oft times loose,
automotive system specifications.

You asked for a how-to.  Here is one I use for inter-module communications
over a proprietary multimaster communications bus.

-------------
const unsigned short Crc16Table[256] =
{
     0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
     0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
     0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
     0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
     0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
     0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
     0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
     0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
     0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
     0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
     0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
     0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
     0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
     0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
     0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
     0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
     0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
     0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
     0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
     0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
     0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
     0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
     0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
     0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
     0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
     0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
     0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
     0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
     0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
     0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
     0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
     0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};

// Here's the program I used to generate the above CRC16 Poly's
// #include <stdio.h>
// int main (int argc, char **argv) {
//       unsigned short usCRC,i,j;
//       for (i=0;i<255;i++) {
//                usCRC=(i<<8u);
//                for (j=0;j<8;j++)
//                        usCRC=(usCRC<<1u) ^ ((usCRC&0x8000) ? 0x1021 : 0);
//
//                if ((i % 8 ) == 0 ) printf("\n");
//                printf("0x%.4hx, ",usCRC);
//        }
//        usCRC=(i<<8u);
//        for (j=0;j<8;j++)
//                usCRC=(usCRC<<1u) ^ ((usCRC&0x8000) ? 0x1021 : 0);
//
//        printf("0x%.4hx\n}\n",usCRC);
// }



unsigned short
Crc16 (unsigned char uchChar, unsigned short usCRC16)
{
     usCRC16 = Crc16Table[((usCRC16 >> 8u) & 0x00ff)] ^ (usCRC16 << 8u) ^
uchChar;
     return usCRC16;
}

--------------------

As you can see, I have sacrificed some ROM space for calculation speed.  By
using this lookup table approach, the calculation runs faster.  YMMV.  This
is an example of the "1021" poly that is sanctioned by CCITT, and is used in
such protocols as XModem.

One continuously calls Crc16() with the previous result along with the next
byte you want to add thusly:

        unsigned short usCurrentCRC=0;
        for (nIndex=0; *szMyString != 0; ++nIndex) {
                usCurrentCRC=Crc16(szMyString[nIndex],usCurrentCRC);
        }

-d

--
http://www.piclist.com hint: To leave the PICList
piclist-unsubscribe-requestspamKILLspammitvma.mit.edu>

2000\08\21@134952 by w. v. ooijen / f. hanneman

picon face
Search for "a painless introduction to CRC"
I don't have the url at hand, but it is good reading.
Wouter

--
http://www.piclist.com hint: To leave the PICList
.....piclist-unsubscribe-requestKILLspamspam.....mitvma.mit.edu>

2000\08\22@091844 by W. K. Brown

flavicon
face
This is the header for the Ver 3 thing on my drive.  For the life of me I
can't locate the bookmark. (Look for Rocksoft link?) I have not verified
anything in it.
----
============================================================================
=
A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS
----snip----
Version : 3.
Date    : 19 August 1993.
Author  : Ross N. Williams.
Net     : EraseMErossspam_OUTspamTakeThisOuTguest.adelaide.edu.au.
FTP     : ftp.adelaide.edu.au/pub/rocksoft/crc_v3.txt
Company : Rocksoft^tm Pty Ltd.
Snail   : 16 Lerwick Avenue, Hazelwood Park 5066, Australia.
Fax     : +61 8 373-4911 (c/- Internode Systems Pty Ltd).
Phone   : +61 8 379-9217 (10am to 10pm Adelaide Australia time).
Note    : "Rocksoft" is a trademark of Rocksoft Pty Ltd, Australia.
Status  : Copyright (C) Ross Williams, 1993. However, permission is
         granted to make and distribute verbatim copies of this
         document provided that this information block and copyright
         notice is included. Also, the C code modules included
         in this document are fully public domain.
Thanks  : Thanks to Jean-loup Gailly (jloupspamspam_OUTchorus.fr) and Mark Adler
         (@spam@meKILLspamspamquest.jpl.nasa.gov) who both proof read this document
         and picked out lots of nits as well as some big fat bugs.

---- I can send this version (in Text format or email it to someone if
wished). It is about 90K in plain text..
Regards,
Keith

       {Original Message removed}

2000\08\22@104012 by kohegyi.laszlo

flavicon
face
>This is the header for the Ver 3 thing on my drive.  For the life of me I
>can't locate the bookmark. (Look for Rocksoft link?) I have not verified
>anything in it.
----
>
>A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS

Hi,

Check out:

http://www.repairfaq.org/filipg/LINK/F_crc_v3.html


Regards
Les

--
http://www.piclist.com hint: PICList Posts must start with ONE topic:
[PIC]: PIC only [EE]: engineering [OT]: off topic [AD]: advertisements

2000\08\23@010238 by Javier Grijalba

flavicon
face
There is a nice AN for AVR !!
Find it in http://www.atmel.com
Bye
Javier


----- Original Message -----
From: Peter McAlpine <KILLspammcalpineKILLspamspamGME.NET.AU>
To: <RemoveMEPICLISTTakeThisOuTspamMITVMA.MIT.EDU>
Sent: Monday, August 21, 2000 2:24 AM
Subject: [OT]: CRC16?


{Quote hidden}

--
http://www.piclist.com hint: The list server can filter out subtopics
(like ads or off topics) for you. See http://www.piclist.com/#topics


2000\08\23@082642 by Shawn Yates

flavicon
face
Here is what we use for CRC.  The method does not vary to my knowledge, but
there are a few CRC constants that are used.

; CRC calculation

#define CARRY   STATUS, C
CRClo   equ     H'????'         ; CRC low byte.
CRChi   equ     H'????'         ; CRC high byte.
Temp    equ     H'????'         ; A temporary scratch register/loop counter.
BytCnt  equ     H'????'         ; Byte counter (# of bytes to be processed).
TRBuff  equ     H'????'         ; First byte of data to be transmitted,
second
                               ; byte is next, etc. ...

       clrf    CRClo           ; Init CRC to all 0's
       clrf    CRChi
       movlw   ** number of bytes to be processed **
       movwf   BytCnt
       movlw   TRBuff          ; Load the FSR to point to the first byte
       movwf   FSR             ; to be processed.
crclp   movf    0, W            ; Get the first/next byte.
       incf    FSR, F          ; Inc the pointer.
       xorwf   CRChi, F        ; XOR the byte into the high byte of CRC.
       movlw   H'0008'         ; Do the following loop 8 times:
       movwf   Temp
crclp8  bcf     CARRY           ;    Rotate the 16-bit CRC left 1 time,
       rlf     CRClo, F        ;    rolling a 0 into the lsb.
       rlf     CRChi, F
       btfss   CARRY           ;    If the msb which rotated out into
       goto    cl8dn           ;    CARRY was a 1, then XOR 1021H with
       movlw   H'0021'         ;    the CRC.
       xorwf   CRClo, F
       movlw   H'0010'
       xorwf   CRChi, F
cl8dn   decfsz  Temp, F         ; End of loop.
       goto    crclp8
       decfsz  BytCnt, F       ; Was that the last byte to be processed?
       goto    crclp           ; No - go do the next one.
                               ; Done

{Original Message removed}

More... (looser matching)
- Last day of these posts
- In 2000 , 2001 only
- Today
- New search...