在Raspberry Pi的Raspbian软浮点上使用FTDI D2XX驱动与Python

6 投票
2 回答
25533 浏览
提问于 2025-04-17 14:15

我们有一个通过FTDI的D2XX驱动控制的USB设备。现在这个设备是通过一台Windows电脑和Python接口来控制的。作为一个有趣的项目,我尝试把控制转移到树莓派上(树莓派的成本大约是PC的十分之一,不包括操作系统的费用)。

在这个过程中遇到了很多困难,但经过几周的努力,我终于找到了所有的解决方案并让它成功运行。答案分散在多个论坛上,所以为了感谢Stack Overflow社区,我决定把这些信息整理在这里。

首先,这个项目需要:

  • 一个操作系统:我选择了最新的“Wheezy” Raspbian(硬浮点版本2012-12-16),可以从树莓派官网下载。这其中包含了Python。
  • FTDI D2XX驱动,用来和我们的FTDI设备进行通信。
  • 一个Python接口来使用D2XX驱动。我使用了PyUSB
  • 我们的Python脚本。

我下载了Wheezy版本,并使用Win32DiskImager把它写入一张4GB的SD卡。树莓派顺利启动。然后我解压了D2XX库(libftd2xx.so),并把它安装到/usr/local/lib目录下。

PyUSB(1.6)目前只在Windows上测试过,但他们提供了源代码。为树莓派编译一个副本其实很简单。基本上,只需要修改setup.py文件,让它链接到libftd2xx.so库(不需要复制它)。还要编辑d2xx/_d2xx.c文件,把没有Linux实现的函数注释掉(目前是ftobj_Rescan、ftobj_Reload和ftobj_GetComPortNumber)。然后把WinTypes.h和ftd2xx.h从FTDI D2XX驱动下载的文件夹中复制到ftdi-win32目录下,接着运行python setup.py install,这会编译并安装Python模块。

完成这些后,我写了一个简单的Python脚本来和FTDI芯片通信。注意需要通过sudo来运行。

import d2xx
jd = d2xx.open(0)
pd = jd.eeRead()
print pd

但是,d2xx模块似乎找不到libftd2xx.so文件。所以,我调整了setup.py脚本,让它链接到库的静态副本,libftd2xx.a。结果,我发现了问题的第一个线索:D2XX库是用软浮点构建的,而我的Wheezy版本是配置为使用浮点寄存器的。也就是说,我系统上的gcc生成的代码与D2XX库不兼容,无法链接。

为了解决这个问题,我下载了软浮点的debian "wheezy"版本(2012-08-08),并写入4GB的SD卡。这次镜像无法启动。经过一番查找,我发现了这个有用的答案。简单来说,软浮点的启动镜像有问题,导致某些树莓派主板无法启动。解决方法是用一个可以正常工作的文件替换软浮点版本中的start.elf文件,比如从硬浮点Raspbian镜像中复制一个。幸运的是,SD卡有两个分区:一个是FAT格式,另一个是ext3(?)格式。启动镜像在FAT分区,所以我只需把硬浮点的SD卡插入Windows电脑,复制start.elf文件,然后把软浮点的SD卡插入,更新它的start.elf文件。这样,树莓派就能顺利启动了。

在安装了FTDI的D2XX驱动并从PyUSB构建了d2xx Python模块后,我再次尝试了测试脚本。结果又失败了。d2xx模块可以正常读取libftd2xx.so库,但不知道为什么就是无法与设备通信。

2 个回答

1

有一个特别版本的 libftd2xx 1.1.12,它修复了 Raspberry Pi 上的问题。这个版本可能会解决你的问题。

我忘了我在哪里找到的这个版本,不过我在我的网站下载页面上有一个副本,Lightput 下载页面

4

我不太确定问题出在哪里:是PyUSB的问题,还是FTDI的libftd2xx.so有问题,或者是Debian系统本身的问题呢?

在FTDI的包里,有一个测试程序,路径是release/examples/EEPROM/read。你需要先编译它,不过这很简单,只要输入命令make就行了。运行这个程序(用sudo权限),结果却无法打开USB设备,所以显然不是PyUSB的问题。经过一番查找,我发现提到了一个驱动程序,叫ftdi_sio,它可能和其他D2XX驱动有冲突。于是,我用lsmod命令查看,发现ftdi_sio已经默认安装了,所以我执行了rmmod ftdi_sio命令。之后,一切都正常了。读取命令应该显示类似这样的内容:

Library version = 0x10112
Opening port 0
FT_Open succeeded.  Handle is 0xf7d240
FT_GetDeviceInfo succeeded.  Device is type 4.
FT_EE_Read succeeded.
Signature1 = 0
Signature2 = -1
Version = 1
VendorId = 0x0407
ProductId = 0x6009
Manufacturer = MagicIncorporated
ManufacturerId = wo
Description = MyCompany Test Board
SerialNumber = testit_028
MaxPower = 44
PnP = 1
SelfPowered = 0
RemoteWakeup = 1
2232RC:
-------
    Rev5 = 0x1
    IsoInA = 0x0
    IsoInB = 0x0
    IsoOutA = 0x0
    IsoOutB = 0x0
    PullDownEnable5 = 0x0
    SerNumEnable5 = 0x0
    USBVersionEnable5 = 0x0
    USBVersion5 = 0x110
    AIsHighCurrent = 0x0
    BIsHighCurrent = 0x0
    IFAIsFifo = 0x0
    IFAIsFifoTar = 0x0
    IFAIsFastSer = 0x0
    AIsVCP = 0x0
    IFBIsFifo = 0x0
    IFBIsFifoTar = 0x0
    IFBIsFastSer = 0x0
    BIsVCP = 0x0
Returning 0

我还把PyUSB换成了ftd2xx,因为它是纯Python写的,不过这并不是必须的。

撰写回答