Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
IanBenzMaxim
Date:
Fri Jun 17 15:24:37 2016 -0500
Revision:
90:c233d1c265ff
Parent:
86:2ce08ca58b9e
Child:
104:3f48daed532b
Moved ROM utility functions outside of the OneWireMaster class.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 78:0cbbac7f2016 1 #include "crc.h"
IanBenzMaxim 78:0cbbac7f2016 2
IanBenzMaxim 90:c233d1c265ff 3 namespace OneWire
j3 80:83b0d879cc32 4 {
IanBenzMaxim 90:c233d1c265ff 5 namespace crc
j3 80:83b0d879cc32 6 {
IanBenzMaxim 90:c233d1c265ff 7 uint8_t calculateCrc8(uint8_t crc8, uint8_t data)
j3 80:83b0d879cc32 8 {
IanBenzMaxim 90:c233d1c265ff 9 // See Application Note 27
IanBenzMaxim 90:c233d1c265ff 10 crc8 = crc8 ^ data;
IanBenzMaxim 90:c233d1c265ff 11 for (int i = 0; i < 8; i++)
IanBenzMaxim 90:c233d1c265ff 12 {
IanBenzMaxim 90:c233d1c265ff 13 if (crc8 & 1)
IanBenzMaxim 90:c233d1c265ff 14 {
IanBenzMaxim 90:c233d1c265ff 15 crc8 = (crc8 >> 1) ^ 0x8c;
IanBenzMaxim 90:c233d1c265ff 16 }
IanBenzMaxim 90:c233d1c265ff 17 else
IanBenzMaxim 90:c233d1c265ff 18 {
IanBenzMaxim 90:c233d1c265ff 19 crc8 = (crc8 >> 1);
IanBenzMaxim 90:c233d1c265ff 20 }
IanBenzMaxim 90:c233d1c265ff 21 }
IanBenzMaxim 90:c233d1c265ff 22
IanBenzMaxim 90:c233d1c265ff 23 return crc8;
IanBenzMaxim 90:c233d1c265ff 24 }
IanBenzMaxim 90:c233d1c265ff 25
IanBenzMaxim 90:c233d1c265ff 26 uint8_t calculateCrc8(const uint8_t * data, size_t dataLen, uint8_t crc)
IanBenzMaxim 90:c233d1c265ff 27 {
IanBenzMaxim 90:c233d1c265ff 28 for (size_t i = 0; i < dataLen; i++)
IanBenzMaxim 90:c233d1c265ff 29 {
IanBenzMaxim 90:c233d1c265ff 30 crc = calculateCrc8(crc, data[i]);
IanBenzMaxim 90:c233d1c265ff 31 }
IanBenzMaxim 90:c233d1c265ff 32 return crc;
j3 80:83b0d879cc32 33 }
IanBenzMaxim 90:c233d1c265ff 34
IanBenzMaxim 90:c233d1c265ff 35 uint16_t calculateCrc16(uint16_t crc16, uint16_t data)
j3 80:83b0d879cc32 36 {
IanBenzMaxim 90:c233d1c265ff 37 const uint16_t oddparity[] = { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 };
IanBenzMaxim 90:c233d1c265ff 38
IanBenzMaxim 90:c233d1c265ff 39 data = (data ^ (crc16 & 0xff)) & 0xff;
IanBenzMaxim 90:c233d1c265ff 40 crc16 >>= 8;
IanBenzMaxim 90:c233d1c265ff 41
IanBenzMaxim 90:c233d1c265ff 42 if (oddparity[data & 0xf] ^ oddparity[data >> 4])
IanBenzMaxim 90:c233d1c265ff 43 {
IanBenzMaxim 90:c233d1c265ff 44 crc16 ^= 0xc001;
IanBenzMaxim 90:c233d1c265ff 45 }
IanBenzMaxim 90:c233d1c265ff 46
IanBenzMaxim 90:c233d1c265ff 47 data <<= 6;
IanBenzMaxim 90:c233d1c265ff 48 crc16 ^= data;
IanBenzMaxim 90:c233d1c265ff 49 data <<= 1;
IanBenzMaxim 90:c233d1c265ff 50 crc16 ^= data;
IanBenzMaxim 90:c233d1c265ff 51
IanBenzMaxim 90:c233d1c265ff 52 return crc16;
IanBenzMaxim 90:c233d1c265ff 53 }
IanBenzMaxim 90:c233d1c265ff 54
IanBenzMaxim 90:c233d1c265ff 55 uint16_t calculateCrc16(const uint8_t * data, size_t dataOffset, size_t dataLen, uint16_t crc)
IanBenzMaxim 90:c233d1c265ff 56 {
IanBenzMaxim 90:c233d1c265ff 57 for (size_t i = dataOffset; i < (dataLen + dataOffset); i++)
IanBenzMaxim 90:c233d1c265ff 58 {
IanBenzMaxim 90:c233d1c265ff 59 crc = calculateCrc16(crc, data[i]);
IanBenzMaxim 90:c233d1c265ff 60 }
IanBenzMaxim 90:c233d1c265ff 61 return crc;
j3 80:83b0d879cc32 62 }
j3 80:83b0d879cc32 63 }
j3 80:83b0d879cc32 64 }