Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
MemoryController.cpp
00001 #include "MemoryController.h" 00002 00003 00004 00005 00006 00007 //Notes : May have to add pull-up resistor to busy line (see page 25 of data sheet) 00008 // Must initialize device by sending reset command at power-on (page 36) 00009 // Chip uses 3.3V logic :( sad face 00010 // Collumn Address can be sent up to 4320 (0x10E0) to be valid. 00011 // Pages are programmed at a time (4320 Bytes per page) 00012 // Blocks are erased at a time (128 Pages each, 1024 Blocks in total) 00013 00014 00015 00016 00017 00018 00019 00020 //****************************************************************************** 00021 MemoryController::MemoryController(DigitalOut CE,DigitalOut CLE,DigitalOut ALE,DigitalOut WE,DigitalOut RE,DigitalOut WP,PinName *DQ, DigitalIn RDY): 00022 m_CE(CE), m_CLE(CLE), m_ALE(ALE), m_WE(WE), m_RE(RE), m_WP(WP), m_DQ(DQ), m_RDY(RDY) 00023 { 00024 } 00025 00026 00027 //****************************************************************************** 00028 MemoryController::~MemoryController(void) 00029 { 00030 //empty block 00031 } 00032 00033 void MemoryController::setDQ(const char set, bool *values){ 00034 for (int i = 0;i<8;i++){ 00035 values[i] = ((set >> i) & 1); 00036 } 00037 } 00038 00039 void MemoryController::ResetDevice(){ 00040 //CMD 0xFF, wait 00041 00042 bool DQOut[8]; 00043 m_WE =1; 00044 m_CE = 0; 00045 m_WP =1; 00046 m_CLE = 0; 00047 m_RE = 1; 00048 setDQ(MemoryController::RESET, DQOut); 00049 for(int i = 0;i<8;i++){ 00050 printf("%i\r\n",DQOut[i]); 00051 } 00052 //Set DQs 00053 DigitalOut dq1(m_DQ[0],DQOut[0]); 00054 DigitalOut dq2(m_DQ[1],DQOut[1]); 00055 DigitalOut dq3(m_DQ[2],DQOut[2]); 00056 DigitalOut dq4(m_DQ[3],DQOut[3]); 00057 DigitalOut dq5(m_DQ[4],DQOut[4]); 00058 DigitalOut dq6(m_DQ[5],DQOut[5]); 00059 DigitalOut dq7(m_DQ[6],DQOut[6]); 00060 DigitalOut dq8(m_DQ[7],DQOut[7]); 00061 wait(1); 00062 m_CLE =1; 00063 m_WE = 0; 00064 wait_ms(1); 00065 m_WE =1; 00066 wait_us(5); 00067 //m_CLE = 0; 00068 /*m_WE = 0; 00069 wait_us(1); 00070 m_WE = 1; 00071 wait_us(10); 00072 m_CLE = 0; 00073 m_CE = 1;*/ 00074 //while(m_RDY ==1); 00075 while(m_RDY != 1){ 00076 printf("Writing\r\n"); 00077 } 00078 //setLogicStandby(); 00079 printf("System Reset -- Ready to rock and roll\r\n"); 00080 } 00081 00082 void MemoryController::ReadPage(DataAddress &address, char *DataOut){ 00083 //Start CMD 00, AADR c1, ADDR c2, ADDR r1, ADDR r2, ADDR r3, CMD 0x30, wait for rdy=1, data out 00084 while (m_RDY == 0); //Bus is Busy, do not write yet 00085 startPageRead(address); 00086 //WriteAddressPage(address); 00087 //endPageRead(); 00088 ReadData(DataOut); 00089 setLogicStandby(); 00090 printf("Page Read Complete\r\n"); 00091 } 00092 00093 void MemoryController::sendPageData(char *DataIn){ 00094 setLogicDataOut(); 00095 DigitalOut dq1(m_DQ[0],0); 00096 DigitalOut dq2(m_DQ[1],0); 00097 DigitalOut dq3(m_DQ[2],0); 00098 DigitalOut dq4(m_DQ[3],0); 00099 DigitalOut dq5(m_DQ[4],0); 00100 DigitalOut dq6(m_DQ[5],0); 00101 DigitalOut dq7(m_DQ[6],0); 00102 DigitalOut dq8(m_DQ[7],0); 00103 wait_us(1); 00104 int time =1; 00105 Timer timer1; 00106 timer1.start(); 00107 while(m_RDY == 0); 00108 for (int i=0;i < 4320;i++){ 00109 bool DQOut[8]; 00110 setDQ(DataIn[i], DQOut); 00111 dq1=DQOut[0]; 00112 dq2=DQOut[1]; 00113 dq3=DQOut[2]; 00114 dq4=DQOut[3]; 00115 dq5=DQOut[4]; 00116 dq6=DQOut[5]; 00117 dq7=DQOut[6]; 00118 dq8=DQOut[7]; 00119 m_WE = 0; 00120 while(timer1.read_us() < time); 00121 m_WE = 1; 00122 time++; 00123 while(timer1.read_us() < time); 00124 time++; 00125 } 00126 } 00127 00128 void MemoryController::ReadData(char *DataOut){ 00129 setLogicDataOut(); 00130 DigitalIn dq1(m_DQ[0]); 00131 DigitalIn dq2(m_DQ[1]); 00132 DigitalIn dq3(m_DQ[2]); 00133 DigitalIn dq4(m_DQ[3]); 00134 DigitalIn dq5(m_DQ[4]); 00135 DigitalIn dq6(m_DQ[5]); 00136 DigitalIn dq7(m_DQ[6]); 00137 DigitalIn dq8(m_DQ[7]); 00138 Data dataOut; 00139 wait_us(1); 00140 while(m_RDY == 0); 00141 m_RE = 0; 00142 wait_us(1); 00143 int time =1; 00144 Timer timer1; 00145 timer1.start(); 00146 for (int i=0;i < 4320;i++){ 00147 m_RE = 1; 00148 dataOut.bits.dq1 = dq1; 00149 dataOut.bits.dq2 = dq2; 00150 dataOut.bits.dq3 = dq3; 00151 dataOut.bits.dq4 = dq4; 00152 dataOut.bits.dq5 = dq5; 00153 dataOut.bits.dq6 = dq6; 00154 dataOut.bits.dq7 = dq7; 00155 dataOut.bits.dq8 = dq8; 00156 DataOut[i] = dataOut.all; 00157 while(timer1.read_us()<time); 00158 m_RE = 0; 00159 time++; 00160 while(timer1.read_us() <time); 00161 time++; 00162 } 00163 } 00164 00165 void MemoryController::startPageRead(DataAddress &address){ 00166 bool DQOut[8]; 00167 Timer timer1; 00168 timer1.start(); 00169 setDQ(MemoryController::READADDRINIT, DQOut); 00170 setLogicCommandInput(); 00171 m_WE =1; 00172 while (timer1.read_us() < 1); 00173 //Set DQs 00174 DigitalOut dq1(m_DQ[0],DQOut[0]); 00175 DigitalOut dq2(m_DQ[1],DQOut[1]); 00176 DigitalOut dq3(m_DQ[2],DQOut[2]); 00177 DigitalOut dq4(m_DQ[3],DQOut[3]); 00178 DigitalOut dq5(m_DQ[4],DQOut[4]); 00179 DigitalOut dq6(m_DQ[5],DQOut[5]); 00180 DigitalOut dq7(m_DQ[6],DQOut[6]); 00181 DigitalOut dq8(m_DQ[7],0); 00182 m_WE = 0; 00183 while (timer1.read_us() < 2); 00184 wait_us(30); 00185 m_WE = 1; 00186 while(timer1.read_us() < 3); 00187 m_WE=0; 00188 setLogicAddressInput(); 00189 //collumn 1 00190 setDQ(address.col1, DQOut); 00191 dq1 = DQOut[0]; 00192 dq2 = DQOut[1]; 00193 dq3 = DQOut[2]; 00194 dq4 = DQOut[3]; 00195 dq5 = DQOut[4]; 00196 dq6 = DQOut[5]; 00197 dq7 = DQOut[6]; 00198 dq8 = DQOut[7]; 00199 while(timer1.read_us() < 5); 00200 m_WE = 1; 00201 while(timer1.read_us() < 6); 00202 m_WE = 0; 00203 00204 //collumn 2 00205 setDQ(address.col2, DQOut); 00206 dq1 = DQOut[0]; 00207 dq2 = DQOut[1]; 00208 dq3 = DQOut[2]; 00209 dq4 = DQOut[3]; 00210 dq5 = DQOut[4]; 00211 dq6 = DQOut[5]; 00212 dq7 = DQOut[6]; 00213 dq8 = DQOut[7]; 00214 while(timer1.read_us() < 7); 00215 m_WE = 1; 00216 while(timer1.read_us() < 8); 00217 m_WE =0; 00218 00219 //page 00220 setDQ(address.page, DQOut); 00221 dq1 = DQOut[0]; 00222 dq2 = DQOut[1]; 00223 dq3 = DQOut[2]; 00224 dq4 = DQOut[3]; 00225 dq5 = DQOut[4]; 00226 dq6 = DQOut[5]; 00227 dq7 = DQOut[6]; 00228 dq8 = DQOut[7]; 00229 while(timer1.read_us() < 9); 00230 m_WE = 1; 00231 while(timer1.read_us() < 10); 00232 m_WE = 0; 00233 00234 //Block1 00235 setDQ(address.block1, DQOut); 00236 dq1 = DQOut[0]; 00237 dq2 = DQOut[1]; 00238 dq3 = DQOut[2]; 00239 dq4 = DQOut[3]; 00240 dq5 = DQOut[4]; 00241 dq6 = DQOut[5]; 00242 dq7 = DQOut[6]; 00243 dq8 = DQOut[7]; 00244 while(timer1.read_us() < 11); 00245 m_WE = 1; 00246 while(timer1.read_us() < 12); 00247 m_WE = 0; 00248 00249 //Block2 00250 setDQ(address.block2, DQOut); 00251 dq1 = DQOut[0]; 00252 dq2 = DQOut[1]; 00253 dq3 = DQOut[2]; 00254 dq4 = DQOut[3]; 00255 dq5 = DQOut[4]; 00256 dq6 = DQOut[5]; 00257 dq7 = DQOut[6]; 00258 dq8 = DQOut[7]; 00259 while(timer1.read_us() < 13); 00260 m_WE = 1; 00261 while(timer1.read_us() < 14); 00262 m_ALE = 0; 00263 wait_us(1); 00264 m_WE = 0; 00265 wait_us(1); 00266 //setLogicCommandInput(); 00267 setDQ(MemoryController::READADDREND, DQOut); 00268 //Set DQs 00269 dq1 = DQOut[0]; 00270 dq2 = DQOut[1]; 00271 dq3 = DQOut[2]; 00272 dq4 = DQOut[3]; 00273 dq5 = DQOut[4]; 00274 dq6 = DQOut[5]; 00275 dq7 = DQOut[6]; 00276 dq8 = DQOut[7]; 00277 m_CLE = 1; 00278 wait_us(30); 00279 m_WE = 1; 00280 wait_us(10); 00281 //while(timer1.read_us() < 17); 00282 } 00283 00284 void MemoryController::startPageWrite(DataAddress &address){ 00285 bool DQOut[8]; 00286 Timer timer1; 00287 timer1.start(); 00288 setDQ(MemoryController::WRITEPAGEINIT, DQOut); 00289 setLogicCommandInput(); 00290 m_WE =1; 00291 while (timer1.read_us() < 1); 00292 //Set DQs 00293 DigitalOut dq1(m_DQ[0],DQOut[0]); 00294 DigitalOut dq2(m_DQ[1],DQOut[1]); 00295 DigitalOut dq3(m_DQ[2],DQOut[2]); 00296 DigitalOut dq4(m_DQ[3],DQOut[3]); 00297 DigitalOut dq5(m_DQ[4],DQOut[4]); 00298 DigitalOut dq6(m_DQ[5],DQOut[5]); 00299 DigitalOut dq7(m_DQ[6],DQOut[6]); 00300 DigitalOut dq8(m_DQ[7],DQOut[7]); 00301 m_WE = 0; 00302 while (timer1.read_us() < 2); 00303 m_WE = 1; 00304 while(timer1.read_us() < 3); 00305 setLogicAddressInput(); 00306 m_WE=0; 00307 //collumn 1 00308 setDQ(address.col1, DQOut); 00309 dq1 = DQOut[0]; 00310 dq2 = DQOut[1]; 00311 dq3 = DQOut[2]; 00312 dq4 = DQOut[3]; 00313 dq5 = DQOut[4]; 00314 dq6 = DQOut[5]; 00315 dq7 = DQOut[6]; 00316 dq8 = DQOut[7]; 00317 while(timer1.read_us() < 5); 00318 m_WE = 1; 00319 while(timer1.read_us() < 6); 00320 m_WE = 0; 00321 00322 //collumn 2 00323 setDQ(address.col2, DQOut); 00324 dq1 = DQOut[0]; 00325 dq2 = DQOut[1]; 00326 dq3 = DQOut[2]; 00327 dq4 = DQOut[3]; 00328 dq5 = DQOut[4]; 00329 dq6 = DQOut[5]; 00330 dq7 = DQOut[6]; 00331 dq8 = DQOut[7]; 00332 while(timer1.read_us() < 7); 00333 m_WE = 1; 00334 while(timer1.read_us() < 8); 00335 m_WE =0; 00336 00337 //page 00338 setDQ(address.page, DQOut); 00339 dq1 = DQOut[0]; 00340 dq2 = DQOut[1]; 00341 dq3 = DQOut[2]; 00342 dq4 = DQOut[3]; 00343 dq5 = DQOut[4]; 00344 dq6 = DQOut[5]; 00345 dq7 = DQOut[6]; 00346 dq8 = DQOut[7]; 00347 while(timer1.read_us() < 9); 00348 m_WE = 1; 00349 while(timer1.read_us() < 10); 00350 m_WE = 0; 00351 00352 //Block1 00353 setDQ(address.block1, DQOut); 00354 dq1 = DQOut[0]; 00355 dq2 = DQOut[1]; 00356 dq3 = DQOut[2]; 00357 dq4 = DQOut[3]; 00358 dq5 = DQOut[4]; 00359 dq6 = DQOut[5]; 00360 dq7 = DQOut[6]; 00361 dq8 = DQOut[7]; 00362 while(timer1.read_us() < 11); 00363 m_WE = 1; 00364 while(timer1.read_us() < 12); 00365 m_WE = 0; 00366 00367 //Block2 00368 setDQ(address.block2, DQOut); 00369 dq1 = DQOut[0]; 00370 dq2 = DQOut[1]; 00371 dq3 = DQOut[2]; 00372 dq4 = DQOut[3]; 00373 dq5 = DQOut[4]; 00374 dq6 = DQOut[5]; 00375 dq7 = DQOut[6]; 00376 dq8 = DQOut[7]; 00377 while(timer1.read_us() < 13); 00378 m_WE = 1; 00379 while(timer1.read_us() < 14); 00380 } 00381 00382 void MemoryController::endPageRead(){ 00383 bool DQOut[8]; 00384 Timer timer1; 00385 setDQ(MemoryController::READADDREND, DQOut); 00386 setLogicCommandInput(); 00387 timer1.start(); 00388 //Set DQs 00389 DigitalOut dq1(m_DQ[0],DQOut[0]); 00390 DigitalOut dq2(m_DQ[1],DQOut[1]); 00391 DigitalOut dq3(m_DQ[2],DQOut[2]); 00392 DigitalOut dq4(m_DQ[3],DQOut[3]); 00393 DigitalOut dq5(m_DQ[4],DQOut[4]); 00394 DigitalOut dq6(m_DQ[5],DQOut[5]); 00395 DigitalOut dq7(m_DQ[6],DQOut[6]); 00396 DigitalOut dq8(m_DQ[7],DQOut[7]); 00397 while(timer1.read_us() < 1); 00398 m_WE = 1; 00399 while(timer1.read_us() < 2); 00400 } 00401 00402 void MemoryController::endPageWrite(){ 00403 bool DQOut[8]; 00404 Timer timer1; 00405 setDQ(MemoryController::WRITEPAGEEND, DQOut); 00406 setLogicCommandInput(); 00407 timer1.start(); 00408 //Set DQs 00409 DigitalOut dq1(m_DQ[0],DQOut[0]); 00410 DigitalOut dq2(m_DQ[1],DQOut[1]); 00411 DigitalOut dq3(m_DQ[2],DQOut[2]); 00412 DigitalOut dq4(m_DQ[3],DQOut[3]); 00413 DigitalOut dq5(m_DQ[4],DQOut[4]); 00414 DigitalOut dq6(m_DQ[5],DQOut[5]); 00415 DigitalOut dq7(m_DQ[6],DQOut[6]); 00416 DigitalOut dq8(m_DQ[7],DQOut[7]); 00417 while(timer1.read_us() < 1); 00418 m_WE = 1; 00419 while(timer1.read_us() < 2); 00420 } 00421 00422 void MemoryController::WriteAddressBlock(DataAddress &address){ 00423 00424 } 00425 00426 void MemoryController::WriteAddressPage(DataAddress &address){ 00427 bool DQOut[8]; 00428 Timer timer1; 00429 timer1.start(); 00430 00431 //collumn 1 00432 setDQ(address.col1, DQOut); 00433 setLogicAddressInput(); 00434 DigitalOut dq1(m_DQ[0],DQOut[0]); 00435 DigitalOut dq2(m_DQ[1],DQOut[1]); 00436 DigitalOut dq3(m_DQ[2],DQOut[2]); 00437 DigitalOut dq4(m_DQ[3],DQOut[3]); 00438 DigitalOut dq5(m_DQ[4],DQOut[4]); 00439 DigitalOut dq6(m_DQ[5],DQOut[5]); 00440 DigitalOut dq7(m_DQ[6],DQOut[6]); 00441 DigitalOut dq8(m_DQ[7],DQOut[7]); 00442 while(timer1.read_us() < 1); 00443 m_WE = 1; 00444 while(timer1.read_us() < 2); 00445 m_WE = 0; 00446 00447 //collumn 2 00448 setDQ(address.col2, DQOut); 00449 setLogicAddressInput(); 00450 dq1 = DQOut[0]; 00451 dq2 = DQOut[1]; 00452 dq3 = DQOut[2]; 00453 dq4 = DQOut[3]; 00454 dq5 = DQOut[4]; 00455 dq6 = DQOut[5]; 00456 dq7 = DQOut[6]; 00457 dq8 = DQOut[7]; 00458 while(timer1.read_us() < 3); 00459 m_WE = 1; 00460 while(timer1.read_us() < 4); 00461 m_WE =0; 00462 00463 //page 00464 setDQ(address.page, DQOut); 00465 setLogicAddressInput(); 00466 dq1 = DQOut[0]; 00467 dq2 = DQOut[1]; 00468 dq3 = DQOut[2]; 00469 dq4 = DQOut[3]; 00470 dq5 = DQOut[4]; 00471 dq6 = DQOut[5]; 00472 dq7 = DQOut[6]; 00473 dq8 = DQOut[7]; 00474 while(timer1.read_us() < 5); 00475 m_WE = 1; 00476 while(timer1.read_us() < 6); 00477 m_WE = 0; 00478 00479 //Block1 00480 setDQ(address.block1, DQOut); 00481 setLogicAddressInput(); 00482 dq1 = DQOut[0]; 00483 dq2 = DQOut[1]; 00484 dq3 = DQOut[2]; 00485 dq4 = DQOut[3]; 00486 dq5 = DQOut[4]; 00487 dq6 = DQOut[5]; 00488 dq7 = DQOut[6]; 00489 dq8 = DQOut[7]; 00490 while(timer1.read_us() < 7); 00491 m_WE = 1; 00492 while(timer1.read_us() < 8); 00493 m_WE = 0; 00494 00495 //Block2 00496 setDQ(address.block2, DQOut); 00497 setLogicAddressInput(); 00498 dq1 = DQOut[0]; 00499 dq2 = DQOut[1]; 00500 dq3 = DQOut[2]; 00501 dq4 = DQOut[3]; 00502 dq5 = DQOut[4]; 00503 dq6 = DQOut[5]; 00504 dq7 = DQOut[6]; 00505 dq8 = DQOut[7]; 00506 while(timer1.read_us() < 9); 00507 m_WE = 1; 00508 while(timer1.read_us() < 10); 00509 m_WE = 0; 00510 00511 } 00512 00513 void MemoryController::ProgramPage(DataAddress &address, char *DataIn){ 00514 //CMD 0x80, AADR c1, ADDR c2, ADDR r1, ADDR r2, ADDR r3, Page Data, CMD 0x10 00515 while (m_RDY == 0); 00516 startPageWrite(address); 00517 //WriteAddressPage(address); 00518 sendPageData(DataIn); 00519 endPageWrite(); 00520 setLogicStandby(); 00521 printf("Page Write Complete\r\n"); 00522 00523 } 00524 00525 void MemoryController::EraseBlock(DataAddress &address){ 00526 //CMD 0x60, ADDR R1, ADDR r2, ADDR r3, CMD oxD1 00527 while (m_RDY == 0); 00528 00529 00530 } 00531 00532 void MemoryController::setLogicStandby(){ 00533 m_CE = 1; 00534 m_CLE = 0; 00535 m_ALE = 0; 00536 m_WE = 0; 00537 m_RE = 0; 00538 m_WP = 0; 00539 } 00540 00541 void MemoryController::setLogicBusIdle(){ 00542 m_CE = 0; 00543 m_CLE = 0; 00544 m_ALE = 0; 00545 m_WE = 1; 00546 m_RE = 1; 00547 m_WP = 0; 00548 } 00549 00550 void MemoryController::setLogicCommandInput(){ 00551 m_CE = 0; 00552 m_CLE = 1; 00553 m_ALE = 0; 00554 m_WE = 0; //rising edge 00555 m_RE = 1; 00556 m_WP = 1; 00557 } 00558 00559 void MemoryController::setLogicAddressInput(){ 00560 m_CE = 0; 00561 m_CLE = 0; 00562 m_ALE = 1; 00563 m_WE = 0; //rising edge 00564 m_RE = 1; 00565 m_WP = 1; 00566 } 00567 00568 void MemoryController::setLogicDataInput(){ 00569 m_CE = 0; 00570 m_CLE = 0; 00571 m_ALE = 0; 00572 m_WE = 1; //rising edge 00573 m_RE = 1; 00574 m_WP = 1; 00575 } 00576 00577 void MemoryController::setLogicDataOut(){ 00578 m_CE = 0; 00579 m_CLE = 0; 00580 m_ALE = 0; 00581 m_WE = 1; 00582 m_RE = 1; //falling edge 00583 m_WP = 0; 00584 } 00585 00586 void MemoryController::setLogicWriteProtect(){ 00587 m_CE = 0; 00588 m_CLE = 0; 00589 m_ALE = 0; 00590 m_WE = 0; 00591 m_RE = 0; 00592 m_WP = 0; 00593 }
Generated on Tue Jul 12 2022 13:53:15 by
1.7.2