C 如何使用libftdi v0.18闪烁LED?
它是一个FT2232D芯片,LED连接到BDBUS6 该库的文档记录比我希望的要少(尽管比FTDI自己的库要好,它甚至不适用于现代内核),我能找到的唯一一个这样做的示例代码使用了一个不推荐使用的函数(我尝试过,它似乎不起作用),我完全被难倒了 我越努力尝试这件事,它看起来就越困难。我不是在找人帮我做作业,我只是需要一个正确的方向。感谢任何帮助(甚至是推测性的) 更新:虽然ftdi_enable_bitbang()不受欢迎,但我一直在尝试。下面的代码编译后,它运行时没有barfing,但没有Blink。有关设备的示意图,请参见第23页。BDBUS6和BDBUS7与LED相连C 如何使用libftdi v0.18闪烁LED?,c,usb,libusb,spi,C,Usb,Libusb,Spi,它是一个FT2232D芯片,LED连接到BDBUS6 该库的文档记录比我希望的要少(尽管比FTDI自己的库要好,它甚至不适用于现代内核),我能找到的唯一一个这样做的示例代码使用了一个不推荐使用的函数(我尝试过,它似乎不起作用),我完全被难倒了 我越努力尝试这件事,它看起来就越困难。我不是在找人帮我做作业,我只是需要一个正确的方向。感谢任何帮助(甚至是推测性的) 更新:虽然ftdi_enable_bitbang()不受欢迎,但我一直在尝试。下面的代码编译后,它运行时没有barfing,但没有Bli
#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义FTDI_VID 0x0403
#定义FTDI_PID 0x6010
静态结构ftdi_上下文ftdic_上下文;
内部主(空){
int ret;
无符号整数i;
无符号字符c=0;
//初始化bitbang。
//ret=ft2232_bb_init();
ftdi_usb_打开(&ftdic_上下文、ftdi_视频、ftdi_PID);
ftdi设置接口(和ftdic上下文,接口B);
ftdi_enable_bitbang(&ftdic_上下文,0xb0);
//试图闪烁一些灯光。
printf(“\n现在让我们尝试闪烁灯光…\n”);
对于(i=0;i<20;i++){
c^=0x80;
ftdi_写入数据(&ftdic_上下文,&c,1);
睡眠(1);
}
返回退出成功;
}
答案与此处相同:
它主要是MPSSE模式,但它也通过bitbang命令设置nCS信号。您需要初始化ftdi上下文,然后才能使用它打开设备 ftdi_init(和ftdic_上下文) 在打开设备之前,还需要设置接口通道 下面是我用来设置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;
}
int initFTDI(结构ftdi_上下文*ftdic)
{
无符号字符掩码=0x1F;
int-ret=0;
fprintf(stderr,“开始初始化\n”);
ftdi_init(ftdic);
//用于多通道ftdi芯片,例如(ft2232)
中频(ftdi设置接口(ftdic,接口B))
fprintf(stderr,“%s\n”,ftdi_get_error_string(ftdic));
如果((ret=ftdi_usb_打开(ftdic、VID、PID))<0){
fprintf(stderr,“无法打开ftdi设备:%d(%s)\n”,ret,ftdi_get_error_string(ftdic));
返回退出失败;
}
如果(ftdi_usb_重置(ftdic))
fprintf(stderr,“%s\n”,ftdi_get_error_string(ftdic));
if(ftdi_usb_purge_缓冲区(ftdic))//清洁缓冲区
fprintf(stderr,“%s\n”,ftdi_get_error_string(ftdic));
if(ftdi写入数据集chunksize(ftdic,65536))//64k传输大小
fprintf(stderr,“%s\n”,ftdi_get_error_string(ftdic));
if(ftdi_read_data_set_chunksize(ftdic,4096))//64k传输大小
fprintf(stderr,“%s\n”,ftdi_get_error_string(ftdic));
if(ftdi_set_event_char(ftdic,false,0))//禁用事件字符
fprintf(stderr,“%s\n”,ftdi_get_error_string(ftdic));
if(ftdi_set_error_char(ftdic,false,0))//禁用错误字符
fprintf(stderr,“%s\n”,ftdi_get_error_string(ftdic));
if(ftdi_set_latency_timer(ftdic,2))//将延迟计时器设置为1mS(默认为16mS)
fprintf(stderr,“%s\n”,ftdi_get_error_string(ftdic));
中频(ftdi设置波特率(ftdic,921600))
fprintf(stderr,“%s\n”,ftdi_get_error_string(ftdic));
if(ftdi_setflowctrl(ftdic,SIO_RTS_CTS_HS))//设置流量控制
fprintf(stderr,“%s\n”,ftdi_get_error_string(ftdic));
如果((ret=ftdi_设置_位模式(ftdic,0x00,位模式_重置))<0)
{
fprintf(标准,“无法将位模式设置为%x:%d(%s)\n”,位模式重置、ret、ftdi获取错误字符串(ftdic));
fprintf(标准,“重置\n”);
返回退出失败;
}
如果((ret=ftdi_set_bitmode(ftdic,Mask,bitmode_BITBANG))<0)
fprintf(标准,“无法将位模式设置为%x:%d(%s)\n)”,位模式\u BITBANG、ret、ftdi\u get\u error\u string(ftdic));
fprintf(标准,“重置\n”);
返回退出失败;
}
//fprintf(stderr,“end init\n”);
返回ret;
}
不推荐使用,
你应该使用
ftdi_set_bitmode(&ftdic, LED,BITMODE_BITBANG);
相反,请查看与我的同一软件项目相关的可能的副本,而不是副本。如果您对它在何处/如何执行此操作有更多了解,我将非常感谢您的帮助。我只是在目前的版本中没有看到。我只是想让你知道这是两年前的事了。我甚至不再在那个地方工作了。。。就在我演示如何让该死的USB收音机工作的那天,他们解雇了我。
ftdi_set_bitmode(&ftdic, LED,BITMODE_BITBANG);