Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: MAXREFDES131_Qt_Demo MAX32630FTHR_iButton_uSD_Logger MAX32630FTHR_DS18B20_uSD_Logger MAXREFDES130_131_Demo ... more
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)
{