Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
j3
Date:
Thu Jun 02 21:56:16 2016 +0000
Revision:
80:83b0d879cc32
Parent:
78:0cbbac7f2016
added support for DS1920 temperature i-button

Who changed what in which revision?

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