mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC - CRC16-CCIT-FALSE- Checksumme


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe einen dsPIC33ep256mu805 µC und studiere gerade auf der 
Homepage von Microchip
http://www.microchip.com/wwwproducts/en/dsPIC33EP256MU806
das CodeExample zum Hardware CRC Modul 
http://ww1.microchip.com/downloads/en/DeviceDoc/ce451_%20crc_generation.zip

Dieses Code-Example funktioniert bei mir gut, wenn ich allerdings den 
"Initial-Value" auf beliebige Werte verstelle (also die Variable mit dem 
Namen "prev_CRC") dann wird bei mir die checksum nicht richtig 
berechnet.

Normalerweise kann ich ja durch den initialwert bestimmen, was für Arten 
von CRC´s berechnet werden. z.B. CRC16-CCIT-FALSE mit dem initial Value 
von 0xFFFF. Und genau dieses CRC-CCIT-FALSE möchte ich berechnen.

Hier ist das CodeExample (zuerst Poste ich das Header-File, dann das C - 
File)....wenn jemand eine Ahnung hat, wie man aus diesem CRC-CCIT-ZERO 
(funktioniert) eine CRC-CCIT-FALSE (funktioniert nicht bei mir) machen 
kann, bitte melden,

Danke und LG Christian

HEADERFILE############################################################## 
######################################################################## 
######################################################################## 
######################################################################## 
############
/*******************************************************************************
  CRC API header file

  Company:
    Microchip Technology Inc.

  File Name:
    crc.h

  Summary:
    Declarations for CRC functions.

  Description:
    This header file consists of the declaration of the 
    CRC initialization function and also the checksum calculation function. 
*******************************************************************************/
/*******************************************************************************
Copyright (c) 2012 released Microchip Technology Inc.  All rights reserved.

Microchip licenses to you the right to use, modify, copy and distribute
Software only when embedded on a Microchip microcontroller or digital signal
controller that is integrated into your product or third party product
(pursuant to the sublicense terms in the accompanying license agreement).

You should refer to the license agreement accompanying this Software for
additional information regarding your rights and obligations.

SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
*******************************************************************************/
#ifdef __cplusplus          // Provide C++ Compatability
extern "C"
{
    #endif

    // *****************************************************************************
    // *****************************************************************************
    // Section: Constants
    // *****************************************************************************
    // *****************************************************************************
    #define POLYLEN 0x000F  // Length of polynomial-1"
    #define POLY    0x1021  // Generator Polynomial

    // X^12 + X^5
    //#define POLY  0X0810
    // *****************************************************************************
    // *****************************************************************************
    // Section: Interface Routines
    // *****************************************************************************
    // *****************************************************************************
    uint16_t    CRC_ChecksumWord( uint16_t *, uint16_t, uint16_t );
    uint16_t    CRC_ChecksumByte( uint8_t *, uint8_t, uint16_t );
    void        CRC_Init( void );

    #ifdef __cplusplus      // Provide C++ Compatibility
}

#endif

/*******************************************************************************
 End of File
*/


SOURCEFILE############################################################## 
######################################################################## 
######################################################################## 
######################################################################## 
############
/*******************************************************************************
  ce451 main faunction
  
  Company:
    Microchip Technology Inc.

  File Name:
    crc_generation.c

  Summary:
    This file is used to call CRC APIs

  Description:
    The main.c is used to call the CRC Initialization function and function to calculate checksum.
 *******************************************************************************/
/*******************************************************************************
Copyright (c) 2012 released Microchip Technology Inc.  All rights reserved.

Microchip licenses to you the right to use, modify, copy and distribute
Software only when embedded on a Microchip microcontroller or digital signal
controller that is integrated into your product or third party product
(pursuant to the sublicense terms in the accompanying license agreement).

You should refer to the license agreement accompanying this Software for
additional information regarding your rights and obligations.

SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
 *******************************************************************************/
// *****************************************************************************
// *****************************************************************************
// Section: Included Files
// *****************************************************************************
// *****************************************************************************
#include <xc.h>
#include <stdint.h>
#include "crc.h"


