2010-08-25 75 views
5

它是FT2232D芯片,LED連接到BDBUS6。如何使用libftdi v0.18閃爍LED?

該庫的文檔記錄比我想象的要少(比FTDI自己的庫更好,它甚至不適用於現代內核),我可以找到的唯一示例代碼是否使用了不推薦使用的函數(我試過了,它似乎不工作),我絕對難住。

我越用這個東西試試,越難看。我不想找人爲我做作業,因爲我只是需要朝正確的方向推動。任何幫助讚賞(甚至推測)。

更新:我一直在嘗試這個,但不推薦使用ftdi_enable_bitbang()。下面的代碼編譯,它運行沒有barfing,但沒有blinkenlighten。相關設備的原理圖可在http://www.semtech.com/images/datasheet/sx1211ska_v1_std.pdf,第23頁獲得.BDBUS6和BDBUS7連接至LED。

#include <stdio.h> 
#include <stdint.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <ftdi.h> 

#define FTDI_VID    0x0403 
#define FTDI_PID    0x6010 


static struct ftdi_context ftdic_context; 

int main(void) { 
     int ret; 
     unsigned int i; 
     unsigned char c = 0; 

     // Initialize bitbang. 
//  ret = ft2232_bb_init(); 

     ftdi_usb_open(&ftdic_context, FTDI_VID, FTDI_PID); 
     ftdi_set_interface(&ftdic_context, INTERFACE_B); 
     ftdi_enable_bitbang(&ftdic_context, 0xb0); 

     // Trying to blink some lights. 
     printf("\nNow let's try to blinkenlights...\n"); 
     for (i = 0; i < 20; i++) { 
       c ^= 0x80; 
       ftdi_write_data(&ftdic_context, &c, 1); 
       sleep(1); 
     } 

     return EXIT_SUCCESS; 
} 
+0

可能重複[我無法找到libftdi的mpsse(SPI)模式的示例代碼。](http:// stackoverflo w.com/questions/3527464/im-having-trouble-finding-example-code-for-libftdis-mpsse-spi-mode) – 2010-08-25 19:51:51

+1

不是重複的,而是與我的同一個軟件項目有關。 – 2010-08-25 20:07:17

回答

8

在使用它打開設備之前,您需要初始化ftdi上下文。

ftdi_init(& ftdic_context);

還需要在打開設備之前設置接口通道。

繼承人我用它來建立一個FTDI背景

int initFTDI(struct ftdi_context * ftdic) 
{ 
    unsigned char Mask = 0x1F; 
    int ret=0; 

    fprintf(stderr,"start init\n"); 

    ftdi_init(ftdic); 

    //for multi-channel ftdi chips eg(ft2232) 
    if(ftdi_set_interface(ftdic,INTERFACE_B)) 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if((ret = ftdi_usb_open(ftdic, VID, PID)) < 0){ 
     fprintf(stderr, "unable to open ftdi device: %d (%s)\n", ret, ftdi_get_error_string(ftdic)); 
     return EXIT_FAILURE; 
    } 
    if(ftdi_usb_reset(ftdic)) 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_usb_purge_buffers(ftdic)) //clean buffers 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_write_data_set_chunksize(ftdic,65536)) //64k transfer size 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_read_data_set_chunksize(ftdic,4096)) //64k transfer size 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_set_event_char(ftdic,false,0)) //disable event chars 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_set_error_char(ftdic,false,0)) //disable error chars 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_set_latency_timer(ftdic,2)) //Set the latency timer to 1mS (default is 16mS) 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_set_baudrate(ftdic,921600)) 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_setflowctrl(ftdic,SIO_RTS_CTS_HS)) //set flow control 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if ((ret = ftdi_set_bitmode(ftdic, 0x00, BITMODE_RESET)) < 0) 
    { 
     fprintf(stderr, "can't set bitmode to %x: %d (%s)\n", BITMODE_RESET, ret, ftdi_get_error_string(ftdic)); 
     fprintf(stderr, "RESET\n"); 
     return EXIT_FAILURE; 
    } 
    if ((ret = ftdi_set_bitmode(ftdic, Mask, BITMODE_BITBANG)) < 0) 

     fprintf(stderr, "can't set bitmode to %x: %d (%s)\n", BITMODE_BITBANG, ret, ftdi_get_error_string(ftdic)); 
     fprintf(stderr, "RESET\n"); 
     return EXIT_FAILURE; 
    } 

    //fprintf(stderr,"end init\n"); 

    return ret; 
} 
4
ftdi_enable_bitbang 

功能已被棄用, 你應該使用

ftdi_set_bitmode(&ftdic, LED,BITMODE_BITBANG); 

相反,看到的documentation:

+0

我想讓你知道這是近兩年前。我甚至不再在那個地方工作......他們讓我擺脫了我演示讓這部該死的USB收音機工作的那一天。 – 2012-05-17 20:19:03