frederic blanc
/
MAX31850_HelloWorld
test MAX31850
OneWire/crc16.cpp@3:b4277f7c538e, 2014-06-02 (annotated)
- Committer:
- fblanc
- Date:
- Mon Jun 02 13:17:18 2014 +0000
- Revision:
- 3:b4277f7c538e
- Parent:
- 0:55f2866e9c0c
ok tk.ini
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fblanc | 0:55f2866e9c0c | 1 | #include <inttypes.h> |
fblanc | 0:55f2866e9c0c | 2 | #include "mbed.h" |
fblanc | 0:55f2866e9c0c | 3 | #include "onewire.h" |
fblanc | 0:55f2866e9c0c | 4 | |
fblanc | 0:55f2866e9c0c | 5 | #define CRC16INIT 0x0000 |
fblanc | 0:55f2866e9c0c | 6 | //#define CRC16POLY 0x8005; // Polynome =x^16 + x^15 + x^2 + x^0 = 0x18005 |
fblanc | 0:55f2866e9c0c | 7 | #define CRC16POLY 0xA001; |
fblanc | 0:55f2866e9c0c | 8 | |
fblanc | 0:55f2866e9c0c | 9 | uint16_t crc16(uint8_t* octets, uint16_t nboctets) |
fblanc | 0:55f2866e9c0c | 10 | { |
fblanc | 0:55f2866e9c0c | 11 | uint16_t crc = CRC16INIT; |
fblanc | 0:55f2866e9c0c | 12 | int i, done = 0; |
fblanc | 0:55f2866e9c0c | 13 | uint8_t todo; |
fblanc | 0:55f2866e9c0c | 14 | if (nboctets != 0) { |
fblanc | 0:55f2866e9c0c | 15 | do { |
fblanc | 0:55f2866e9c0c | 16 | todo = octets[done]; |
fblanc | 0:55f2866e9c0c | 17 | crc ^= todo; |
fblanc | 0:55f2866e9c0c | 18 | for (i = 0; i < 8; i++) { |
fblanc | 0:55f2866e9c0c | 19 | if (crc % 2 != 0) { |
fblanc | 0:55f2866e9c0c | 20 | crc = (crc >> 1) ^ CRC16POLY; |
fblanc | 0:55f2866e9c0c | 21 | } else { |
fblanc | 0:55f2866e9c0c | 22 | crc = crc >> 1; |
fblanc | 0:55f2866e9c0c | 23 | } |
fblanc | 0:55f2866e9c0c | 24 | } |
fblanc | 0:55f2866e9c0c | 25 | done++; |
fblanc | 0:55f2866e9c0c | 26 | } while (done < nboctets); |
fblanc | 0:55f2866e9c0c | 27 | |
fblanc | 0:55f2866e9c0c | 28 | |
fblanc | 0:55f2866e9c0c | 29 | } |
fblanc | 0:55f2866e9c0c | 30 | |
fblanc | 0:55f2866e9c0c | 31 | return crc; |
fblanc | 0:55f2866e9c0c | 32 | } |
fblanc | 0:55f2866e9c0c | 33 | //CRC16 byte, always two bytes, bit inverted, LSByte first |
fblanc | 0:55f2866e9c0c | 34 | uint8_t ctrl_crc16(uint8_t* octets, uint16_t nboctets) |
fblanc | 0:55f2866e9c0c | 35 | { |
fblanc | 0:55f2866e9c0c | 36 | uint16_t crc; |
fblanc | 0:55f2866e9c0c | 37 | uint8_t *ptr; |
fblanc | 0:55f2866e9c0c | 38 | #ifdef DEBUG |
fblanc | 0:55f2866e9c0c | 39 | printf( "\nCRC16 : " ); |
fblanc | 0:55f2866e9c0c | 40 | for ( uint8_t i=0 ; i< nboctets; i++ ) |
fblanc | 0:55f2866e9c0c | 41 | printf(":%2.2X",octets[i]); |
fblanc | 0:55f2866e9c0c | 42 | printf( "\n" ); |
fblanc | 0:55f2866e9c0c | 43 | #endif |
fblanc | 0:55f2866e9c0c | 44 | crc =~crc16(octets, nboctets-2); |
fblanc | 0:55f2866e9c0c | 45 | ptr=(uint8_t*)&crc; |
fblanc | 0:55f2866e9c0c | 46 | #ifdef DEBUG |
fblanc | 0:55f2866e9c0c | 47 | printf( "\n" ); |
fblanc | 0:55f2866e9c0c | 48 | printf("CRC16:%X",crc); |
fblanc | 0:55f2866e9c0c | 49 | printf( "\n" ); |
fblanc | 0:55f2866e9c0c | 50 | #endif |
fblanc | 0:55f2866e9c0c | 51 | if(*ptr==octets[nboctets-2]) |
fblanc | 0:55f2866e9c0c | 52 | if(*++ptr==octets[nboctets-1]) |
fblanc | 0:55f2866e9c0c | 53 | return 0; |
fblanc | 0:55f2866e9c0c | 54 | |
fblanc | 0:55f2866e9c0c | 55 | return 1; |
fblanc | 0:55f2866e9c0c | 56 | } |