Hi All,
I'm trying to control an Avago color sensor development kit (HDJD-JD14). I'm using the driver they provided (ftd2xx.dll) but I cannot get an ACK back from the sensor after sending the slave address for writing (B0H). I've also attached my C code below. Could anyone tell me what I've done wrong?
Thank you very much,
Gordon
#include<stdio.h>
#include<windows.h>
#include "ftd2xx.h"
#pragma comment(lib, "FTD2XX.lib")
FT_STATUS ftStatus;
FT_HANDLE ftHandle;
// start condition
void i2c_start()
{
DWORD dwBytesInQueue = 0;
UCHAR cBufWrite; //buffer to contain data to write to device
cBufWrite = 0x03;
ftStatus=FT_Write(ftHandle,&cBufWrite,sizeof(cBufWrite),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);//1=asynchronous bit-bang mode
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
cBufWrite = 0x02;
ftStatus=FT_Write(ftHandle,&cBufWrite,sizeof(cBufWrite),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
cBufWrite = 0x00;
ftStatus=FT_Write(ftHandle,&cBufWrite,sizeof(cBufWrite),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
}
// byte send, Ack returned
unsigned char i2c_tx(unsigned char databyte)
{
unsigned char i=0,b,c,ack=0;
DWORD dwBytesInQueue = 0;
for(i=0;i<8;i++)
{
c=(databyte>>(7-i))&0x01;
b=0x00|c;
ftStatus=FT_Write(ftHandle,&b,sizeof(b),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
b=0x02|c;
ftStatus=FT_Write(ftHandle,&b,sizeof(b),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
b=0x00|c;
ftStatus=FT_Write(ftHandle,&b,sizeof(b),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
}
c=0x01;
b=0x01|c;
ftStatus=FT_Write(ftHandle,&b,sizeof(b),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFE,0x01);//set LSB(SDA) as output
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
b=0x03|c;
ftStatus=FT_Write(ftHandle,&b,sizeof(b),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFE,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
ftStatus=FT_GetBitMode(ftHandle,&ack);
if(ftStatus!=FT_OK) printf("Device GetBit error");
ack=ack&0x01;
b=0x01|c;
ftStatus=FT_Write(ftHandle,&b,sizeof(b),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFE,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
return ack;
}
// Stop condition
void i2c_stop()
{
DWORD dwBytesInQueue = 0;
UCHAR cBufWrite; //buffer to contain data to write to device
cBufWrite = 0x00;
ftStatus=FT_Write(ftHandle,&cBufWrite,sizeof(cBufWrite),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
cBufWrite = 0x02;
ftStatus=FT_Write(ftHandle,&cBufWrite,sizeof(cBufWrite),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
cBufWrite = 0x03;
ftStatus=FT_Write(ftHandle,&cBufWrite,sizeof(cBufWrite),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
}
int main()
{
DWORD numDevs;
UCHAR x;
char buffer[64];
ftStatus=FT_ListDevices(&numDevs,NULL,FT_LIST_NUMBER_ONLY);
if(ftStatus==FT_OK)
{
printf("%i devices found\n",(int)numDevs);
}
if(numDevs>=1)
{
ftStatus=FT_ListDevices((PVOID)0,buffer,FT_LIST_BY_INDEX|FT_OPEN_BY_DESCRIPTION);
if(ftStatus==FT_OK)
printf("Description of Device 0: %s\n",buffer);
ftStatus=FT_Open(0,&ftHandle);
if(ftStatus==FT_OK)
{
printf("Device opened\n");
i2c_start();
x=i2c_tx(0xb0);
printf("%X\n", (unsigned) x);
i2c_stop();
}
}
return 0;
}
I'm trying to control an Avago color sensor development kit (HDJD-JD14). I'm using the driver they provided (ftd2xx.dll) but I cannot get an ACK back from the sensor after sending the slave address for writing (B0H). I've also attached my C code below. Could anyone tell me what I've done wrong?
Thank you very much,
Gordon
#include<stdio.h>
#include<windows.h>
#include "ftd2xx.h"
#pragma comment(lib, "FTD2XX.lib")
FT_STATUS ftStatus;
FT_HANDLE ftHandle;
// start condition
void i2c_start()
{
DWORD dwBytesInQueue = 0;
UCHAR cBufWrite; //buffer to contain data to write to device
cBufWrite = 0x03;
ftStatus=FT_Write(ftHandle,&cBufWrite,sizeof(cBufWrite),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);//1=asynchronous bit-bang mode
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
cBufWrite = 0x02;
ftStatus=FT_Write(ftHandle,&cBufWrite,sizeof(cBufWrite),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
cBufWrite = 0x00;
ftStatus=FT_Write(ftHandle,&cBufWrite,sizeof(cBufWrite),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
}
// byte send, Ack returned
unsigned char i2c_tx(unsigned char databyte)
{
unsigned char i=0,b,c,ack=0;
DWORD dwBytesInQueue = 0;
for(i=0;i<8;i++)
{
c=(databyte>>(7-i))&0x01;
b=0x00|c;
ftStatus=FT_Write(ftHandle,&b,sizeof(b),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
b=0x02|c;
ftStatus=FT_Write(ftHandle,&b,sizeof(b),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
b=0x00|c;
ftStatus=FT_Write(ftHandle,&b,sizeof(b),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
}
c=0x01;
b=0x01|c;
ftStatus=FT_Write(ftHandle,&b,sizeof(b),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFE,0x01);//set LSB(SDA) as output
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
b=0x03|c;
ftStatus=FT_Write(ftHandle,&b,sizeof(b),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFE,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
ftStatus=FT_GetBitMode(ftHandle,&ack);
if(ftStatus!=FT_OK) printf("Device GetBit error");
ack=ack&0x01;
b=0x01|c;
ftStatus=FT_Write(ftHandle,&b,sizeof(b),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFE,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
return ack;
}
// Stop condition
void i2c_stop()
{
DWORD dwBytesInQueue = 0;
UCHAR cBufWrite; //buffer to contain data to write to device
cBufWrite = 0x00;
ftStatus=FT_Write(ftHandle,&cBufWrite,sizeof(cBufWrite),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
cBufWrite = 0x02;
ftStatus=FT_Write(ftHandle,&cBufWrite,sizeof(cBufWrite),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
cBufWrite = 0x03;
ftStatus=FT_Write(ftHandle,&cBufWrite,sizeof(cBufWrite),&dwBytesInQueue);
if(ftStatus!=FT_OK) printf("Device setBit error");
ftStatus=FT_SetBitMode(ftHandle,0xFF,0x01);
if(ftStatus!=FT_OK) printf("Device setBit error");
dwBytesInQueue = 0; //reset counter for bytes written
}
int main()
{
DWORD numDevs;
UCHAR x;
char buffer[64];
ftStatus=FT_ListDevices(&numDevs,NULL,FT_LIST_NUMBER_ONLY);
if(ftStatus==FT_OK)
{
printf("%i devices found\n",(int)numDevs);
}
if(numDevs>=1)
{
ftStatus=FT_ListDevices((PVOID)0,buffer,FT_LIST_BY_INDEX|FT_OPEN_BY_DESCRIPTION);
if(ftStatus==FT_OK)
printf("Description of Device 0: %s\n",buffer);
ftStatus=FT_Open(0,&ftHandle);
if(ftStatus==FT_OK)
{
printf("Device opened\n");
i2c_start();
x=i2c_tx(0xb0);
printf("%X\n", (unsigned) x);
i2c_stop();
}
}
return 0;
}