calcul CRC7
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

calcul CRC7



  1. #1
    invitef9757625

    calcul CRC7


    ------

    Bonjour,

    je sais que la question à été posée plusieurs fois, mais je ne comprend pas du tout où je me trompe dans mon raisonement. Commençons par le commencement, le CRC sert de vérification lors de transmission comme l'éthernet, USB... Je m'intéresse à la liaison avec une carte SD qui impose un CRC 7.
    La définition du calcul est la suivante:
    The CRC7 check is used for all commands, for all responses except type R3, and for the CSD and CID
    registers. The CRC7 is a 7-bit value and is computed as follows:
    Generator polynomial: G(x) = x7 + x3 + 1.
    M(x) = (first bit) * xn + (second bit) * xn-1 +...+ (last bit) * x0
    CRC[6...0] = Remainder [(M(x) * x7)/G(x)]
    The first bit is the most left bit of the corresponding bit string (of the command, response, CID or CSD).
    The degree n of the polynomial is the number of CRC protected bits decreased by one. The number of
    bits to be protected is 40 for commands and responses (n = 39), and 120 for the CSD and CID (n =
    119).
    Comme indiqué, les messages sont sur 40 bits, soit 5 hexadigits. Dans le cas le plus simple, le message est le suivant:
    (2)010000000000000000000000000 0000000000000=(16)0x40 0x00 0x00 0x00 0x00.
    En cherchant sur internet j'ai vu que G(x)=x^7 + x^3 + 1 correspond à (10)137=(2)10001001. De par le même raisonnement mon message est donc M(x)=x^38 ou 2^38 en base 10.
    on a donc le CRC qui vaut (2^38 * 2^7)%(137)=(2^45)%(137), ce qui donne (10)7=(2)0111 hors je dois trouver (2)1001010=(10)74, où me suis-je trompé???

    j'ai aussi trouvé ce site: https://www.ghsi.de/CRC/index.php?Po...sage=400000000
    (normalement les paramètres sont déjà rentrés) mais le résultat n'est pas bon car il me donne (10)81 comme résultat...

    merci d'avance

    -----

  2. #2
    polo974

    Re : calcul CRC7

    Tu peux toujours te référer au source de linux (lib/crc7.c et include/linux/crc7.h)
    Jusqu'ici tout va bien...

  3. #3
    polo974

    Re : calcul CRC7

    En fait la division et le modulo se font sans retenue (au sens calculatoire du terme).
    In practice CRC calculations resemble long division in binary, except that the subtractions involved do not borrow from more significant digits, and thus become exclusive or operations.
    1+1=0 ici... c'est un xor, la retenue passe à la trappe...

    j'ai mis une adaptation en python du crc7
     Cliquez pour afficher

    il suffit de faire un:
    Code:
    include crc7
    crc7.crc7(0,(0x40,0,0,0,0))
    pour l'exemple donné
    Jusqu'ici tout va bien...

  4. #4
    invitef9757625

    Re : calcul CRC7

    Citation Envoyé par polo974 Voir le message
    En fait la division et le modulo se font sans retenue (au sens calculatoire du terme).
    1+1=0 ici... c'est un xor, la retenue passe à la trappe...
    merci, voyant le dessin et d'après certains site web, je me disais bien qu'il y avait une histoire de xor...
    Par contre j'ai adapté ton programme python en c, et il ne me donne pas les bon résultat:
    73 au lieu de 74 pour 0x40,0,0,0,0
    122 au lieu de 42 pou 0x51,0,0,0,0

    voici mon code au cas où tu verrais une erreur.

     Cliquez pour afficher

  5. A voir en vidéo sur Futura
  6. #5
    polo974

    Re : calcul CRC7

    sizeof(buffer) te renvoies 4 car buffer est un pointeur qui prend 4 octets...
    c'est pas pour rien que j'avais mis la taille en paramètre optionnel...

    sinon pour le source en c
    google(linux crc7.c) pour le .c
    et google(linx crc7.h) pour le .h

    sinon, tu peux le chercher dans le git:
    http://git.kernel.org/?p=linux/kerne...2.6-stable.git
    Jusqu'ici tout va bien...

  7. #6
    invitef9757625

    Re : calcul CRC7

    sizeof(buffer) te renvoies 4 car buffer est un pointeur qui prend 4 octets...
    ben non puisqu'en l'occurence buffer c'est data, qui est composé de 5 octets. Pour moi je ne vois pas de différence entre nos codes à niveau car je ne vois pas pourquoi on voudrait un buffer à 0.

    sinon j'ai trouvé un code en c içi (page 25): http://jmfriedt.free.fr/lm_hs25.pdf
    il suffit juste de remplacer le return crc<<1+1 par return crc.

  8. #7
    polo974

    Re : calcul CRC7

    Citation Envoyé par scoobi Voir le message
    ben non puisqu'en l'occurence buffer c'est data, qui est composé de 5 octets. Pour moi je ne vois pas de différence entre nos codes à niveau car je ne vois pas pourquoi on voudrait un buffer à 0.
    ....
    ben si:
    int crc7(unsigned char crc,int* buffer)

    buffer est de type int* donc de type pointeur (sur un ou des int), donc 4 octets (pointeurs sur 32 bits).

    en C, quand on passe un pointeur, on passe juste l'endroit où se trouve les données, au codeur de se dépatouiller avec.
    et quand on écrit:
    int data[5]={0x51,0x00,0x00,0x00,0x00};
    data est le pointeur sur la zone de données où sont rangés les 5 octets.

    la fonction crc, telle que tu l'as écrite ne peut pas connaître la longueur du tableau. il faut lui passer en argument.

    pour t'en convaincre essaye avec un tableau plus grand, en gardant les 4 premiers octets...
    Jusqu'ici tout va bien...

Discussions similaires

  1. [TIPE] Calcul de la rugotisté par calcul interferentiel (Michelson)
    Par invite6cef25fd dans le forum TPE / TIPE et autres travaux
    Réponses: 2
    Dernier message: 25/03/2010, 17h40
  2. calcul d'un volume pour un calcul de variation de niveau de l'eau
    Par invite034f5860 dans le forum Physique
    Réponses: 2
    Dernier message: 23/11/2009, 12h46
  3. Calcul 3, intégrale triples pour le calcul du volume.
    Par invitebfdf3e04 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 06/12/2008, 07h19
  4. Calcul de force sans calcul vectoriel
    Par Jack Burner dans le forum Physique
    Réponses: 1
    Dernier message: 14/11/2008, 10h42
  5. Calcul taille IPN, calcul de charge
    Par invite22ae5754 dans le forum Technologies
    Réponses: 19
    Dernier message: 24/09/2008, 13h33
Découvrez nos comparatifs produits sur l'informatique et les technologies.