Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 153 | f9daq | 1 | #include <ansi_c.h> |
| 2 | #include <cvirte.h> |
||
| 3 | #include "ftd2xx.h" |
||
| 4 | #include <utility.h> |
||
| 5 | |||
| 6 | int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, |
||
| 7 | LPSTR lpszCmdLine, int nCmdShow) { |
||
| 8 | |||
| 9 | BYTE bufOut[1024],bufIn[1024]; |
||
| 10 | DWORD bToSend, bSent, bToReceive, bReceived; |
||
| 11 | DWORD dwClockDivisor=29;//Value of clock divisor, SCL Frequency = 60/((1+29)*2) (MHz) = 1Mhz |
||
| 12 | DWORD numDevs; |
||
| 13 | DWORD Flags; |
||
| 14 | DWORD ID; |
||
| 15 | DWORD Type; |
||
| 16 | DWORD LocId; |
||
| 17 | char SerialNumber[16]; |
||
| 18 | char Description[64]; |
||
| 19 | FT_STATUS ftStatus; |
||
| 20 | FT_HANDLE ftHandle,ftHandleTemp; |
||
| 21 | FT_DEVICE_LIST_INFO_NODE *devInfo; |
||
| 22 | |||
| 23 | if (InitCVIRTE (hInstance, 0, 0) == 0) |
||
| 24 | return -1; /* out of memory */ |
||
| 25 | // create the device information list |
||
| 26 | ftStatus = FT_CreateDeviceInfoList(&numDevs); |
||
| 27 | if (ftStatus == FT_OK) { |
||
| 28 | printf("Number of devices is %d\n",numDevs); |
||
| 29 | } |
||
| 30 | if (numDevs > 0) { |
||
| 31 | // allocate storage for list based on numDevs |
||
| 32 | devInfo = (FT_DEVICE_LIST_INFO_NODE*)malloc(sizeof(FT_DEVICE_LIST_INFO_NODE)*numDevs); |
||
| 33 | // get the device information list |
||
| 34 | ftStatus = FT_GetDeviceInfoList(devInfo,&numDevs); |
||
| 35 | if (ftStatus == FT_OK) { |
||
| 36 | for (int i = 0; i < numDevs; i++) { |
||
| 37 | printf("Dev %d:\n",i); |
||
| 38 | printf(" Flags=0x%x\n",devInfo[i].Flags); |
||
| 39 | printf(" Type=0x%x\n",devInfo[i].Type); |
||
| 40 | printf(" ID=0x%x\n",devInfo[i].ID); |
||
| 41 | printf(" LocId=0x%x\n",devInfo[i].LocId); |
||
| 42 | printf(" SerialNumber=%s\n",devInfo[i].SerialNumber); |
||
| 43 | printf(" Description=%s\n",devInfo[i].Description); |
||
| 44 | printf(" ftHandle=0x%x\n",devInfo[i].ftHandle); |
||
| 45 | } |
||
| 46 | } |
||
| 47 | // get information for device 0 |
||
| 48 | /* |
||
| 49 | ftStatus = FT_GetDeviceInfoDetail(0, &Flags, &Type, &ID, &LocId, SerialNumber, Description, &ftHandleTemp); |
||
| 50 | if (ftStatus == FT_OK) { |
||
| 51 | printf("Dev 0:\n"); |
||
| 52 | printf(" Flags=0x%x\n",Flags); |
||
| 53 | printf(" Type=0x%x\n",Type); |
||
| 54 | printf(" ID=0x%x\n",ID); |
||
| 55 | printf(" LocId=0x%x\n",LocId); |
||
| 56 | printf(" SerialNumber=%s\n",SerialNumber); |
||
| 57 | printf(" Description=%s\n",Description); |
||
| 58 | printf(" ftHandle=0x%x\n",ftHandleTemp); |
||
| 59 | } |
||
| 60 | */ |
||
| 61 | } |
||
| 62 | ftStatus = FT_Open(0,&ftHandle); |
||
| 63 | if (ftStatus != FT_OK) { |
||
| 64 | printf("Can't open FT232H device! \n"); |
||
| 65 | return 1; |
||
| 66 | } else // Port opened successfully |
||
| 67 | printf("Successfully open FT2232H device! \n"); |
||
| 68 | |||
| 69 | // reset device |
||
| 70 | ftStatus = FT_ResetDevice(ftHandle); |
||
| 71 | //Purge USB receive buffer first by reading out all old data from FT232H receive buffer |
||
| 72 | ftStatus |= FT_GetQueueStatus(ftHandle, &bToReceive); // Get the number of bytes in the FT232H receive buffer |
||
| 73 | if ((ftStatus == FT_OK) && (bToReceive > 0)) |
||
| 74 | ftStatus |= FT_Read(ftHandle, bufIn, bToReceive, &bReceived); //Read out the data from FT232H receive buffer |
||
| 75 | ftStatus |= FT_SetUSBParameters(ftHandle, 65535, 65535); //Set USB request transfer size |
||
| 76 | ftStatus |= FT_SetChars(ftHandle, FALSE, 0, FALSE, 0); //Disable event and error characters |
||
| 77 | ftStatus |= FT_SetTimeouts(ftHandle, 3000, 3000); //Sets the read and write timeouts in 3 sec for the FT232H |
||
| 78 | ftStatus |= FT_SetLatencyTimer(ftHandle, 1); //Set the latency timer |
||
| 79 | ftStatus |= FT_SetBitMode(ftHandle, 0x0, 0x00); //Reset controller |
||
| 80 | ftStatus |= FT_SetBitMode(ftHandle, 0x0, 0x02); //Enable MPSSE mode |
||
| 81 | if (ftStatus != FT_OK) { |
||
| 82 | printf("fail on initialize FT2232H device ! \n"); |
||
| 83 | return FALSE; |
||
| 84 | } |
||
| 85 | Sleep(50); // Wait 50ms for all the USB stuff to complete and work |
||
| 86 | |||
| 87 | // test communication by sending bad command 0xAA |
||
| 88 | bToSend=0; |
||
| 89 | bufOut[bToSend++]=0xAA; |
||
| 90 | ftStatus = FT_Write(ftHandle, bufOut, bToSend, &bSent); |
||
| 91 | do{ |
||
| 92 | ftStatus = FT_GetQueueStatus(ftHandle, &bToReceive); // Get the number of bytes in the device input buffer |
||
| 93 | }while ((bToReceive == 0) && (ftStatus == FT_OK)); //or Timeout |
||
| 94 | ftStatus = FT_Read(ftHandle, bufIn, bToReceive, &bReceived); //Read out the data from input buffer |
||
| 95 | printf("Received byts: %d",bReceived); |
||
| 96 | if (bReceived > 1) printf(": 0x%02X, 0x%02X",bufIn[bReceived-2],bufIn[bReceived-1]); |
||
| 97 | printf("\n"); |
||
| 98 | |||
| 99 | bToSend=0; |
||
| 100 | bufOut[bToSend++]=0xAB; |
||
| 101 | ftStatus = FT_Write(ftHandle, bufOut, bToSend, &bSent); |
||
| 102 | do{ |
||
| 103 | ftStatus = FT_GetQueueStatus(ftHandle, &bToReceive); // Get the number of bytes in the device input buffer |
||
| 104 | }while ((bToReceive == 0) && (ftStatus == FT_OK)); //or Timeout |
||
| 105 | ftStatus = FT_Read(ftHandle, bufIn, bToReceive, &bReceived); //Read out the data from input buffer |
||
| 106 | printf("Received bytes: %d",bReceived); |
||
| 107 | if (bReceived > 1) printf(": 0x%02X, 0x%02X",bufIn[bReceived-2],bufIn[bReceived-1]); |
||
| 108 | printf("\n"); |
||
| 109 | |||
| 110 | bToSend=0; |
||
| 111 | bufOut[bToSend++]=0x8A;//Ensure disable clock divide by 5 for 60Mhz master clock |
||
| 112 | bufOut[bToSend++]=0x97;//Ensure turn off adaptive clocking |
||
| 113 | bufOut[bToSend++]=0x8D;//disable 3 phase data clock |
||
| 114 | ftStatus = FT_Write(ftHandle, bufOut, bToSend, &bSent); |
||
| 115 | |||
| 116 | bToSend = 0; |
||
| 117 | bufOut[bToSend++]=0x80; //Command to set directions of lower 8 pins and force value on bits set as output |
||
| 118 | bufOut[bToSend++]=0x00; //Set SDA, SCL high, WP disabled by SK, DO at bit &*, GPIOL0 at bit &* |
||
| 119 | bufOut[bToSend++]=0x0B; //Set SK,DO,GPIOL0 pins as output with bit **, other pins as input with bit &* |
||
| 120 | // The SK clock frequency can be worked out by below algorithm with divide by 5 set as off |
||
| 121 | // SK frequency = 60MHz /((1 + [(1 +0xValueH*256) OR 0xValueL])*2) |
||
| 122 | bufOut[bToSend++]=0x86; //Command to set clock divisor |
||
| 123 | bufOut[bToSend++]=dwClockDivisor & 0xFF; //Set 0xValueL of clock divisor |
||
| 124 | bufOut[bToSend++]=dwClockDivisor >> 8; //Set 0xValueH of clock divisor |
||
| 125 | ftStatus = FT_Write(ftHandle, bufOut, bToSend, &bSent); // Send out the commands |
||
| 126 | Sleep(20); //Delay for a while |
||
| 127 | //Turn off loop back in case |
||
| 128 | bToSend = 0; |
||
| 129 | bufOut[bToSend++]=0x85; //Command to turn off loop back of TDI/TDO connection |
||
| 130 | ftStatus = FT_Write(ftHandle, bufOut, bToSend, &bSent); // Send out the commands |
||
| 131 | Sleep(30); //Delay for a while |
||
| 132 | printf("SPI initialized successfuly\n"); |
||
| 133 | |||
| 134 | bToSend=0; |
||
| 135 | bufOut[bToSend++]=0x82;// set ACBUS 0-7 |
||
| 136 | bufOut[bToSend++]=0x00;// value |
||
| 137 | bufOut[bToSend++]=0x00;// direction 0-input |
||
| 138 | bufOut[bToSend++]=0x80;// set ADBUS 0-7 |
||
| 139 | bufOut[bToSend++]=0xF0; |
||
| 140 | bufOut[bToSend++]=0xFF; |
||
| 141 | bufOut[bToSend++]=0x81;// read ADBUS |
||
| 142 | bufOut[bToSend++]=0x83;// read ACBUS |
||
| 143 | bufOut[bToSend++]=0x80; |
||
| 144 | bufOut[bToSend++]=0x00; |
||
| 145 | bufOut[bToSend++]=0xFF; |
||
| 146 | bufOut[bToSend++]=0x81; |
||
| 147 | bufOut[bToSend++]=0x83; |
||
| 148 | ftStatus = FT_Write(ftHandle, bufOut, bToSend, &bSent); |
||
| 149 | do{ |
||
| 150 | ftStatus = FT_GetQueueStatus(ftHandle, &bToReceive); // Get the number of bytes in the device input buffer |
||
| 151 | }while ((bToReceive == 0) && (ftStatus == FT_OK)); //or Timeout |
||
| 152 | ftStatus = FT_Read(ftHandle, bufIn, bToReceive, &bReceived); //Read out the data from input buffer |
||
| 153 | printf("Received bytes: 0x%02X, 0x%02X, 0x%02X, 0x%02X\n",bufIn[0],bufIn[1],bufIn[2],bufIn[3]); |
||
| 154 | |||
| 155 | getchar(); |
||
| 156 | // Delay(10); |
||
| 157 | FT_Close(ftHandle); |
||
| 158 | return 0; |
||
| 159 | } |