Subversion Repositories f9daq

Rev

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
}