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 | } |