Implementation of 1-Wire with added Alarm Search Functionality
Dependents: Max32630_One_Wire_Interface
Diff: Bridge/DS28E17/DS28E17.cpp
- Revision:
- 78:0cbbac7f2016
- Parent:
- 77:529edb329ee0
--- a/Bridge/DS28E17/DS28E17.cpp Mon May 16 10:36:30 2016 -0500 +++ b/Bridge/DS28E17/DS28E17.cpp Mon May 16 15:18:09 2016 -0500 @@ -32,10 +32,11 @@ #include "DS28E17.h" #include "Masters/OneWireMaster.h" +#include "crc.h" using OneWire::DS28E17; using OneWire::OneWireMaster; - +using namespace OneWire::crc; enum Command { @@ -52,9 +53,6 @@ }; -const uint16_t DS28E17::_oddparity[] = { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }; - - //********************************************************************* DS28E17::DS28E17(RandomAccessRomIterator &selector) : OneWireSlave(selector) @@ -78,33 +76,33 @@ if (ow_result == OneWireMaster::Success) { //seed the crc - _crc16 = 0; + uint16_t crc16 = 0; // Form the 1-Wire Packet // I2C Write Data with Stop command send_block[send_cnt] = WriteDataWithStopCmd; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // I2C Address send_block[send_cnt] = I2C_addr; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // Length field send_block[send_cnt] = length; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // Form the write data for (size_t idx = 0; idx < length; idx++) { send_block[send_cnt] = data[idx]; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); } // Form the CRC16 - _crc16 = _crc16 ^ 0xFFFF; - send_block[send_cnt++] = ((uint8_t)(_crc16 & 0xFF)); - send_block[send_cnt++] = ((uint8_t)((_crc16 >> 8) & 0xFF)); + crc16 ^= 0xFFFF; + send_block[send_cnt++] = ((uint8_t)(crc16 & 0xFF)); + send_block[send_cnt++] = ((uint8_t)((crc16 >> 8) & 0xFF)); // Send Packet bridge_result = send_packet(send_block, send_cnt, status, wr_status); @@ -129,31 +127,31 @@ if (ow_result == OneWireMaster::Success) { // seed the crc - _crc16 = 0; + uint16_t crc16 = 0; // I2C Write Data with Stop command send_block[send_cnt] = WriteDataNoStopCmd; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // I2C Address send_block[send_cnt] = I2C_addr; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // Length field send_block[send_cnt] = length; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // Form the write data for (size_t idx = 0; idx < length; idx++) { send_block[send_cnt] = data[idx]; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); } // Form the CRC16 - _crc16 = _crc16 ^ 0xFFFF; - send_block[send_cnt++] = ((uint8_t)(_crc16 & 0xFF)); - send_block[send_cnt++] = ((uint8_t)((_crc16 >> 8) & 0xFF)); + crc16 ^= 0xFFFF; + send_block[send_cnt++] = ((uint8_t)(crc16 & 0xFF)); + send_block[send_cnt++] = ((uint8_t)((crc16 >> 8) & 0xFF)); // Send Packet bridge_result = send_packet(send_block, send_cnt, status, wr_status); @@ -177,29 +175,29 @@ if (ow_result == OneWireMaster::Success) { // seed the crc - _crc16 = 0; + uint16_t crc16 = 0; // Form the 1-Wire Packet // I2C Write Data with Stop command send_block[send_cnt] = WriteDataOnlyCmd; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // Length field send_block[send_cnt] = length; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // Form the write data for (size_t idx = 0; idx < length; idx++) { send_block[send_cnt] = data[idx]; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); } - // Form the CRC16\ - _crc16 = _crc16^0xFFFF; - send_block[send_cnt++] = (_crc16 & 0xFF); - send_block[send_cnt++] = ((_crc16 >> 8) & 0xFF); + // Form the CRC16 + crc16 ^= 0xFFFF; + send_block[send_cnt++] = (crc16 & 0xFF); + send_block[send_cnt++] = ((crc16 >> 8) & 0xFF); // Send Packet bridge_result = send_packet(send_block, send_cnt, status, wr_status); @@ -223,29 +221,29 @@ if (ow_result == OneWireMaster::Success) { //seed the crc - _crc16 = 0; + uint16_t crc16 = 0; // Form the 1-Wire Packet // I2C Write Data with Stop command send_block[send_cnt] = WriteDataOnlyWithStopCmd; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // Length field send_block[send_cnt] = length; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // Form the write data for (size_t idx = 0; idx < length; idx++) { send_block[send_cnt] = data[idx]; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); } // Form the CRC16 - _crc16 = _crc16 ^ 0xFFFF; - send_block[send_cnt++] = (_crc16 & 0xFF); - send_block[send_cnt++] = ((_crc16 >> 8) & 0xFF); + crc16 ^= 0xFFFF; + send_block[send_cnt++] = (crc16 & 0xFF); + send_block[send_cnt++] = ((crc16 >> 8) & 0xFF); // Send Packet bridge_result = send_packet(send_block, send_cnt, status, wr_status); @@ -272,37 +270,37 @@ if (ow_result == OneWireMaster::Success) { //seed the crc - _crc16 = 0; + uint16_t crc16 = 0; // Form the 1-Wire Packet // I2C Write Data with Stop command send_block[send_cnt] = WriteReadDataWithStopCmd; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // I2C Address send_block[send_cnt] = I2C_addr; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // Length field send_block[send_cnt] = length; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // Form the write data for (idx = 0; idx < length; idx++) { send_block[send_cnt] = data[idx]; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); } // # of bytes to Read field send_block[send_cnt] = nu_bytes_read; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // Form the CRC16 - _crc16 = _crc16 ^ 0xFFFF; - send_block[send_cnt++] = (_crc16 & 0xFF); - send_block[send_cnt++] = ((_crc16 >> 8) & 0xFF); + crc16 ^= 0xFFFF; + send_block[send_cnt++] = (crc16 & 0xFF); + send_block[send_cnt++] = ((crc16 >> 8) & 0xFF); // Send Packet bridge_result = send_packet(send_block, send_cnt, status, wr_status); @@ -338,26 +336,26 @@ if (ow_result == OneWireMaster::Success) { //seed the crc for transmit bytes - _crc16 = 0; + uint16_t crc16 = 0; // Form the 1-Wire Packet to send // I2C Write Data with Stop command send_block[send_cnt] = ReadDataWithStopCmd; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // I2C Address send_block[send_cnt] = I2C_addr; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // # of bytes to Read field send_block[send_cnt] = nu_bytes_read; - docrc16(send_block[send_cnt++]); + crc16 = calculateCrc16(crc16, send_block[send_cnt++]); // Form the CRC16 - _crc16 = _crc16 ^ 0xFFFF; - send_block[send_cnt++] = (_crc16 & 0xFF); - send_block[send_cnt++] = ((_crc16 >> 8) & 0xFF); + crc16 ^= 0xFFFF; + send_block[send_cnt++] = (crc16 & 0xFF); + send_block[send_cnt++] = ((crc16 >> 8) & 0xFF); // Send Packet bridge_result = send_packet(send_block, send_cnt, status); @@ -394,7 +392,6 @@ ow_result = master().OWWriteBlock(send_block, 2); if (ow_result == OneWireMaster::Success) { - _i2c_speed = data & 0x03; // Save off _i2c_speed setting to be used by other functions bridge_result = DS28E17::Success; } else @@ -499,26 +496,6 @@ //********************************************************************* -uint16_t DS28E17::docrc16(uint16_t data) -{ - data = ((data ^ (_crc16 & 0xff)) & 0xff); - _crc16 >>= 8; - - if (DS28E17::_oddparity[data & 0xf] ^ DS28E17::_oddparity[data >> 4]) - { - _crc16 ^= 0xc001; - } - - data <<= 6; - _crc16 ^= data; - data <<= 1; - _crc16 ^= data; - - return _crc16; -} - - -//********************************************************************* DS28E17::CmdResult DS28E17::send_packet(const uint8_t * data, uint8_t data_length, uint8_t & status, uint8_t & wr_status) {