Dallas CRC8 Routines


Closed Thread
Results 1 to 24 of 24

Hybrid View

  1. #1


    Did you find this post helpful? Yes | No

    Default

    If I used this line of code:

    owin portb.7, 0, [temp.byte0,temp.byte1,SKIP 6,crc_value]

    Would the calculated CRC be the same value as crc_value?

  2. #2
    Join Date
    Jan 2004
    Location
    Grand Lake O' Cherokees USA
    Posts
    15


    Did you find this post helpful? Yes | No

    Default

    More than likely no.

    You don't state which and I may not be familiar with the 1 wire device you are using but normally you would not be able to skip any characters it transmits. They would all need to be received and included in the CRC calculation. You will need to read the data sheet for the 1 wire device you are using to see what all is included in the CRC total.

    To get that total feed each byte into the CRC routine, The CRC will be calculated and after all bytes that the manufacturer has included in the CRC total have been passed trough it, the CRC should be the same as the CRC received from the 1 wire device.

    Tom
    Tom

  3. #3


    Did you find this post helpful? Yes | No

    Default

    I actually working with the DS18S20 chip. From what I'm reading though it sounds like I calculate the CRC from the bytes read. Is this correct?

  4. #4
    Join Date
    Jan 2004
    Location
    Grand Lake O' Cherokees USA
    Posts
    15


    Did you find this post helpful? Yes | No

    Default

    I am not familiar with the DS18S20 but a quick look at the data sheet shows the CRC is calculated by reading all 8 bytes of the scratchpad memory, running them through the CRC routine and comparing its output to the 9th byte read from the scratchpad which is the CRC value generated by the DS18S20. See example 3 in the datasheet.
    Tom

  5. #5


    Did you find this post helpful? Yes | No

    Default

    I think I can now safely say I'm completely lost as this is making no sense to me. Do I calculate the CRC for each bit using bit0 ^ bit1... and then XOR all the bytes one at a time or do I just XOR the bytes themselves? Please excuse my lack of understanding as this is all new to me.

  6. #6
    Join Date
    Jan 2004
    Location
    Grand Lake O' Cherokees USA
    Posts
    15


    Did you find this post helpful? Yes | No

    Default

    You should read Dallas Application note #27 Understanding and using cyclic redundancy checks.

    You will need to select one of the three provided crc8 routines and put that in your PBP program. You call it as a subroutine. Each routine does the same thing but take different amounts of time/different amounts of programming space doing it. These routines operate on a byte at a time not a bit at a time. They do the bit calculations for you.

    Receive one byte from the device or more likely, you will have to receive all bytes that are included in the crc check and place them in appropriate variables or an array. Make the variable CRCData = the first byte then do a gosub to the name of the CRC subroutine. Do the same thing for the second byte, third, etc. After all the bytes have been passed through the CRC routine then the variable CRC will contain the crc value that should match the one sent from the device.
    Tom

  7. #7
    taats's Avatar
    taats Guest


    Did you find this post helpful? Yes | No

    Default Similar Problem

    Hi Tom,

    I read your posts too about the CRC8, but i'm confused.
    I have a divice connected to my COM1-port and I want to read the information the device sends. This device demands the CRC8-protocol is used.

    the form of communications is like this:
    =====
    functioncode(1 byte), number of data-bytes(2 bytes),data(x byte),checkbyte(1 byte)
    =====

    i'm doing my project in Visual Basic 6.0.

    the sub has this code in it right now. this doesn't work... have got any ideas?? or anyone else?


    =====

    Private Sub CRC8(ByRef data() As Variant)
    '--------------------------------------------------------------------------
    ' Function : (Private) CRC8
    ' Description : computes a 1 byte checksum using bytes 1 to 7 of the
    ' Header 8-byte array (Protocol Header)
    '
    ' Parameter : Data ()As Byte | each byte group is assumed to be High byte first, Low byte last
    ' Return Value : CRC8 as Byte | CRC value
    '--------------------------------------------------------------------------
    Dim crc As Byte
    Dim Length As Byte
    Dim Index As Byte
    Dim CRCtable1() As Variant
    crc = 0
    Length = 1
    CRCtable1 = Array( _
    &H0, &H7, &HE, &H9, &H1C, &H1B, &H12, &H15, &H38, &H3F, &H36, &H31, &H24, &H23, &H2A, &H2D, &H70, &H77, &H7E, &H79, &H6C, &H6B, &H62, &H65, &H48, &H4F, &H46, &H41, &H54, &H53, &H5A, &H5D, _
    &HE0, &HE7, &HEE, &HE9, &HFC, &HFB, &HF2, &HF5, &HD8, &HDF, &HD6, &HD1, &HC4, &HC3, &HCA, &HCD, &H90, &H97, &H9E, &H99, &H8C, &H8B, &H82, &H85, &HA8, &HAF, &HA6, &HA1, &HB4, &HB3, &HBA, &HBD, _
    &HC7, &HC0, &HC9, &HCE, &HDB, &HDC, &HD5, &HD2, &HFF, &HF8, &HF1, &HF6, &HE3, &HE4, &HED, &HEA, &HB7, &HB0, &HB9, &HBE, &HAB, &HAC, &HA5, &HA2, &H8F, &H88, &H81, &H86, &H93, &H94, &H9D, &H9A, _
    &H27, &H20, &H29, &H2E, &H3B, &H3C, &H35, &H32, &H1F, &H18, &H11, &H16, &H3, &H4, &HD, &HA, &H57, &H50, &H59, &H5E, &H4B, &H4C, &H45, &H42, &H6F, &H68, &H61, &H66, &H73, &H74, &H7D, &H7A, _
    &H89, &H8E, &H87, &H80, &H95, &H92, &H9B, &H9C, &HB1, &HB6, &HBF, &HB8, &HAD, &HAA, &HA3, &HA4, &HF9, &HFE, &HF7, &HF0, &HE5, &HE2, &HEB, &HEC, &HC1, &HC6, &HCF, &HC8, &HDD, &HDA, &HD3, &HD4, _
    &H69, &H6E, &H67, &H60, &H75, &H72, &H7B, &H7C, &H51, &H56, &H5F, &H58, &H4D, &H4A, &H43, &H44, &H19, &H1E, &H17, &H10, &H5, &H2, &HB, &HC, &H21, &H26, &H2F, &H28, &H3D, &H3A, &H33, &H34, _
    &H4E, &H49, &H40, &H47, &H52, &H55, &H5C, &H5B, &H76, &H71, &H78, &H7F, &H6A, &H6D, &H64, &H63, &H3E, &H39, &H30, &H37, &H22, &H25, &H2C, &H2B, &H6, &H1, &H8, &HF, &H1A, &H1D, &H14, &H13, _
    &HAE, &HA9, &HA0, &HA7, &HB2, &HB5, &HBC, &HBB, &H96, &H91, &H98, &H9F, &H8A, &H8D, &H84, &H83, &HDE, &HD9, &HD0, &HD7, &HC2, &HC5, &HCC, &HCB, &HE6, &HE1, &HE8, &HEF, &HFA, &HFD, &HF4, &HF3 _
    )
    Do While Length < 7
    Index = crc Xor data(Length)
    crc = CRCtable1(Index)
    Length = Length + 1
    Loop
    CHK8 = crc
    End Sub

    =====

    thanks,

    Taats

Similar Threads

  1. Problems with CRC8 Calc in 1Wire
    By JohnB in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 16th March 2007, 22:01
  2. dallas ibutton to pics
    By CBUK in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 25th October 2006, 12:55
  3. Dallas 1-wire search Routine
    By jimbab in forum Code Examples
    Replies: 0
    Last Post: - 7th April 2006, 16:14
  4. Dallas Semiconductor Components Serial Numbers
    By ideaman234 in forum General
    Replies: 2
    Last Post: - 27th February 2006, 22:17
  5. Dallas CRC16 Routines
    By Tom Estes in forum Code Examples
    Replies: 0
    Last Post: - 16th May 2005, 15:29

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts