/* usb-i2c.c I2C-Master mit FTDI FT232R im Bit-Bang-Modus Beispiel zum Auslesen eines LM75 Zusaetzlich wird Zeit zum Lesen eines Wertes ermittelt Version 0.1 Bernhard Mayer, 10. Juni 2008, bernhard@blue-parrot.de SDA = CBUS0 SCL = CBUS1 Beide Pins jeweils mit ca. 2 kOhm auf VCC ziehen */ #include #include #include "ftd2xx.h" FT_STATUS ftStatus; FT_HANDLE ftHandle; // Reset des I2C-Bus, SDA und SCL auf high void i2c_reset() { ftStatus=FT_SetBitMode(ftHandle,0xFF,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); } // Startbedingung void i2c_start() { ftStatus=FT_SetBitMode(ftHandle,0xFF,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); ftStatus=FT_SetBitMode(ftHandle,0xFE,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); ftStatus=FT_SetBitMode(ftHandle,0xFC,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); } // Byte senden, Ack wird zurueckgegeben unsigned char i2c_tx(unsigned char databyte) { unsigned char i=0,b,c,ack=0; for(i=0;i<8;i++) { c=(databyte>>(7-i))&0x01; b=0xFC|c; ftStatus=FT_SetBitMode(ftHandle,b,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); b=0xFE|c; ftStatus=FT_SetBitMode(ftHandle,b,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); b=0xFC|c; ftStatus=FT_SetBitMode(ftHandle,b,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); } c=0x01; b=0xED|c; ftStatus=FT_SetBitMode(ftHandle,b,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); b=0xEF|c; ftStatus=FT_SetBitMode(ftHandle,b,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); ftStatus=FT_GetBitMode(ftHandle,&ack); if(ftStatus!=FT_OK) printf("Device GetBit error"); ack=ack&0x01; b=0xED|c; ftStatus=FT_SetBitMode(ftHandle,b,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); return ack; } // Byte lesen. Ack wird entsprechend dem Parameter gesetzt, Byte wird zurueckgegeben unsigned char i2c_rx(unsigned char ack) { unsigned char i=0,b,databyte=0,d; for(i=0;i<8;i++) { b=0xED; databyte=databyte<<1; ftStatus=FT_SetBitMode(ftHandle,b,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); b=0xEF; ftStatus=FT_SetBitMode(ftHandle,b,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); ftStatus=FT_GetBitMode(ftHandle,&d); if(ftStatus!=FT_OK) printf("Device GetBit error"); databyte=databyte|(d&0x01); b=0xED; ftStatus=FT_SetBitMode(ftHandle,b,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); } b=0xFC|(ack&0x01); ftStatus=FT_SetBitMode(ftHandle,b,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); b=0xFE|(ack&0x01); ftStatus=FT_SetBitMode(ftHandle,b,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); b=0xFC|(ack&0x01); ftStatus=FT_SetBitMode(ftHandle,b,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); return databyte; } // Stopbedingung void i2c_stop() { ftStatus=FT_SetBitMode(ftHandle,0xFC,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); ftStatus=FT_SetBitMode(ftHandle,0xFE,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); ftStatus=FT_SetBitMode(ftHandle,0xFF,0x20); if(ftStatus!=FT_OK) printf("Device setBit error"); } int main() { DWORD numDevs; UCHAR temp1,temp2,x; int i,startzeit,endzeit; float temp; char buffer[64]; // FTDI Devices suchen ftStatus=FT_ListDevices(&numDevs,NULL,FT_LIST_NUMBER_ONLY); if(ftStatus==FT_OK) { printf("%i devices found\n",(int)numDevs); } if(numDevs>=1) { // Seriennummer lesen ftStatus=FT_ListDevices((PVOID)0,buffer,FT_LIST_BY_INDEX|FT_OPEN_BY_SERIAL_NUMBER); if(ftStatus==FT_OK) printf("Serial Number of Device 0: %s\n",buffer); ftStatus=FT_Open(0,&ftHandle); if(ftStatus==FT_OK) { printf("Device opened\n"); i2c_reset(); for(i=0;i<5;i++) { startzeit=GetTickCount(); // Startzeit speichern i2c_start(); x=i2c_tx(0x91); temp1=i2c_rx(0); temp2=i2c_rx(1); i2c_stop(); endzeit=GetTickCount(); // Stoppzeit speichern printf("Dauer: %i msec\n",endzeit-startzeit); temp=(float)temp2/256+temp1; // Temperatur berechnen printf("Present=%i, Temp=%f (%i,%i)\n",x,temp,temp1,temp2); } ftStatus=FT_Close(ftHandle); if(ftStatus==FT_OK) printf("Device closed\n"); } } return 0; }