Ich stelle hier die CRC Berechnung für den LTC6804 zur Verfügung.
CRC15.c
1 | uint16 Crc15( uint16 u16InCrc, uint8 u8InData )
|
2 | {
|
3 | uint8 u8Index;
|
4 | uint16 u16Data;
|
5 | uint16 u16Eor;
|
6 |
|
7 | u8Index = 8;
|
8 | u16Data = u16InCrc ^ (uint16)((uint16)(u8InData) << 7);
|
9 |
|
10 | do{
|
11 | u16Eor = u16Data & 0x4000 ? 0x4599 : 0;
|
12 | u16Data = (uint16)(u16Data << 1);
|
13 | u16Data ^= u16Eor;
|
14 | }while(--u8Index);
|
15 |
|
16 | return u16Data;
|
17 | }
|
18 |
|
19 | uint16 Crc15Block(uint16 u16Crc, puint8 pu8Data, uint8 u8Length)
|
20 | {
|
21 | if(u8Length)do{
|
22 | u16Crc = Crc15( u16Crc, *pu8Data++ );
|
23 | }while(--u8Length);
|
24 |
|
25 | u16Crc = (u16Crc & 0x7FFF) << 1;
|
26 | return u16Crc;
|
27 | }
|
CRC15.h
1 | #ifndef __CRC15_h
|
2 | #define __CRC15_h
|
3 |
|
4 | #include "SewDTyp.h"
|
5 |
|
6 | #ifndef CRC15_C
|
7 | #define CRC15_EXT extern
|
8 | #else
|
9 | #define CRC15_EXT
|
10 | #endif
|
11 |
|
12 | #define CRC_INIT 0x0010
|
13 | #define CRC_CORRECT 0//CRC_VALUE
|
14 |
|
15 | CRC15_EXT uint16 Crc15Block( uint16 u16Crc, puint8 pu8Data, uint8 u8Length );
|
16 |
|
17 | #endif
|