Thomas Lyp / DevLibMemoryController

Dependencies:   FastPWM

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MemoryController.cpp Source File

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 }