00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "pic_flash.h"
00038
00039 #ifdef _PIC16
00040
00041 void flash_erase(FLASH_MEM_ADDR_TYPE program_address)
00042 {
00043
00044 HIBYTE(eeadrh, program_address);
00045 LOBYTE(eeadr, program_address);
00046
00047 set_bit(eecon1, EEPGD);
00048 #ifdef FREE
00049 set_bit(eecon1, WREN);
00050 set_bit(eecon1, FREE);
00051 #endif
00052
00053 eecon2 = 0x55;
00054 eecon2 = 0xAA;
00055 set_bit(eecon1, WR);
00056
00057
00058 nop();
00059 nop();
00060
00061 clear_bit(eecon1, WREN);
00062 }
00063
00064
00065 void flash_write(FLASH_MEM_ADDR_TYPE address, uns8 count, uns8 *data)
00066 {
00067 uns8 i;
00068
00069
00070 #ifdef FREE
00071 clear_bit(eecon1, FREE);
00072 #endif
00073 set_bit(eecon1, EEPGD);
00074 set_bit(eecon1, WREN);
00075
00076 HIBYTE(eeadrh, memory_address);
00077 LOBYTE(eeadr, memory_address);
00078
00079
00080 for(i = 0 ; i < record_length ; i += 2)
00081 {
00082 eedath = incoming_buffer[i];
00083 eedata = incoming_buffer[i+1];
00084
00085
00086 eecon2 = 0x55;
00087 eecon2 = 0xAA;
00088 set_bit(eecon1, WR);
00089
00090
00091
00092 nop();
00093 nop();
00094
00095 eeadr++;
00096 if (eeadr == 0) eeadrh++;
00097 }
00098
00099 clear_bit(eecon1, WREN);
00100
00101 }
00102
00103 #endif
00104
00105
00106 #ifdef _PIC18
00107
00108 void flash_erase(FLASH_MEM_ADDR_TYPE program_address)
00109 {
00110 tblptru = 0;
00111 HIBYTE(tblptrh, program_address);
00112 LOBYTE(tblptrl, program_address);
00113
00114 #ifdef EEPGD
00115 set_bit(eecon1, EEPGD);
00116 clear_bit(eecon1, CFGS);
00117 #endif
00118 set_bit(eecon1, WREN);
00119 set_bit(eecon1, FREE);
00120
00121
00122 eecon2 = 0x55;
00123 eecon2 = 0xAA;
00124 set_bit(eecon1, WR);
00125
00126 clear_bit(eecon1, WREN);
00127 }
00128
00129
00130
00131 #ifdef _PIC18F67J50
00132
00133 void program_flash_two_bytes() {
00134 set_bit (eecon1, WPROG);
00135 set_bit (eecon1, WREN);
00136
00137
00138 eecon2 = 0x55;
00139 eecon2 = 0xAA;
00140 set_bit(eecon1, WR);
00141
00142
00143 clear_bit(eecon1, WREN);
00144
00145 }
00146
00147 void flash_write(FLASH_MEM_ADDR_TYPE address, uns8 count, uns8 *data)
00148
00149 {
00150 uns8 i;
00151 uns8 block_count;
00152
00153 tblptru = 0;
00154 HIBYTE(tblptrh, address);
00155 LOBYTE(tblptrl, address);
00156
00157 asm TBLRD*-
00158
00159 for(i = 0 ; i < count ; i += 2)
00160 {
00161
00162 tablat = data[i+1];
00163 asm TBLWT*+
00164 tablat = data[i];
00165 asm TBLWT*+
00166 program_flash_two_bytes();
00167 }
00168
00169 }
00170
00171
00172 #else
00173
00174 #if FLASH_MAX_WRITE_CHUNK < 16
00175
00176 void program_flash() {
00177 set_bit (eecon1, EEPGD);
00178 clear_bit(eecon1, CFGS);
00179 set_bit (eecon1, WREN);
00180
00181
00182 eecon2 = 0x55;
00183 eecon2 = 0xAA;
00184 set_bit(eecon1, WR);
00185
00186
00187
00188
00189 clear_bit(eecon1, WREN);
00190 }
00191
00192 void flash_write(FLASH_MEM_ADDR_TYPE address, uns8 count, uns8 *data)
00193 {
00194 uns8 i;
00195
00196 tblptru = 0;
00197 HIBYTE(tblptrh, address);
00198 LOBYTE(tblptrl, address);
00199 asm TBLRD*-
00200 for(i = 0 ; i < count ; i += 2)
00201 {
00202
00203 tablat = data[i+1];
00204 asm TBLWT+*
00205 tablat = data[i];
00206 asm TBLWT+*
00207 if (i == max_write_chunk - 2) {
00208 program_flash();
00209 }
00210
00211 }
00212 program_flash();
00213
00214 }
00215
00216 #else
00217
00218 void flash_write(FLASH_MEM_ADDR_TYPE address, uns8 count, uns8 *data)
00219
00220 {
00221 uns8 i;
00222 uns8 block_count;
00223 if sizeof(FLASH_MEM_ADDR_TYPE) > 2 - - -
00224 tblptru = 0;
00225 HIBYTE(tblptrh, address);
00226 LOBYTE(tblptrl, address);
00227
00228 for(i = 0 ; i < count ; i += 2)
00229 {
00230
00231 tablat = data[i+1];
00232 asm TBLWT*+
00233 tablat = data[i];
00234 asm TBLWT*+
00235
00236
00237 }
00238
00239
00240
00241 asm TBLRD*-
00242
00243 set_bit (eecon1, EEPGD);
00244 clear_bit(eecon1, CFGS);
00245 set_bit (eecon1, WREN);
00246
00247
00248 eecon2 = 0x55;
00249 eecon2 = 0xAA;
00250 set_bit(eecon1, WR);
00251
00252
00253
00254 clear_bit(eecon1, WREN);
00255
00256 }
00257
00258 #endif
00259
00260 #endif
00261 #endif