forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-06-03 71f8bdb7c63acc381d71105bb950411029f4250f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "crc.h"
 
 
void Init_CRC_CRC_CCITT(void)
{
    CRC_InitTypeDef init_para;
 
    CMU_PERCLK_SetableEx(CRCCLK, ENABLE);    
    
    init_para.CRCSEL = CRC_CR_SEL_CRC16;    /*!<CRCУÑé¶àÏîʽѡÔñ*/
    init_para.RFLTIN = CRC_CR_RFLTIN_BYTE;/*!<CRCÊäÈ뷴ת¿ØÖÆ*/
    init_para.RFLTO = CRC_CR_RFLTO_BYTE;        /*!<CRCÊä³ö·´×ª¿ØÖÆ*/
    init_para.XOR = DISABLE;                            /*!<Êä³öÒì»òʹÄÜ*/
    init_para.PARA = CRC_CR_PARA_SERIAL;/*!<CRC¿ìËÙ¼ÆËãʹÄÜ*/
    init_para.OPWD = CRC_CR_OPWD_BYTE;        /*!<WORD²Ù×÷ʹÄÜ*/
    init_para.CRCPOLY = 0x1021;                     /*!<CRC¶àÏîʽ¼Ä´æÆ÷*/
    init_para.CRC_XOR = 0x0000;                        /*!<ÔËËã½á¹ûÒì»ò¼Ä´æÆ÷*/
    init_para.LFSR = 0x0000;                            /*!<³õʼֵ*/
    CRC_Init(&init_para);
}
 
void Init_CRC_CRC_MODBUS(void)
{
    CRC_InitTypeDef init_para;
 
  CMU_PERCLK_SetableEx(CRCCLK, ENABLE);    
    
    init_para.CRCSEL = CRC_CR_SEL_CRC16;    /*!<CRCУÑé¶àÏîʽѡÔñ*/
    init_para.RFLTIN = CRC_CR_RFLTIN_BYTE;/*!<CRCÊäÈ뷴ת¿ØÖÆ*/
    init_para.RFLTO = CRC_CR_RFLTO_BYTE;        /*!<CRCÊä³ö·´×ª¿ØÖÆ*/
    init_para.XOR = DISABLE;                            /*!<Êä³öÒì»òʹÄÜ*/
    init_para.PARA = CRC_CR_PARA_SERIAL;/*!<CRC¿ìËÙ¼ÆËãʹÄÜ*/
    init_para.OPWD = CRC_CR_OPWD_BYTE;        /*!<WORD²Ù×÷ʹÄÜ*/
    init_para.CRCPOLY = 0x8005;                     /*!<CRC¶àÏîʽ¼Ä´æÆ÷*/
    init_para.CRC_XOR = 0x0000;                        /*!<ÔËËã½á¹ûÒì»ò¼Ä´æÆ÷*/
    init_para.LFSR = 0xFFFF;                            /*!<³õʼֵ*/
    CRC_Init(&init_para);
}
 
 
//CRC-16/CCITT x16+x12+x5+1 0x1021
//Init = 0x0000
//RefIn£¬RefOut
//¼ÆËã½á¹û¸ßµÍ×Ö½Úµ¹ÐòÊä³ö,¸ßλÔÚ×󣬵ÍλÔÚÓÒ¡£
unsigned int CalCRC16_CCITT( uint16 Init, uint08 *DataIn, uint32 Len )
{
    uint32 i;
    uint16 CRC16;
 
    CRC_LFSR_Write(Init);                //³õÖµ¼Ä´æÆ÷
    
    for( i=0; i<Len; i++ )
    {
        CRC_DR_Write(DataIn[i]);//ÊäÈëÊä³ö¼Ä´æÆ÷
        Do_DelayStart();
        {
            if(RESET == CRC_CR_BUSY_Chk())
            {
                break;
            }
        }While_DelayUsEnd(200);
    }
 
    CRC16 = CRC_DR_Read() & 0xffff;
    return CRC16;
}
 
 
//CRC-16/MODBUS x16+x15+x2+1 0x8005
//Init = 0xFFFF
//RefIn£¬RefOut
//¼ÆËã½á¹û¸ßµÍ×Ö½Úµ¹ÐòÊä³ö
unsigned int CalCRC16_MODBUS( uint16 Init, uint08 *DataIn, uint32 Len )
{
    uint32 i;
    uint16 CRC16;
 
    CRC_LFSR_Write(Init);                //³õÖµ¼Ä´æÆ÷
    
    for( i=0; i<Len; i++ )
    {
        CRC_DR_Write(DataIn[i]);//ÊäÈëÊä³ö¼Ä´æÆ÷
        Do_DelayStart();
        {
            if(RESET == CRC_CR_BUSY_Chk())
            {
                break;
            }
        }While_DelayUsEnd(200);
    }
 
    CRC16 = CRC_DR_Read() & 0xffff;
    return CRC16;
}
 
 
//Õâ¸öоƬµÄÓ²¼þCRCÐèÒªÕâô²Ù×÷£¬ÎÒÃÇÔ­±¾Ð´µÄÈí¼þCRC²»ÐèÒªµÄ¡£  0xffffºÍ0x0000Õâôת»»Ö®ºó¶¼ÊÇÔ­Öµ¡£
unsigned int BitChange(unsigned int us_DataIn)
{
    unsigned int us_Data = us_DataIn;
    us_Data = ((us_Data & 0xFF00) >> 8) | ((us_Data & 0x00FF) << 8);
    us_Data = ((us_Data & 0xF0F0) >> 4) | ((us_Data & 0x0F0F) << 4);
    us_Data = ((us_Data & 0xCCCC) >> 2) | ((us_Data & 0x3333) << 2);
    us_Data = ((us_Data & 0xAAAA) >> 1) | ((us_Data & 0x5555) << 1);
 
    return (us_Data);
}