📄 owicrc.c
字号:
// This file has been prepared for Doxygen automatic documentation generation.
/*! \file ********************************************************************
*
* Atmel Corporation
*
* \li File: OWIcrc.c
* \li Compiler: IAR EWAAVR 3.20a
* \li Support mail: avr@atmel.com
*
* \li Supported devices: All AVRs.
*
* \li Application Note: AVR318 - Dallas 1-Wire(R) master.
*
*
* \li Description: CRC algorithms typically used in a 1-Wire(R)
* environment.
*
* $Revision: 1.7 $
* $Date: Thursday, August 19, 2004 14:27:16 UTC $
****************************************************************************/
#include "OWIcrc.h"
#include "OWIdefs.h"
/*! \brief Compute the CRC8 value of a data set.
*
* This function will compute the CRC8 or DOW-CRC of inData using seed
* as inital value for the CRC.
*
* \param inData One byte of data to compute CRC from.
*
* \param seed The starting value of the CRC.
*
* \return The CRC8 of inData with seed as initial value.
*
* \note Setting seed to 0 computes the crc8 of the inData.
*
* \note Constantly passing the return value of this function
* As the seed argument computes the CRC8 value of a
* longer string of data.
*/
unsigned char OWI_ComputeCRC8(unsigned char inData, unsigned char seed)
{
unsigned char bitsLeft;
unsigned char temp;
for (bitsLeft = 8; bitsLeft > 0; bitsLeft--)
{
temp = ((seed ^ inData) & 0x01);
if (temp == 0)
{
seed >>= 1;
}
else
{
seed ^= 0x18;
seed >>= 1;
seed |= 0x80;
}
inData >>= 1;
}
return seed;
}
/*! \brief Compute the CRC16 value of a data set.
*
* This function will compute the CRC16 of inData using seed
* as inital value for the CRC.
*
* \param inData One byte of data to compute CRC from.
*
* \param seed The starting value of the CRC.
*
* \return The CRC16 of inData with seed as initial value.
*
* \note Setting seed to 0 computes the crc16 of the inData.
*
* \note Constantly passing the return value of this function
* As the seed argument computes the CRC16 value of a
* longer string of data.
*/
unsigned int OWI_ComputeCRC16(unsigned char inData, unsigned int seed)
{
unsigned char bitsLeft;
unsigned char temp;
for (bitsLeft = 8; bitsLeft > 0; bitsLeft--)
{
temp = ((seed ^ inData) & 0x01);
if (temp == 0)
{
seed >>= 1;
}
else
{
seed ^= 0x4002;
seed >>= 1;
seed |= 0x8000;
}
inData >>= 1;
}
return seed;
}
/*! \brief Calculate and check the CRC of a 64 bit ROM identifier.
*
* This function computes the CRC8 value of the first 56 bits of a
* 64 bit identifier. It then checks the calculated value against the
* CRC value stored in ROM.
*
* \param romvalue A pointer to an array holding a 64 bit identifier.
*
* \retval OWI_CRC_OK The CRC's matched.
* \retval OWI_CRC_ERROR There was a discrepancy between the calculated and the stored CRC.
*/
unsigned char OWI_CheckRomCRC(unsigned char * romValue)
{
unsigned char i;
unsigned char crc8 = 0;
for (i = 0; i < 7; i++)
{
crc8 = OWI_ComputeCRC8(*romValue, crc8);
romValue++;
}
if (crc8 == (*romValue))
{
return OWI_CRC_OK;
}
return OWI_CRC_ERROR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -