DS18B20 VS CRC-8

Тема в разделе "WASM.ELECTRONICS", создана пользователем skyproc, 31 дек 2008.

  1. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Доброго всем времени суток...

    Собрал я device на PICe и повесил на одну шину (1-Write протокол от DALLAS)
    два DS18B20

    После команы Serch ROM (F0h)
    Читаем данные и ...
    Для первого датчика :8400FE0001B8F928h

    После команы Serch ROM (F0h)
    Читаем данные и ...
    Для второго датчика :F000FE0001CFE728h

    С кодом семейства всё OK - 28h, что значит DS18B20

    Судая по datasheets на DS18B20 последний байт CRC-8.
    Команда Match ROM (55h )не выполняется, что наводит на мысль о не правильных LASERED ROM CODE

    написал программу подсчета CRC-8 по алгоритму из книги - Ross N. Williams
    "Элементарное руководство по CRC алгоритмам обнаружения ошибок"

    Вол алгоритм:
    Для примера возьмем полином 4й степени (W=4), и пусть этим по
    линомом будет 10111. В таком случае для выполнения деления нам потребуется
    4 битный регистр.
    
    (Напомню: выровненное сообщение это наша исходная последовательность,
    дополненная W нулевыми битами.)
    Деление выполняется следующим способом:

    Загрузим регистр нулевыми битами
    Дополним хвостовую часть сообщения W нулевыми битами
    While (пока еще есть необработанные биты)
    Begin
    Сдвинем регистр на 1 бит влево и поместим очередной
    еще не обработанный бит из сообщения в 0 позицию регистра.
    If (из регистра был выдвинут бит со значением "1")
    Регистр = Регистр XOR Полином
    End
    Теперь в регистре содержится остаток, вероятно CRC

    Вот моя реализация по данному алгоритму CRC-8:

    xor eax,eax
    xor edx,edx
    mov ebx,offset ID_T

    mov eax,InitReg ;здесь 0 или 0FFh по выбору
    and eax,0FFh

    @ExtLoop:
    mov dl,byte ptr [ebx]
    mov ecx,8


    @InLoop:
    shl al,1
    pushfd
    shl dl,1
    jnc @DL_0
    or al,01h
    @DL_0:
    popfd
    jnc @CF_0
    xor al,Polynom8

    @CF_0:


    dec ecx
    test ecx,ecx
    jnz @InLoop

    inc ebx
    cmp ebx,offset Polynom8
    jnz @ExtLoop




    InitReg dd 0
    ID_T db 028h,0F9h,0B8h,001h,000h,0FEh,000h,0
    Polynom8 db 31h ;полином X^8+X^5+X^4+1

    В результате при
    InitReg = 0 -> CRC-8 = BEh
    InitReg = FFh -> CRC-8 = 05h

    Вероятно я в чем-то ошибаюсь...
    У кого какие мысли?
     
  2. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Я не спец по ПИКам, но мне кажется, что код то не под ПИК.
    А реализация CRC8 видел в доках по 1W.
    Вот один вариант, правда под АВР.
    Код (Text):
    1. PROC Do_CRC
    2.     push    ACC
    3.     push    ACCH
    4.     push    ACC
    5.     ldi     ACCH,   8
    6.   CRC_1:
    7.     eor     ACC,    CRC
    8.     ror     ACC
    9.     mov     ACC,    CRC
    10.     brcc    Bit_Zero
    11.     ldi     tmpHL,  $18
    12.     eor     ACC,    tmpHL
    13.   Bit_Zero:
    14.     ror     ACC
    15.     mov     CRC,    ACC
    16.     pop     ACC
    17.     rr      ACC
    18.     push    ACC
    19.     dec     ACCH
    20.     brne    CRC_1
    21.     pop     ACC
    22.     pop     ACCH
    23.     pop     ACC
    24.     ret
    25. ENDP Do_CRC
    Первый вызов CRC = 0, ACC = data[0]
    последующие ACC = data[1..2..3..4..5..6..итд]
     
  3. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Код под Win32
    C AVR не знаком, хотелось бы под PIC...
    Может у кого есть описание алгоритма для DS18B20
     
  4. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Нашел ошибку в коде для PIC

    Вот какие LASERED ROM CODE получились после этого...

    1 - 84000001CDB8F928h
    2 - F0000001CDCFE728h
    Сделал вот так:
    Search ROM потом читаю датчик №1
    Search ROM потом читаю датчик №2

    И усё работает как надо!

    LASERED ROM CODES скорей всего корректны, но CRC-8 не совпадает.
    Вопрос о алгоритме расчета CRC-8 для DALLAS, пока до конца не ясен.
    :dntknw:
     
  5. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Фу-ффффффф...
    Ну и работенка.

    Вот алгоритм длявычисления CRC-8 для DALLAS

    1. Нахождение логического исключающего ИЛИ между младшим битом CRC и младшим битом данных.
    2. Если результат равен 0, то:
    a. Сдвиг вправо CRC.
    3. Если результат равен 1:
    a. Поиск нового значения CRC путем вычисления логического исключающего ИЛИ между CRC и полиномом CRC.
    b. Сдвиг вправо CRC.
    c. Установка старшего бита CRC в 1.
    4. Сдвиг вправо данных.
    5. Повтор данной последовательности 8 раз на 1 байт данных.


    Вот код на Asmе, вполне работоспособный для вычисления CRC-8:

    xor eax,eax
    xor edx,edx
    mov ebx,offset ID_T

    mov eax,00h

    @ExtLoop:
    mov dl,byte ptr [ebx]
    mov ecx,8


    @InLoop:
    push eax
    push edx

    xor al,dl
    shr al,1
    jnc @CF_0

    pop edx
    pop eax

    xor al,Polynom8
    shr al,1
    or al,10000000b
    jmp @ExitLoop

    @CF_0:
    pop edx
    pop eax

    shr al,1
    @ExitLoop:
    shr dl,1


    dec ecx
    test ecx,ecx
    jnz @InLoop

    inc ebx
    cmp ebx,offset Polynom8
    jnz @ExtLoop

    and eax,0FFh

    ;Здесь EAX = 84 для данного примера
    ;Собственно это и есть CRC-8


    ID_T db 028h,0F9h,0B8h,0CDh,001h,000h,000h
    Polynom8 db 18h ;полином X^8+X^5+X^4+1 - ну не уверен что 18h это именно этот полином

    Только мне не понятно почему не подходит алгоритм из книги -
    Ross N. Williams "Элементарное руководство по CRC алгоритмам обнаружения ошибок"
    который я выложил выше и почему берем полином 18h (X^8+X^4+X^3),
    в datasheet на DS18B20 указан X^8+X^5+X^4+1 т.е. 31h...
     
  6. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    http://www.ibutton.com/ibuttons/standard.pdf
    ст. 127 (136)
    Черным по белому написана реализация алгоса.
    То, что я раньше писал (пост #2) копия, но под AVR, изначально было под 8051.

    18h по тому, что 31h = 18h * 2 + 01h, где 01h - флаг переноса.