// Expected result depends on the contents of messageString[8] Array. If the content is changed
// the below CRC value may not suit. The below CRC checksum is for data 0x01 to 0x08(given).

#define EXPECTED_RESULT 0x76AC

// *****************************************************************************
// *****************************************************************************
// Section: File Scope or Global Constants
// *****************************************************************************
// *****************************************************************************
uint8_t messageString[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
uint16_t    crcResult=0;
/******************************************************************************
 * Function:        int main(void)
 *
 * PreCondition:    None
 *
 * Input:           None
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Main function
 *****************************************************************************/
#ifdef TEST_MODE
int ce_main(void)
#else
int main(void)
#endif
{
    uint16_t    prev_CRC = 0x0000;
  
    CRC_Init();

     Nop();
     Nop();

    crcResult = CRC_ChecksumByte( messageString, 8, prev_CRC );
#ifdef TEST_MODE
    if(crcResult == EXPECTED_RESULT )
        return 0;
    else
        return 1;
#else
    while( 1 );
#endif
}

/******************************************************************************
 * Function:        void CRC_Init(void)
 *
 * PreCondition:    None   
 *
 * Input:           None
 *                  
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        This function configures CRC module
 *****************************************************************************/
void CRC_Init( void )
{

    CRCCON1bits.CRCEN = 0;
    CRCXORL = 0x0000;
         Nop();
         Nop();

    CRCWDATL = 0x0000;

    CRCWDATH = 0x0000;   //  NOTE:Non-direct Initial value fed to CRCWDAT
    CRCXORL = POLY;             // Generator Polynomial // X^12 + X^5
    CRCXORH = 0x0000;
    CRCCON1bits.CRCISEL = 0;
    CRCCON2bits.PLEN = POLYLEN; // Length of polynomial-1"
    CRCCON2bits.DWIDTH = 7;
    CRCCON1bits.LENDIAN = 0x0;
    CRCCON1bits.CRCEN = 1;
}

/******************************************************************************
 * Function:        uint16_t CRC_ChecksumByte(uint8_t* data, uint8_t Number_of_bytes, uint16_t prev_CRC)
 *
 * PreCondition:    None
 *
 * Input:           data - Pointer to the first data byte for which CRC needs to be
 *                  calculated.
 *                  Number_of_bytess - Total number of bytes for which CRC needs to be
 *                  calculated.
 *                  prev_CRC - previous CRC result.
 *
 * Output:          CRCWDATL Register content that is the two byte checksum
 *
 * Side Effects:    None
 *
 * Overview:        Calculates the checksum and returns the value
 *****************************************************************************/
uint16_t CRC_ChecksumByte( uint8_t *data, uint8_t Number_of_bytes, uint16_t prev_CRC )
{
    uint8_t volatile    *dest = ( uint8_t * ) &CRCDATL;

  
    CRCWDATL = prev_CRC;
    IFS4bits.CRCIF=0;        //CRC status Flag is Cleared
    do
    {
       while( (0 == CRCCON1bits.CRCFUL) && (0 < Number_of_bytes) )
        {
            *dest = *data;
            data++;
            Number_of_bytes--;
        }
    } while( 0 < Number_of_bytes );
 CRCCON1bits.CRCGO = 1;
 CRCDATL = 0x0000;   /* Do this to shift the last word out of the CRC shift register */
 while( CRCCON1bits.CRCFUL == 1 );
    

   
        Nop();
        Nop();
        Nop();
        Nop();
        Nop();
        Nop();
  while(CRCCON1bits.CRCMPT!=1);

        Nop();
        Nop();
        Nop();
        Nop();
        Nop();
        Nop();
  while(IFS4bits.CRCIF!=1);

        Nop();
        Nop();
        Nop();
        Nop();
        Nop();
        Nop();
  CRCCON1bits.CRCGO=0;
        Nop();
        Nop();
        Nop();
        Nop();
        Nop();
    return ( CRCWDATL );
}

/*******************************************************************************
 End of File
 */



Beitrag #5478331 wurde von einem Moderator gelöscht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.