MPSSE SPI プログラムの抜粋です

  1. //---------------------------------------------------------------------------  
  2.   
  3. void __fastcall TForm2::Button_UploadClick(TObject *Sender)  
  4. {  
  5.     DWORD startTime, diffTime;  
  6.     String str;  
  7.   
  8.     if(gbFileOpen)  
  9.     {  
  10.         startTime = timeGetTime();  
  11.   
  12.         if(CheckBox_BulkErase->Checked == TRUE){  
  13.             AttachReport("BULK ERASE...");  
  14.             SPI_BulkErase();  
  15.             while(1){  
  16.                 if(Timer_MemInProcessCheck->Enabled == FALSE){  
  17.                     break;  
  18.                 }  
  19.                 Application->ProcessMessages();  
  20.             }  
  21.         }else{  
  22.             AttachReport("SECTOR ERASE...");  
  23.             SPI_FileSizeSectorErase();  
  24.         }  
  25.   
  26.         AttachReport("OK");  
  27.   
  28.         AddReport("FILE UP LOAD...");  
  29.   
  30.         if(File_UpLoad() == 0){  
  31.             AttachReport("OK");  
  32.         }else{  
  33.             AddReport("File upload failure");  
  34.             return;  
  35.         }  
  36.   
  37.         Sleep(300);  
  38.   
  39.         AddReport("VERIFY...");  
  40.         if(CheckBox_Verify->Checked == TRUE){  
  41.             if(File_Verify() == 0){  
  42.                 AttachReport("OK");  
  43.             }else{  
  44.                 AttachReport("NG");  
  45.             }  
  46.         }else{  
  47.             AttachReport("SKIP");  
  48.         }  
  49.   
  50.         AddReport("");  
  51.   
  52.         diffTime = timeGetTime() - startTime;  
  53.         AddReport(str.sprintf("Elapsed Time: %d ms", diffTime));  
  54.     }  
  55.     else  
  56.     {  
  57.         AddReport("File is not opened");  
  58.         return;  
  59.     }  
  60.   
  61. }  
  62. //---------------------------------------------------------------------------  
  63.   
  64. void __fastcall TForm2::SPI_BulkErase()  
  65. {  
  66.     BYTE *outBuffer;  
  67.     int buffCount = 0;  
  68.     BYTE retStatus;  
  69.   
  70.     outBuffer = new BYTE[16];  
  71.   
  72.     SPI_WriteEnable();  
  73.     if( !(SPI_ReadStatus()&MEMORY_WRITE_ENABLED)) return;  
  74.   
  75.     //CS LOW  
  76.     outBuffer[buffCount++] = SET_DATA_BITS_LOW_BYTE;  
  77.     outBuffer[buffCount++] = 0; //Value  
  78.     outBuffer[buffCount++] = SPI_DEF_DIRECTION; //DIrection  
  79.   
  80.     //Command  
  81.     outBuffer[buffCount++] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT;  
  82.     outBuffer[buffCount++] = 0x00;  
  83.     outBuffer[buffCount++] = 0x00;  
  84.     outBuffer[buffCount++] = 0xC7;  
  85.   
  86.     //CS HIGH  
  87.     outBuffer[buffCount++] = SET_DATA_BITS_LOW_BYTE;  
  88.     outBuffer[buffCount++] = PORT_SPI_CS;       //Value  
  89.     outBuffer[buffCount++] = SPI_DEF_DIRECTION; //DIrection  
  90.   
  91.     FT_Write(ftHandle, outBuffer, buffCount, &dwByteWritten);  
  92.   
  93.     Timer_MemInProcessCheck->Enabled = TRUE;  
  94.   
  95.     delete []outBuffer;  
  96.   
  97.     return;  
  98. }  
  99. //---------------------------------------------------------------------------  
  100.   
  101. int __fastcall TForm2::File_UpLoad()  
  102. {  
  103.     DWORD remainFileSize;  
  104.     int pagePos = 0;  
  105.     String str;  
  106.   
  107.     remainFileSize = dwUpFileSize;  
  108.   
  109.     ProgressBar1->Position = 0;  
  110.     ProgressBar1->Max = remainFileSize;  
  111.   
  112.     while(remainFileSize >= MEMORY_BYTE_PER_PAGE){  
  113.         SPI_WriteEnable();  
  114.         SPI_PageProgram(pagePos*0x100, (BYTE*)(buffUpData+(pagePos*0x100)), MEMORY_BYTE_PER_PAGE);  
  115.   
  116.         remainFileSize -= MEMORY_BYTE_PER_PAGE;  
  117.         pagePos++;  
  118.         ProgressBar1->StepBy(MEMORY_BYTE_PER_PAGE);  
  119.   
  120.         //  
  121.         // Status Check  
  122.         //  
  123.         for(int numTry=0;;numTry++){  
  124.             if( !(SPI_ReadStatus()&MEMORY_IN_PROCESS)){  
  125.             break;  
  126.             }  
  127.               
  128.             if(numTry > MEMORY_STATUS_CHECK_TRY){  
  129.                 AddReport("TRY STATUS CHECK OVERFLOWED");  
  130.                 return -1;  
  131.             }  
  132.         }  
  133.     }  
  134.   
  135.     if(remainFileSize > 0){  
  136.         SPI_WriteEnable();  
  137.         SPI_PageProgram(pagePos*0x100, (BYTE*)(buffUpData+(pagePos*0x100)), remainFileSize);  
  138.     }  
  139.   
  140.     ProgressBar1->Position = ProgressBar1->Max;  
  141.   
  142.     return 0;  
  143. }  
  144.   
  145. //---------------------------------------------------------------------------  
  146. int __fastcall TForm2::File_Verify()  
  147. {  
  148.     int ret;  
  149.     int currentPos = 0;  
  150.     DWORD readBlock = 0x8000;  
  151.     DWORD remainFileSize;  
  152.     BYTE *verifyBuff;  
  153.   
  154.     verifyBuff = new BYTE[dwUpFileSize];  
  155.     remainFileSize = dwUpFileSize;  
  156.   
  157.     ProgressBar1->Position = 0;  
  158.     ProgressBar1->Max = remainFileSize;  
  159.   
  160.     while(remainFileSize >= readBlock){  
  161.         SPI_ReadDataBytes(readBlock*currentPos, verifyBuff+(readBlock*currentPos), readBlock);  
  162.   
  163.         remainFileSize -= readBlock;  
  164.         currentPos++;  
  165.         ProgressBar1->StepBy(readBlock);  
  166.     }  
  167.   
  168.     if(remainFileSize > 0){  
  169.         SPI_ReadDataBytes(readBlock*currentPos, verifyBuff+(readBlock*currentPos), remainFileSize);  
  170.     }  
  171.   
  172.     ProgressBar1->Position = ProgressBar1->Max;  
  173.   
  174.     ret = memcmp(buffUpData, verifyBuff, dwUpFileSize);  
  175.   
  176.     delete []verifyBuff;  
  177.       
  178.     return ret;  
  179. }  
  180. //---------------------------------------------------------------------------  
  181.   
  182. void __fastcall TForm2::SPI_SectorErase(DWORD address)  
  183. {  
  184.     BYTE *outBuffer;  
  185.     int buffCount = 0;  
  186.     DWORD writeSize;  
  187.     BYTE address23To16, address15To8, address7To0;  
  188.   
  189.     address23To16 = (BYTE)(address>>8*2);  
  190.     address23To16 &= 0x1F;  
  191.     address15To8  = (BYTE)(address>>8*1);  
  192.     address7To0   = (BYTE)(address>>8*0);  
  193.   
  194.     outBuffer = new BYTE[16];  
  195.   
  196.     //CS LOW  
  197.     outBuffer[buffCount++] = SET_DATA_BITS_LOW_BYTE;  
  198.     outBuffer[buffCount++] = 0; //Value  
  199.     outBuffer[buffCount++] = SPI_DEF_DIRECTION; //DIrection  
  200.   
  201.     //Command + Address  
  202.     outBuffer[buffCount++] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT;  
  203.     outBuffer[buffCount++] = 0x03;  
  204.     outBuffer[buffCount++] = 0x00;  
  205.     outBuffer[buffCount++] = 0xD8;  
  206.     outBuffer[buffCount++] = address23To16;  
  207.     outBuffer[buffCount++] = address15To8;  
  208.     outBuffer[buffCount++] = address7To0;  
  209.   
  210.     //CS HIGH  
  211.     outBuffer[buffCount++] = SET_DATA_BITS_LOW_BYTE;  
  212.     outBuffer[buffCount++] = PORT_SPI_CS;       //Value  
  213.     outBuffer[buffCount++] = SPI_DEF_DIRECTION; //DIrection  
  214.   
  215.     FT_Write(ftHandle, outBuffer, buffCount, &dwByteWritten);  
  216.   
  217.     delete []outBuffer;  
  218.   
  219.     return;  
  220. }  
  221.   
  222. //---------------------------------------------------------------------------  
  223.   
  224. void __fastcall TForm2::SPI_PageProgram(DWORD address, BYTE *data, int size)  
  225. {  
  226.     BYTE *outBuffer;  
  227.     int buffCount = 0;  
  228.     DWORD writeSize;  
  229.     BYTE writeSizeHigh, writeSizeLow;  
  230.     BYTE address23To16, address15To8, address7To0;  
  231.   
  232.     address23To16 = (BYTE)(address>>8*2);  
  233.     address23To16 &= 0x1F;  
  234.     address15To8  = (BYTE)(address>>8*1);  
  235.     address7To0   = (BYTE)(address>>8*0);  
  236.   
  237.     if(size > MEMORY_BYTE_PER_PAGE) return;  
  238.   
  239.     writeSize = (DWORD)(size-1 +1+3); //+1 for Command, +3 for Address  
  240.     writeSizeHigh = (BYTE)(writeSize>>8*1);  
  241.     writeSizeLow = (BYTE)(writeSize>>8*0);  
  242.   
  243.     outBuffer = new BYTE[writeSize + 16]; //+6 for CS command  
  244.   
  245.     //CS LOW  
  246.     outBuffer[buffCount++] = SET_DATA_BITS_LOW_BYTE;  
  247.     outBuffer[buffCount++] = 0; //Value  
  248.     outBuffer[buffCount++] = SPI_DEF_DIRECTION; //DIrection  
  249.   
  250.     //Command + Address  
  251.     outBuffer[buffCount++] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT;  
  252.     outBuffer[buffCount++] = writeSizeLow;  
  253.     outBuffer[buffCount++] = writeSizeHigh;  
  254.     outBuffer[buffCount++] = 0x02;  
  255.     outBuffer[buffCount++] = address23To16;  
  256.     outBuffer[buffCount++] = address15To8;  
  257.     outBuffer[buffCount++] = address7To0;  
  258.   
  259.     for(int i=0; i<size; i++){  
  260.         outBuffer[buffCount++] = data[i];  
  261.     }  
  262.   
  263.     //CS HIGH  
  264.     outBuffer[buffCount++] = SET_DATA_BITS_LOW_BYTE;  
  265.     outBuffer[buffCount++] = PORT_SPI_CS;       //Value  
  266.     outBuffer[buffCount++] = SPI_DEF_DIRECTION; //DIrection  
  267.   
  268.     FT_Write(ftHandle, outBuffer, buffCount, &dwByteWritten);  
  269.   
  270.     delete []outBuffer;  
  271.   
  272.     return;  
  273. }  
  274.   
  275. //---------------------------------------------------------------------------  
  276. BYTE __fastcall TForm2::SPI_ReadStatus()  
  277. {  
  278.     BYTE *outBuffer;  
  279.     int buffCount = 0;  
  280.     BYTE retStatus;  
  281.   
  282.     outBuffer = new BYTE[16];  
  283.   
  284.     //CS LOW  
  285.     outBuffer[buffCount++] = SET_DATA_BITS_LOW_BYTE;  
  286.     outBuffer[buffCount++] = 0; //Value  
  287.     outBuffer[buffCount++] = SPI_DEF_DIRECTION; //DIrection  
  288.   
  289.     //Command  
  290.     outBuffer[buffCount++] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT;  
  291.     outBuffer[buffCount++] = 0x00;  
  292.     outBuffer[buffCount++] = 0x00;  
  293.     outBuffer[buffCount++] = 0x05;  
  294.   
  295.     //Read  
  296.     outBuffer[buffCount++] = MSB_RISING_EDGE_CLOCK_BYTE_IN;  
  297.     outBuffer[buffCount++] = 0x00;  
  298.     outBuffer[buffCount++] = 0x00;  
  299.     outBuffer[buffCount++] = 0x87;  //Send Immediate  
  300.   
  301.     //CS HIGH  
  302.     outBuffer[buffCount++] = SET_DATA_BITS_LOW_BYTE;  
  303.     outBuffer[buffCount++] = PORT_SPI_CS;       //Value  
  304.     outBuffer[buffCount++] = SPI_DEF_DIRECTION; //DIrection  
  305.   
  306.     FT_Write(ftHandle, outBuffer, buffCount, &dwByteWritten);  
  307.     FT_Read(ftHandle, &retStatus, 1, &dwByteRead);  
  308.   
  309.     delete []outBuffer;  
  310.   
  311.     return retStatus;  
  312. }  
  313.   
  314. //---------------------------------------------------------------------------  
  315. void __fastcall TForm2::SPI_ReadDataBytes(DWORD address, BYTE *data, int size)  
  316. {  
  317.     BYTE *outBuffer;  
  318.     int buffCount = 0;  
  319.     DWORD readSize;  
  320.     BYTE readSizeHigh, readSizeLow;  
  321.     BYTE address23To16, address15To8, address7To0;  
  322.     DWORD dwEventDWord, dwTxBytes, dwRxBytes;  
  323.     String str, str_temp;  
  324.   
  325.     address23To16 = (BYTE)(address>>8*2);  
  326.     address23To16 &= 0x1F;  
  327.     address15To8  = (BYTE)(address>>8*1);  
  328.     address7To0   = (BYTE)(address>>8*0);  
  329.   
  330.     if(size <0) return;  
  331.   
  332.     readSize = (DWORD)(size-1);  
  333.     readSizeHigh = (BYTE)(readSize>>8*1);  
  334.     readSizeLow = (BYTE)(readSize>>8*0);  
  335.   
  336.     outBuffer = new BYTE[16];  
  337.   
  338.     //CS LOW  
  339.     outBuffer[buffCount++] = SET_DATA_BITS_LOW_BYTE;  
  340.     outBuffer[buffCount++] = 0; //Value  
  341.     outBuffer[buffCount++] = SPI_DEF_DIRECTION; //DIrection  
  342.   
  343.     //Command + Address  
  344.     outBuffer[buffCount++] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT;  
  345.     outBuffer[buffCount++] = 0x03;      //-_  
  346.     outBuffer[buffCount++] = 0x00;      //-  4 BYTE  
  347.     outBuffer[buffCount++] = 0x03;      //COMMAND  
  348.     outBuffer[buffCount++] = address23To16;  
  349.     outBuffer[buffCount++] = address15To8;  
  350.     outBuffer[buffCount++] = address7To0;  
  351.   
  352.     //Read  
  353.     outBuffer[buffCount++] = MSB_RISING_EDGE_CLOCK_BYTE_IN;  
  354.     outBuffer[buffCount++] = readSizeLow;  
  355.     outBuffer[buffCount++] = readSizeHigh;  
  356.     outBuffer[buffCount++] = 0x87;  //Send Immediate  
  357.   
  358.     //CS HIGH  
  359.     outBuffer[buffCount++] = SET_DATA_BITS_LOW_BYTE;  
  360.     outBuffer[buffCount++] = PORT_SPI_CS;       //Value  
  361.     outBuffer[buffCount++] = SPI_DEF_DIRECTION; //DIrection  
  362.   
  363.     FT_Write(ftHandle, outBuffer, buffCount, &dwByteWritten);  
  364.     Sleep(10);  
  365.     FT_GetStatus(ftHandle, &dwRxBytes, &dwTxBytes, &dwEventDWord);  
  366.   
  367.     if(dwRxBytes > 0){  
  368.         FT_Read(ftHandle, data, size, &dwByteRead);  
  369.     }  
  370.   
  371.     delete []outBuffer;  
  372.   
  373.     return;  
  374. }