首页 > 解决方案 > FTDI libMPSSE.dll I2C_DeviceRead() 总是返回 0xFF

问题描述

我导入了 FTDI 芯片 libMPSSE.dll 并在 I2C 模式下使用它。我的测试设备是传感器 BMP280。我尝试读取它的 ID 寄存器,其中包含 0x58 值。问题是方法I2C_DeviceRead()总是返回 0xFF,尽管我使用逻辑分析仪看到传感器正确回答: 逻辑分析仪显示传感器的正确答案

方法的原始声明是:

FT_STATUS I2C_DeviceRead(FT_HANDLE handle, uint32 deviceAddress, uint32 sizeToTransfer, uint8 *buffer, uint32 *sizeTransferred, uint32 options)
FT_STATUS I2C_DeviceWrite(FT_HANDLE handle, uint32 deviceAddress, uint32 sizeToTransfer, uint8 *buffer, uint32 *sizeTransferred, uint32 options)

我像这样导入这个方法:

<DllImport(DLL_MPSSE_PATH, SetLastError:=True, CallingConvention:=CallingConvention.Cdecl)>
Private Shared Function I2C_DeviceRead(ByVal handle As Integer, ByVal deviceAddress As Integer, ByVal sizeToTransfer As Integer, ByVal buffer As Byte(), ByRef sizeTransfered As Integer, ByVal options As I2C_TRANSFER_OPTIONS) As Integer
End Function

<DllImport(DLL_MPSSE_PATH, SetLastError:=True, CallingConvention:=CallingConvention.Cdecl)>
Private Shared Function I2C_DeviceWrite(ByVal handle As Integer, ByVal deviceAddress As Integer, ByVal sizeToTransfer As Integer, ByVal buffer As Byte(), ByRef sizeTransfered As Integer, ByVal options As I2C_TRANSFER_OPTIONS) As Integer
End Function

I2C_TRANSFER_OPTIONS 是带有控制位掩码的枚举。并根据传感器数据表进一步调用它(伪代码)。一、写寄存器地址:

Dim sensorAddr as Integer = &H77
Dim idRegister as Byte() = {&HD0}
Dim options as Integer = &H13 'I2C_TRANSFER_OPTIONS_START_BIT | I2C_TRANSFER_OPTIONS_STOP_BIT | I2C_TRANSFER_OPTIONS_FAST_TRANSFER_BYTES
Dim transferred as Integer = 0
I2C_DeviceWrite(myhandle, sensorAddr, 1, idRegister, transferred, options)

然后读取传感器寄存器的内容:

Dim readLen as Integer = 1
Dim readBuf(readLen-1) as Byte
I2C_DeviceRead(myhandle, sensorAddr, readLen, readBuf, transferred, options)

如果 readLen 是,例如 4,那么 readBuf() 包含四个 0xFF,尽管传感器写入数据线(图片上的 SDA)其他值: 每个请求的字节为 0xFF

我的代码有什么问题?为什么我可以写正确,但阅读是错误的?谢谢!

标签: vb.netpinvokei2cftdi

解决方案


推荐阅读