1 #include "flash.h"
2 #include "eeprom.h"
3 #include <string.h>
4 
5 /******************************************************************************
6 * Global variables
7 ******************************************************************************/
8 
9 /******************************************************************************
10 * Constants and macros
11 ******************************************************************************/
12 
13 
14 /******************************************************************************
15 * Local types
16 ******************************************************************************/
17 
18 /******************************************************************************
19 * Local function prototypes
20 ******************************************************************************/
21 
22 /******************************************************************************
23 * Local variables
24 ******************************************************************************/
25 
26 /******************************************************************************
27 * Local functions
28 ******************************************************************************/
29 
30 
31 /******************************************************************************
32 *
33 * EEPROM �����������eeprom
34 *�����������ַ�������������adr���ڵ�512bytes eeprom
35 *
36 ******************************************************************************/
Adress_Js(uint32_t adr)37 uint16_t Adress_Js(uint32_t adr)
38 {
39     uint16_t err = EEPROM_ERR_SUCCESS;
40 
41 
42     if(adr & 0x03)
43     {
44         err = EEPROM_ERR_INVALID_PARAM;
45 	return (err);
46 	}
47 
48     if(adr >1024)
49     {
50         err=EEPROM_ADR_OverFlow;
51       return(err);
52     }
53     return(err);
54 }
55 
56 /******************************************************************************
57 *
58 * EEPROM �����������eeprom
59 *�����������ַ�������������adr���ڵ�512bytes eeprom
60 *
61 ******************************************************************************/
62 
63 
EEPROM_Erase(uint32_t adr)64 uint16_t EEPROM_Erase(uint32_t adr)
65 {
66     uint16_t err = EEPROM_ERR_SUCCESS;
67     uint32_t e_adr;
68 
69      if(adr & 0x03)
70     {
71         err = EEPROM_ERR_INVALID_PARAM;
72 	return (err);
73 	}
74 
75     if(adr >1024)
76     {
77         err=EEPROM_ADR_OverFlow;
78 
79       return(err);
80     }
81 
82     e_adr=adr+EEPROM_START_ADR;
83     err = Flash_EraseSector(e_adr);
84     return(err);
85 }
86 
87 /******************************************************************************
88 *
89 * EEPROM ��ȡ��������ȡ��ַ���ڵ�eeprom
90 *�����������ַ
91 *
92 ******************************************************************************/
EEPROM_Read(uint32_t adr)93 uint32_t EEPROM_Read(uint32_t adr)
94 {
95     uint16_t err = EEPROM_ERR_SUCCESS;
96     uint32_t e_adr;
97     uint32_t data;
98 
99     if(adr & 0x03)
100     {
101         err = EEPROM_ERR_INVALID_PARAM;
102 	return (err);
103 	}
104 
105     if(adr >1024)
106     {
107         err=EEPROM_ADR_OverFlow;
108       return(err);
109     }
110 
111     e_adr=adr+EEPROM_START_ADR;
112     data = M32(e_adr);
113     return(data);
114 
115 }
116 /******************************************************************************
117 *
118 * EEPROM д������д��ַ���ڵ�eeprom
119 *д֮ǰ��ȡ�������ж�eeprom�Ƿ�Ϊ�գ����Ϊ�գ���ֱ��д
120 *����ǿգ����Ȱ�����512bytes sector��ȡ��sram���޸�Ҫд��λ��
121 *Ȼ����д�뵽flash��ģ��һ��eeprom��д����
122 *�����������ַ
123 *
124 ******************************************************************************/
EEPROM_Write(uint32_t adr,uint32_t Data)125 uint16_t EEPROM_Write(uint32_t adr, uint32_t Data)
126 {
127 
128     uint32_t err = EEPROM_ERR_SUCCESS;
129     uint32_t e_adr;
130     uint32_t r_data;
131     uint16_t i;
132     uint32_t start_adr;
133  //   uint32_t modify_adr;
134     uint32_t EEPROM_DATA[128];
135 
136     if(adr & 0x03)
137     {
138         err = EEPROM_ERR_INVALID_PARAM;
139 	return (err);
140 	}
141 
142     if(adr >1024)
143     {
144         err=EEPROM_ADR_OverFlow;
145       return(err);
146     }
147 
148 
149     r_data = EEPROM_Read(adr);
150 
151     e_adr=adr+EEPROM_START_ADR;
152 
153     if(r_data== EEPROM_BLANK) //���Ҫд��λ���ǿյģ���ֱ��д
154     {
155       err= Flash_Program1LongWord(e_adr,Data);
156     }
157    else if((r_data&Data) == Data)//���Ҫд��λ�ö�Ӧ��bit����Ҫд������һ�£�������1��Ҳ�ǿ���ֱ��д
158      {
159       err= Flash_Program1LongWord(e_adr,Data);
160     }
161     else if(r_data == Data) //���Ҫд�����ݺ����е�����һ�£��Ͳ������κβ�����ֱ�ӷ���
162     {
163       return(err);
164     }
165     else
166     {
167         start_adr = e_adr & EEPROM_SECTOR_MASK; //�����sector��ͷ��ַ
168 
169         for( i=0;i<128;i++ ) //���Ҫд��λ�ò�Ϊ�գ����Ȱ�flash���ݶ�ȡ����������sram�У��޸�
170         {
171           EEPROM_DATA[i] = M32(start_adr + 4*i);
172         }
173 
174         EEPROM_DATA[(adr&EEPROM_ARRAY_ADR_MASK)>>2] = Data; //�޸�SRAM �е�����
175 
176         err=EEPROM_Erase(adr);
177 
178         err=Flash_Program(start_adr,(uint8_t*)EEPROM_DATA,512);//Ȼ��д��flash
179     }
180     return(err);
181 
182 }
183 
184 /******************************************************************************
185 *
186 *Byte д����
187 *
188 ******************************************************************************/
EEPROM_WriteByte(uint32_t adr,uint8_t Data)189 uint16_t EEPROM_WriteByte(uint32_t adr, uint8_t Data)
190 {
191     uint32_t err = EEPROM_ERR_SUCCESS;
192     uint32_t data_mask;
193     uint32_t r_data;
194     uint32_t data_m0;
195     uint32_t data_m1;
196     uint32_t word_adr = adr &0x3fc;
197     uint32_t  b_sit= adr & 0x3;
198 
199 
200  //���ø�λΪFF
201     data_m0 = Data << b_sit*8;
202     data_mask = 0xFFFFFFFF<<(b_sit+1)*8;
203 //   printf("datam0:=0x%x \n",data_m0);
204 //Ȼ���õ�λΪFF
205      data_m1 = 0xFFFFFFFF >> (32-b_sit*8);
206      data_m1 = data_m1 | data_m0 | data_mask ;
207 
208 //    printf("datam1:=0x%x \n",data_m1);
209 
210     r_data = EEPROM_Read(word_adr);
211 //    printf("r_data:=0x%x \n",r_data);
212 //����ԭ��������
213     data_m1 = data_m1 & r_data;
214 
215 
216 //    printf("data_m1:=0x%x \n",data_m1);     ;
217     err = EEPROM_Write(word_adr , data_m1);
218 
219     return(err);
220 
221 }
222 
223 /******************************************************************************
224 *
225 *Byte ������
226 *
227 ******************************************************************************/
EEPROM_ReadByte(uint32_t adr)228 uint8_t EEPROM_ReadByte(uint32_t adr)
229 {
230    uint32_t r_data;
231    uint32_t word_adr = adr &0x3fc;
232    uint32_t b_sit= adr & 0x3;
233    uint8_t  data;
234 
235     r_data = EEPROM_Read(word_adr);
236     data = (r_data>>b_sit*8)& 0xff;
237     return(data);
238 
239 
240 }
241 
242 
243 /******************************************************************************
244 *
245 *д������дһ������Ϊbytesize����eeprom
246 *�Ȱ�1k��eeprom��ȡ����sram��Ȼ���޸�Ҫд��λ�ã�
247 *��������ǻ��������Ż���
248 *�������ĺ�û�п���2K eeprom ������2K Ҳ����ȫ���Եġ�
249 ******************************************************************************/
EERPOM_Writeup4byte(uint32_t adr,uint8_t * pData,uint32_t length)250 uint16_t EERPOM_Writeup4byte(uint32_t adr,uint8_t *pData,uint32_t length)
251 {
252 	uint8_t buf[512];
253 	uint8_t *pbuf;
254 	uint32_t e_adr;
255 	uint32_t e_sec;
256 	uint32_t e_offset;
257 	uint32_t a;
258 	uint32_t err = EEPROM_ERR_SUCCESS;
259 
260    #ifdef IAR
261     if(adr & 0x03)
262     {
263         err = EEPROM_ERR_INVALID_PARAM;
264 	      return (err);
265 	   }
266     #endif
267 
268     if((adr + length )>1024)
269     {
270         err=EEPROM_ADR_OverFlow;
271       return(err);
272     }
273 
274 	e_adr=adr+EEPROM_START_ADR;
275 	e_sec=e_adr & EEPROM_SECTOR_MASK;
276 	e_offset=e_adr & 0x1ff;
277 
278 
279 	while (length>0){
280           //�����ʼ��ַ������0�����߳���С��512 ���������ѭ��
281 		if (e_offset||(length<512)){
282 			pbuf=buf;
283 			a=512-e_offset;
284 			a=(length>a?a:length);
285 
286 			memcpy(buf,(uint8_t*)e_sec,512);
287 			memcpy(&buf[e_offset],pData,a);
288 			pData+=a;
289 			length-=a;
290 			e_offset=0;
291 
292 		}else{ //�����ʼ��ַ����0�ҳ��ȴ���512 �����
293 			pbuf=pData;
294 			pData+=512;
295 			length-=512;
296 		}
297 		err=Flash_EraseSector(e_sec);
298 		err=Flash_Program(e_sec,(uint8_t*)pbuf,512);//Ȼ��д��flash
299 		e_sec+=0x200;
300 	}
301 	return err;
302 }
303 
304 
305 /*
306 uint16_t EERPOM_Writeup4byte(uint32_t adr,uint8_t *pData,uint32_t bytesize)
307 {
308     uint32_t err = EEPROM_ERR_SUCCESS;
309     uint32_t e_adr;
310     uint16_t i;
311     uint32_t start_adr;
312     uint32_t EEPROM_DATA[256];
313     uint32_t longword = bytesize >>2;
314     uint32_t *pwData = (uint32_t*)pData ;
315 
316     err=Adress_Js(adr);
317 
318     if(adr+bytesize >1024) //���д��ĵ�ַ,����Ҫд�����ݵĸ�������1024������
319     {
320       err = EEPROM_ADR_OverFlow;
321       return(err);
322     }
323 
324     e_adr=adr+EEPROM_START_ADR;
325 
326     start_adr = e_adr & EEPROM_SECTOR_MASK; //�����sector ͷ��ַ
327 
328     for( i=0;i<256;i++ ) //�Ȱ����ݶ�ȡ��sram
329       {
330         EEPROM_DATA[i] = M32(start_adr + 4*i);
331         }
332     for( i=0 ;i<longword ;i++) //Ȼ���޸�Ҫд�ĵ�ַ
333       {
334         EEPROM_DATA[(adr>>2)+i] = *pwData++;
335       }
336      //��erase��2��eeprom secoter
337      err=EEPROM_Erase(0x000);
338      err=EEPROM_Erase(0x200);
339 
340     err=Flash_Program(start_adr,(uint8_t*)EEPROM_DATA,1024);//Ȼ��д��flash
341 
342     return(err);
343 }
344 */
345 
346