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