最近正好有个项目要编一个FT2232HL和FT4222通讯工具。两个设备要自适应。
FT2232HL应用更广泛,但没想到FT4222反而FT2232HL还好编。FT2232HL遇到各种问题。而且网上根本找不到相关说明,完全是官网说明啃了半天才解决。
1,官网最新dll不能用
打开设备需要ftd2xx.dll库, FT4222要用 LibFT4222.dll库,而FT2232HL要用libMPSSE.dll,三者还不能兼容。最崩溃的是官网最新版本的dll,根本不能用,调了半天最后发现是官网最新dll的问题,用了上个版本的dll才解决“找不到入口”的问题。
2,话柄不通用。
用ftd2xx打开的设备话柄,不能给FT2232HL的SPI用,而且ftd2xx一旦打开了设备FT2232HL就不能用了。FT4222与FT2232HL操作流程还不一样。
一般流程上ftd2xx.dll中先打开设备获得ftHandle话柄,ftStatus = FT_Open((uint)idex, ref ftHandle);
然后通过这ftHandle话柄,去操作设备。FT4222就这么操作。FT4222_SPIMaster_SingleReadWrite直接操作这个话柄就能通讯了。
但FT2232HL不能这么干,SPI_OpenChannel获得的话柄和FT_Open不是同一个,而且一旦FT_Open打开了设备,SPI_OpenChannel就找不到话柄了。
最后的解决方法是,先用FT_Open打开,看看设备是FT4222还是FT2232HL,如果是FT2232HL,再关闭 FT_Close( ftHandle)。再SPI_OpenChannel获得新的话柄,再进行下一步操作。
3,网上很多接口函数是错误的。
例如这SPI_ReadWrite接口,网上经常多出一个写入长度,最终通过阅读文档,人家这个接口函数根本没有写入长度。
[DllImport("libMPSSE.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern FT_STATUS SPI_ReadWrite(IntPtr ftHandle,
byte[] writeBuffer,
byte[] readBuffer,
uint readBytes,
out uint bytesTransferred,
uint transferOptions);
4,默认SPI的cs是拉高使能
这个也是通过阅读文档,transferOptions的bit5=1是把cs拉低。
5,FT2232HL发送了数据之后要等10ms
这个还没有解决,只是发现了一下。
6,FT2232HL spi边读边写功能。
SPI是双工通讯,FT4222可以通过FT4222_SPIMaster_SingleReadWrite函数实现。而FT2232HL有SPI_ReadWrite函数
但是SPI_ReadWrite函数有问题。总感觉是先发后收的半双工模式。
7,FT4222第二个通道会卡死。
FT4222虽然有两个设备ID,但是由于硬件只有一路,所以第二路虽然能打开,但是一发数据就会卡死。这要小心。
FT2232HL应用更广泛,但没想到FT4222反而FT2232HL还好编。FT2232HL遇到各种问题。而且网上根本找不到相关说明,完全是官网说明啃了半天才解决。
1,官网最新dll不能用
打开设备需要ftd2xx.dll库, FT4222要用 LibFT4222.dll库,而FT2232HL要用libMPSSE.dll,三者还不能兼容。最崩溃的是官网最新版本的dll,根本不能用,调了半天最后发现是官网最新dll的问题,用了上个版本的dll才解决“找不到入口”的问题。
2,话柄不通用。
用ftd2xx打开的设备话柄,不能给FT2232HL的SPI用,而且ftd2xx一旦打开了设备FT2232HL就不能用了。FT4222与FT2232HL操作流程还不一样。
一般流程上ftd2xx.dll中先打开设备获得ftHandle话柄,ftStatus = FT_Open((uint)idex, ref ftHandle);
然后通过这ftHandle话柄,去操作设备。FT4222就这么操作。FT4222_SPIMaster_SingleReadWrite直接操作这个话柄就能通讯了。
但FT2232HL不能这么干,SPI_OpenChannel获得的话柄和FT_Open不是同一个,而且一旦FT_Open打开了设备,SPI_OpenChannel就找不到话柄了。
最后的解决方法是,先用FT_Open打开,看看设备是FT4222还是FT2232HL,如果是FT2232HL,再关闭 FT_Close( ftHandle)。再SPI_OpenChannel获得新的话柄,再进行下一步操作。
3,网上很多接口函数是错误的。
例如这SPI_ReadWrite接口,网上经常多出一个写入长度,最终通过阅读文档,人家这个接口函数根本没有写入长度。
[DllImport("libMPSSE.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern FT_STATUS SPI_ReadWrite(IntPtr ftHandle,
byte[] writeBuffer,
byte[] readBuffer,
uint readBytes,
out uint bytesTransferred,
uint transferOptions);
4,默认SPI的cs是拉高使能
这个也是通过阅读文档,transferOptions的bit5=1是把cs拉低。
5,FT2232HL发送了数据之后要等10ms
这个还没有解决,只是发现了一下。
6,FT2232HL spi边读边写功能。
SPI是双工通讯,FT4222可以通过FT4222_SPIMaster_SingleReadWrite函数实现。而FT2232HL有SPI_ReadWrite函数
但是SPI_ReadWrite函数有问题。总感觉是先发后收的半双工模式。
7,FT4222第二个通道会卡死。
FT4222虽然有两个设备ID,但是由于硬件只有一路,所以第二路虽然能打开,但是一发数据就会卡死。这要小心。