FTDI libMPSSE.dll I2C_DeviceRead () всегда возвращает 0xFF - PullRequest
0 голосов
/ 19 сентября 2018

Я делаю импорт FTDI Chip libMPSSE.dll и использую его в режиме I2C.Моим тестовым устройством является датчик BMP280.Я пытаюсь прочитать это ID регистра, который содержит значение 0x58.Проблема в том, что метод I2C_DeviceRead () всегда возвращает 0xFF, хотя с помощью логического анализатора я вижу, что датчик отвечает правильно: Logic analyzer shows correct answer of the sensor

Исходные объявления методов:

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 - маска Enum с контрольными битами.И далее назовите его (псевдокод) в соответствии с датчиком.Сначала запишите адрес регистра:

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 на картинке) другие значения: Each requested byte is 0xFF

В чем проблема с моим кодом?Почему я могу правильно писать, а читать неправильно?Спасибо!

...