UTL-015サンプルアプリケーションの プログラム一部抜粋です





- const BYTE PORT_SCLK = 0x01;
- const BYTE PORT_DO = 0x02;
- const BYTE PORT_DI = 0x04;
- const BYTE PORT_ALERT = 0x20;
- const BYTE PORT_THERM = 0x80;
- const BYTE MSB_FALLING_EDGE_CLOCK_BYTE_OUT = 0x11;
- const BYTE MSB_RISING_EDGE_CLOCK_BIT_IN = 0x22;
- const BYTE MSB_RISING_EDGE_CLOCK_BYTE_IN = 0x20;
- const BYTE SET_DATA_BITS_LOW_BYTE = 0x80;
- const BYTE READ_DATA_BITS_LOW_BYTE = 0x81;
- const bool TEMP_MODE_LOCAL = false;
- const bool TEMP_MODE_REMOTE = true;
-
-
- int __fastcall TForm2::FTDI_DeviceDetect(void)
- {
- FT_DEVICE_LIST_INFO_NODE *devInfo;
- FT_STATUS ftStatus;
- DWORD numDevs;
- String str;
- int ret;
-
- ret = -1;
-
- ComboBox_ComPort->Clear();
- ComboBox_ComPort->Text = "Select FT2232H Port...";
-
-
- ftStatus = FT_CreateDeviceInfoList(&numDevs);
-
- if(ftStatus == FT_OK){
- AddReport(str.sprintf("Number of channels: %d",numDevs));
-
- if(numDevs > 0){
- devInfo = new FT_DEVICE_LIST_INFO_NODE[numDevs];
- ftStatus = FT_GetDeviceInfoList(devInfo,&numDevs);
-
- if (ftStatus == FT_OK){
-
- ret = 0;
-
- for (int i=0; i<(int)numDevs; i++){
- AddReport(str.sprintf("No.%d:",i));
- AddReport(str.sprintf(" Flags: 0x%x",devInfo[i].Flags));
- AddReport(str.sprintf(" Type: 0x%x",devInfo[i].Type));
- AddReport(str.sprintf(" ID: 0x%x",devInfo[i].ID));
- AddReport(str.sprintf(" LocId: 0x%x",devInfo[i].LocId));
- AddReport(str.sprintf(" SerialNumber: %s",devInfo[i].SerialNumber));
- AddReport(str.sprintf(" Description: %s",devInfo[i].Description));
- AddReport(str.sprintf(" Handle: 0x%x",devInfo[i].ftHandle));
-
- ComboBox_ComPort->Items->Add(devInfo[i].Description);
- }
- }
-
- delete []devInfo;
- }
- }else{
- ComboBox_ComPort->Items->Add("No Device detected");
- }
-
- return ret;
- }
-
- int __fastcall TForm2::FTDI_PortOpen(void)
- {
- String portName;
- FT_STATUS ftStatus;
- int ret;
-
- ret = -1;
-
- portName = ComboBox_ComPort->Text;
- ftStatus = FT_OpenEx(portName.c_str(), FT_OPEN_BY_DESCRIPTION, &ftHandle);
-
- if(ftStatus == FT_OK)
- {
- for(ftStatus = (!FT_OK);;){
- if(FT_ResetDevice(ftHandle) != FT_OK ) break;
- Sleep(100);
- if(FT_Purge(ftHandle, FT_PURGE_RX | FT_PURGE_TX) != FT_OK) break;
- if(FT_SetUSBParameters(ftHandle, 65536, 65535) != FT_OK) break;
- if(FT_SetChars(ftHandle, FALSE, 0, FALSE, 0) != FT_OK) break;
- if(FT_SetTimeouts(ftHandle, 0, 5000) != FT_OK) break;
- if(FT_SetLatencyTimer(ftHandle, 2) != FT_OK) break;
- if(FT_SetFlowControl(ftHandle, FT_FLOW_NONE, 0, 0) != FT_OK) break;
-
- if( FT_SetBitMode(ftHandle, (UCHAR)0x00, (UCHAR)0x00) != FT_OK ) break;
- Sleep(100);
- if( FT_SetBitMode(ftHandle, (UCHAR)0x00, (UCHAR)0x02) != FT_OK ) break;
-
-
- ftStatus = FT_OK;
- break;
- }
-
- if(ftStatus != FT_OK){
- AddReport("PORT OPEN ERROR, FT_STATUS ERROR");
- ret = -1;
- }else{
- AddReport("PORT OPEN OK");
- ret = 0;
- }
- }
-
- return ret;
- }
-
- void __fastcall TForm2::FTDI_MPSSESetup(void)
- {
- DWORD dwByteWritten;
- BYTE outBuffer[] = {
- 0x85,
- 0x97,
- 0x8C,
- 0x86, 0x13, 0x00,
- };
-
- FT_Write(ftHandle, (BYTE*)outBuffer, sizeof(outBuffer), &dwByteWritten);
-
- return;
- }
-
- void __fastcall TForm2::FTDI_I2CStart(void)
- {
- DWORD dwByteWritten;
- BYTE outBuffer[] = {
-
- SET_DATA_BITS_LOW_BYTE, PORT_DO|PORT_SCLK, 0x03,
-
- SET_DATA_BITS_LOW_BYTE, PORT_SCLK, 0x03,
-
- SET_DATA_BITS_LOW_BYTE, 0x00, 0x03,
- };
-
- FT_Write(ftHandle, (BYTE*)outBuffer, sizeof(outBuffer), &dwByteWritten);
-
- return;
- }
-
- void __fastcall TForm2::FTDI_I2CStop(void)
- {
- DWORD dwByteWritten;
- BYTE outBuffer[] = {
-
- SET_DATA_BITS_LOW_BYTE, PORT_DO|PORT_SCLK, 0x03,
-
- SET_DATA_BITS_LOW_BYTE, PORT_SCLK, 0x03,
- };
-
- FT_Write(ftHandle, outBuffer, sizeof(outBuffer), &dwByteWritten);
-
- return;
- }
-
- BYTE __fastcall TForm2::FTDI_SendByteAndCheckACK(BYTE data)
- {
- BYTE ret;
- DWORD dwByteWritten;
- DWORD dwByteRead;
-
- BYTE outBuffer[] = {
-
- MSB_FALLING_EDGE_CLOCK_BYTE_OUT, 0x00, 0x00, data,
-
- SET_DATA_BITS_LOW_BYTE, 0x00, 0x01,
- MSB_RISING_EDGE_CLOCK_BIT_IN, 0x00,
- 0x87,
- SET_DATA_BITS_LOW_BYTE, 0x00, 0x03,
- };
-
- FT_Write(ftHandle, outBuffer, sizeof(outBuffer), &dwByteWritten);
- FT_Read(ftHandle, &ret, 1, &dwByteRead);
-
- ret &= 0x01;
-
- return ret;
- }
-
- BYTE __fastcall TForm2::FTDI_ReadByteAndSendACK(void)
- {
- DWORD dwByteWritten, dwByteRead;
- BYTE ret;
- BYTE outBuffer[] = {
-
- SET_DATA_BITS_LOW_BYTE, 0x00, 0x01,
- MSB_RISING_EDGE_CLOCK_BYTE_IN, 0x00, 0x00,
-
- SET_DATA_BITS_LOW_BYTE, 0x00, 0x03,
- SET_DATA_BITS_LOW_BYTE, PORT_SCLK, 0x03,
-
- SET_DATA_BITS_LOW_BYTE, 0x00, 0x03,
- };
-
- FT_Write(ftHandle, (BYTE*)&outBuffer, sizeof(outBuffer), &dwByteWritten);
- FT_Read(ftHandle, &ret, 1, &dwByteRead);
-
- return ret;
- }
-
- BYTE __fastcall TForm2::FTDI_GPIOCheck(void)
- {
- DWORD dwByteWritten, dwByteRead;
- BYTE ret;
- BYTE outBuffer[] = {
-
- SET_DATA_BITS_LOW_BYTE, 0x00, 0x01,
-
- READ_DATA_BITS_LOW_BYTE,
- 0x87,
- };
-
- FT_Write(ftHandle, outBuffer, sizeof(outBuffer), &dwByteWritten);
- FT_Read(ftHandle, &ret, 1, &dwByteRead);
-
- return ret;
- }
const BYTE PORT_SCLK = 0x01;
const BYTE PORT_DO = 0x02;
const BYTE PORT_DI = 0x04;
const BYTE PORT_ALERT = 0x20; //ADBUS5
const BYTE PORT_THERM = 0x80; //ADBUS7
const BYTE MSB_FALLING_EDGE_CLOCK_BYTE_OUT = 0x11;
const BYTE MSB_RISING_EDGE_CLOCK_BIT_IN = 0x22;
const BYTE MSB_RISING_EDGE_CLOCK_BYTE_IN = 0x20;
const BYTE SET_DATA_BITS_LOW_BYTE = 0x80;
const BYTE READ_DATA_BITS_LOW_BYTE = 0x81;
const bool TEMP_MODE_LOCAL = false;
const bool TEMP_MODE_REMOTE = true;
//---------------------------------------------------------------------------
int __fastcall TForm2::FTDI_DeviceDetect(void)
{
FT_DEVICE_LIST_INFO_NODE *devInfo;
FT_STATUS ftStatus;
DWORD numDevs;
String str;
int ret;
ret = -1;
ComboBox_ComPort->Clear();
ComboBox_ComPort->Text = "Select FT2232H Port...";
// create the device information list
ftStatus = FT_CreateDeviceInfoList(&numDevs);
if(ftStatus == FT_OK){
AddReport(str.sprintf("Number of channels: %d",numDevs));
if(numDevs > 0){
devInfo = new FT_DEVICE_LIST_INFO_NODE[numDevs];
ftStatus = FT_GetDeviceInfoList(devInfo,&numDevs);
if (ftStatus == FT_OK){
ret = 0;
for (int i=0; i<(int)numDevs; i++){
AddReport(str.sprintf("No.%d:",i));
AddReport(str.sprintf(" Flags: 0x%x",devInfo[i].Flags));
AddReport(str.sprintf(" Type: 0x%x",devInfo[i].Type));
AddReport(str.sprintf(" ID: 0x%x",devInfo[i].ID));
AddReport(str.sprintf(" LocId: 0x%x",devInfo[i].LocId));
AddReport(str.sprintf(" SerialNumber: %s",devInfo[i].SerialNumber));
AddReport(str.sprintf(" Description: %s",devInfo[i].Description));
AddReport(str.sprintf(" Handle: 0x%x",devInfo[i].ftHandle));
ComboBox_ComPort->Items->Add(devInfo[i].Description);
}
}
delete []devInfo;
}
}else{
ComboBox_ComPort->Items->Add("No Device detected");
}
return ret;
}
//---------------------------------------------------------------------------
int __fastcall TForm2::FTDI_PortOpen(void)
{
String portName;
FT_STATUS ftStatus;
int ret;
ret = -1;
portName = ComboBox_ComPort->Text;
ftStatus = FT_OpenEx(portName.c_str(), FT_OPEN_BY_DESCRIPTION, &ftHandle);
if(ftStatus == FT_OK)
{
for(ftStatus = (!FT_OK);;){
if(FT_ResetDevice(ftHandle) != FT_OK ) break;
Sleep(100); //Wair fot reset process
if(FT_Purge(ftHandle, FT_PURGE_RX | FT_PURGE_TX) != FT_OK) break;
if(FT_SetUSBParameters(ftHandle, 65536, 65535) != FT_OK) break;
if(FT_SetChars(ftHandle, FALSE, 0, FALSE, 0) != FT_OK) break;
if(FT_SetTimeouts(ftHandle, 0, 5000) != FT_OK) break;
if(FT_SetLatencyTimer(ftHandle, 2) != FT_OK) break;
if(FT_SetFlowControl(ftHandle, FT_FLOW_NONE, 0, 0) != FT_OK) break;
//Mode Reset
if( FT_SetBitMode(ftHandle, (UCHAR)0x00, (UCHAR)0x00) != FT_OK ) break;
Sleep(100); //Wair fot reset process
if( FT_SetBitMode(ftHandle, (UCHAR)0x00, (UCHAR)0x02) != FT_OK ) break;
//All function returned FT_OK
ftStatus = FT_OK;
break;
}
if(ftStatus != FT_OK){
AddReport("PORT OPEN ERROR, FT_STATUS ERROR");
ret = -1;
}else{
AddReport("PORT OPEN OK");
ret = 0;
}
}
return ret;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FTDI_MPSSESetup(void)
{
DWORD dwByteWritten;
BYTE outBuffer[] = {
0x85, //Disconnect TDI to TDO LoopBack
0x97, //Turn off Adaptive clocking
0x8C, //Enable 3 Phase Data Clocking
0x86, 0x13, 0x00, //Set TCK Divisor
};
FT_Write(ftHandle, (BYTE*)outBuffer, sizeof(outBuffer), &dwByteWritten);
return;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FTDI_I2CStart(void)
{
DWORD dwByteWritten;
BYTE outBuffer[] = {
//Keep CLK=H, DO=H
SET_DATA_BITS_LOW_BYTE, PORT_DO|PORT_SCLK, 0x03,
//Make DO down edge while CLK=H
SET_DATA_BITS_LOW_BYTE, PORT_SCLK, 0x03,
//Set to Initial condition
SET_DATA_BITS_LOW_BYTE, 0x00, 0x03,
};
FT_Write(ftHandle, (BYTE*)outBuffer, sizeof(outBuffer), &dwByteWritten);
return;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FTDI_I2CStop(void)
{
DWORD dwByteWritten;
BYTE outBuffer[] = {
//Keep CLK=H, DO=H
SET_DATA_BITS_LOW_BYTE, PORT_DO|PORT_SCLK, 0x03,
//Make DO down edge while CLK=H
SET_DATA_BITS_LOW_BYTE, PORT_SCLK, 0x03,
};
FT_Write(ftHandle, outBuffer, sizeof(outBuffer), &dwByteWritten);
return;
}
//---------------------------------------------------------------------------
BYTE __fastcall TForm2::FTDI_SendByteAndCheckACK(BYTE data)
{
BYTE ret;
DWORD dwByteWritten;
DWORD dwByteRead;
BYTE outBuffer[] = {
//Data
MSB_FALLING_EDGE_CLOCK_BYTE_OUT, 0x00, 0x00, data,
//Get Ack
SET_DATA_BITS_LOW_BYTE, 0x00, 0x01, //SCLK:out, DO:in, DI:in
MSB_RISING_EDGE_CLOCK_BIT_IN, 0x00,
0x87, //Send Immediate
SET_DATA_BITS_LOW_BYTE, 0x00, 0x03, //SCLK:out, DO:out, DI:in
};
FT_Write(ftHandle, outBuffer, sizeof(outBuffer), &dwByteWritten);
FT_Read(ftHandle, &ret, 1, &dwByteRead);
ret &= 0x01;
return ret;
}
//---------------------------------------------------------------------------
BYTE __fastcall TForm2::FTDI_ReadByteAndSendACK(void)
{
DWORD dwByteWritten, dwByteRead;
BYTE ret;
BYTE outBuffer[] = {
//InDirection
SET_DATA_BITS_LOW_BYTE, 0x00, 0x01,
MSB_RISING_EDGE_CLOCK_BYTE_IN, 0x00, 0x00,
//Send Ack
SET_DATA_BITS_LOW_BYTE, 0x00, 0x03,
SET_DATA_BITS_LOW_BYTE, PORT_SCLK, 0x03,
//Out Direction
SET_DATA_BITS_LOW_BYTE, 0x00, 0x03,
};
FT_Write(ftHandle, (BYTE*)&outBuffer, sizeof(outBuffer), &dwByteWritten);
FT_Read(ftHandle, &ret, 1, &dwByteRead);
return ret;
}
//---------------------------------------------------------------------------
BYTE __fastcall TForm2::FTDI_GPIOCheck(void)
{
DWORD dwByteWritten, dwByteRead;
BYTE ret;
BYTE outBuffer[] = {
//Set Direction
SET_DATA_BITS_LOW_BYTE, 0x00, 0x01, //SCLK:out, DO:in, DI:in
//Get 1Byte from DI
READ_DATA_BITS_LOW_BYTE,
0x87, //Send Immediate
};
FT_Write(ftHandle, outBuffer, sizeof(outBuffer), &dwByteWritten);
FT_Read(ftHandle, &ret, 1, &dwByteRead);
return ret;
}