这是一个FT2232D芯片,LED连接到BDBUS6。
库的记录比我想象的要少(比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 :(得分: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;
}
答案 1 :(得分:4)
答案 2 :(得分:1)
与此处相同的答案:I'm having trouble finding example code for libftdi's mpsse (SPI) mode
它主要是MPSSE模式,但它也通过bitbang命令设置nCS信号。