Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DS2411
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
addi
Здравствуйте

Читаю 64 битный идентификатор по 1 wire, достоверно получаю один и тот же код и идентификатор производителя
Осталось проверить CRC, которая ко мне приходит вместе с данными.
Согласно даташиту подсчет должен быть для 8 бит - CRC is: CRC = x8 + x5 + x4 + 1.
Взял исходники у атмела по этому поводу , скомпилировал под свой буфер следующим образом:
Код
unsigned char flag=0, tempdata[9];

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;    
}
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 1;
    }
    return 0;
}
// заполняем tempdata 64-битным идентификатором......

if(OWI_CheckRomCRC(tempdata))
    {
        flag = CRC_OK;
    }

В итоге совпадения между подсчитываемой по 7 байтам tempdata и принимаемой CRC нет.
Может кто сталкиался, приведите пожадуйста пример кода подсчета и сравнения CRC.

Заранее благодарен
Dr.NoA
Расчет CRC:
Код
unsigned char OW_CRC_Byte(unsigned char CRC, unsigned char Data)
{
  unsigned char i;

  CRC ^= Data;
  for(i = 0; i < 8; i++)
  {
    if (CRC & 0x01)
      CRC = (CRC >> 1) ^ 0x8C;
    else
      CRC >>= 1;
  }

  return CRC;
}

unsigned char OW_Checksum(unsigned char *DataBuf, unsigned char Size)
{
  unsigned char CRC;

  CRC = 0;
  while (Size--)
  {
    CRC = OW_CRC_Byte(CRC, *DataBuf++);
  }

  return CRC;
}


Пример использования:
Код
  unsigned char i;
  unsigned char Data[8];

  OW_WriteByte(0x33);
  for (i = 0; i < 8; i++)
    Data[i] = OW_ReadByte();
  if (OW_Checksum(Data, 8))
    return; // CRC error
_NB
Посмотрите мой фрагмент рабочей программы:
Код
static unsigned char _crc8(unsigned char *buf, int num ) {

  static const unsigned char crc8_tbl[] = {
   0,  94, 188, 226,  97,  63, 221, 131, 194, 156, 126,  32, 163, 253,  31,  65,
  157, 195,  33, 127, 252, 162,  64,  30,  95,   1, 227, 189,  62,  96, 130, 220,
   35, 125, 159, 193,  66,  28, 254, 160, 225, 191,  93,   3, 128, 222,  60,  98,
  190, 224,   2,  92, 223, 129,  99,  61, 124,  34, 192, 158,  29,  67, 161, 255,
   70,  24, 250, 164,  39, 121, 155, 197, 132, 218,  56, 102, 229, 187,  89,   7,
  219, 133, 103,  57, 186, 228,   6,  88,  25,  71, 165, 251, 120,  38, 196, 154,
  101,  59, 217, 135,   4,  90, 184, 230, 167, 249,  27,  69, 198, 152, 122,  36,
  248, 166,  68,  26, 153, 199,  37, 123,  58, 100, 134, 216,  91,   5, 231, 185,
  140, 210,  48, 110, 237, 179,  81,  15,  78,  16, 242, 172,  47, 113, 147, 205,
   17,  79, 173, 243, 112,  46, 204, 146, 211, 141, 111,  49, 178, 236,  14,  80,
  175, 241,  19,  77, 206, 144, 114,  44, 109,  51, 209, 143,  12,  82, 176, 238,
   50, 108, 142, 208,  83,  13, 239, 177, 240, 174,  76,  18, 145, 207,  45, 115,
  202, 148, 118,  40, 171, 245,  23,  73,   8,  86, 180, 234, 105,  55, 213, 139,
   87,   9, 235, 181,  54, 104, 138, 212, 149, 203,  41, 119, 244, 170,  72,  22,
  233, 183,  85,  11, 136, 214,  52, 106,  43, 117, 151, 201,  74,  20, 246, 168,
  116,  42, 200, 150,  21,  75, 169, 247, 182, 232,  10,  84, 215, 137, 107,  53
  };

  unsigned char crc = 0;

  while ( num-- )
    crc = crc8_tbl[(crc ^ (*buf++)) & 0xff];

  return( crc );
}
// Read SerialNumber form chip
// Input: buf - buffer for SN (6 bytes)
// Output: TRUE  - read correct SN
//         FALSE - error
int GetSerialNumber(unsigned char *buf) {
  unsigned char read_buff[8];
  unsigned char i,val;
  int res;
  
    OWReset();  
    OWWriteByte(0x33);  

  // read ROM-data  
  for(i = 0; i < 8; i++) {
    val = OWReadByte();
    read_buff[i] = val;
    if ((i > 0) && (i < 7)) buf[i-1] = val;
  }

  // check readed data
  res = 1;
  if (read_buff[0] != DS_FAMILY_CODE) res = 0;
  if (read_buff[7] != _crc8(&read_buff[0],7)) res = 0;
  return res;
}

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.