forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-06-07 fa6053f85287163f6e2d5dba690bec05cbc95f4a
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
108
109
110
111
#include "system_flash_mem_manage.h"
#include "off_chip_flash.h"
#include "system_general_para.h"
#include "mbcrc1.h"
 
 
//flashÊý¾ÝдÈëºÍ¶ÁÈ¡¼ì²é,Ö»Ö§³Ö1024¸ö×Ö½ÚµÄдÈëÓë¶ÁÈ¡¼ì²é
ErrorStatus    FlashWriteAndReadCheck(uint8_t * write_data,uint32_t addr,uint16_t length)
{
    uint8_t    buf_l[1024];
    
    if(length >1024)    
        return FAIL;
    
 
    Out_Flash_MultipleWrite(write_data,addr,length);
    
    Out_Flash_MultipleRead(buf_l,addr,length);
    
    return ucharcmp(write_data,buf_l,length);
}
 
 
//flashÊý¾Ý¶à´ÎдÈ룬дÈë´íÎóʱ¶à´ÎÖØÐ´
ErrorStatus    FlashMultipleWriteAndReadCheck(uint8_t * write_data,uint32_t addrA,uint16_t length)
{
    ErrorStatus    return_flag = PASS;
    if(FlashWriteAndReadCheck(write_data,addrA,length)==FAIL)
    {
        if(FlashWriteAndReadCheck(write_data,addrA,length)==FAIL)
        {
            return_flag = FAIL;
        }
    }
    
    return return_flag;
}
 
 
//flashÊý¾Ý¶ÁÈ¡£¬²¢Ð£ÑéCRC
ErrorStatus    FlashMultipleReadAndCrcCheck(uint8_t * read_data,uint32_t addrA,uint16_t length)
{
    ErrorStatus    return_flag = PASS;
    uint8_t    buf_l[1024];
    uint16_t crc_modbus = 0;
    
    if(length >1024)    
        return FAIL;
    
    Out_Flash_MultipleRead(buf_l,addrA,length);
    crc_modbus = buf_l[0] + ((uint16_t)buf_l[1]<<8);
    if(crc_modbus != usMBCRC16(0xFFFF,&buf_l[2], length - sizeof(crc_modbus) )){
        Out_Flash_MultipleRead(buf_l,addrA,length);
        crc_modbus = buf_l[0] + ((uint16_t)buf_l[1]<<8);
        if(crc_modbus != usMBCRC16(0xFFFF,&buf_l[2], length - sizeof(crc_modbus) )){
            return_flag = FAIL;
        }else{
            arrayA_2_arrayB(buf_l,read_data,length,LITTLE_ENDIAN);
        }
    }else
    {
        arrayA_2_arrayB(buf_l,read_data,length,LITTLE_ENDIAN);
    }
    
    return return_flag;
}
 
 
 
 
 
 
 
/*flashÈÕÖ¾²Ù×÷µØÖ·ÅжÏ,ÌõÊýÈç¹ûÌ«¶à£¬¿ÉÄÜÑ­»·±È½Ï±È½Ï·Ñʱ¼ä£¬ÐèÒª²âÊÔ!!!!!!!!!
*input£ºOpAddr:²Ù×÷µØÖ·£»  StartAddr£ºÆðʼµØÖ·    length£ºµ¥ÌõÈÕÖ¾³¤¶È            MaxNum£ºÈÕÖ¾×î´óÌõÊý
*return£º·µ»ØFAIL±íʾµØÖ·²»ÕýÈ·
*/
ErrorStatus    FlashLogAddrCheck(uint32_t OpAddr,uint32_t StartAddr,uint16_t length,uint16_t MaxNum)
{
    uint32_t    count_i = 0;
    uint32_t    next_addr = StartAddr;
    if((MaxNum ==0)||(OpAddr>=OUT_FLASH_ALL_SIZE)||(StartAddr>=OUT_FLASH_ALL_SIZE)||(length >1024))
        return FAIL;
    
    while(count_i<MaxNum){
        if(OpAddr == next_addr)
            return PASS;
        else
            next_addr += length;
        
        if(++count_i > 0xFFFF){
            break;
        }
    }
    return FAIL;
}
 
/*flashÈÕÖ¾»ñÈ¡ÉÏÒ»ÌõµØÖ·£¬²»ÅжÏÉÏÒ»ÌõµØÖ·ÊÇ·ñ´æÓÐÊý¾Ý
*input£ºOpAddr:²Ù×÷µØÖ·£»  StartAddr£ºÆðʼµØÖ·    length£ºµ¥ÌõÈÕÖ¾³¤¶È            EndAddr£º½áÊøµØÖ·
*return£ºÉÏÒ»ÌõµØÖ·
*/
uint32_t    FlashLogPreviousAddrGet(uint32_t OpAddr,uint32_t StartAddr,uint16_t length,uint32_t EndAddr)
{
    uint32_t    previous_addr = StartAddr;
    if(OpAddr == StartAddr){
        previous_addr = EndAddr;
    }else{
        previous_addr    = OpAddr - length;
    }
    return previous_addr;
}