Hallo zusammen,
ich die Funktion "GetReadResponse" aus der "CP2112 HID USB-TO-SMBUS API"
liefert immer den Fehler "INVALID_PARAMETER". Ich habe schon alles
denkbare probiert und gegoogelt und komme nicht weiter:
Hier ist die API beschrieben:
http://www.silabs.com/Support%20Documents/TechnicalDocs/AN496.pdf
Grundsätzlich geht's ja, siehe unten, aber "HidSmbus_GetReadResponse"
antwortet immer mit "Result = HID_SMBUS_INVALID_PARAMETER"
Mein Code (VB .NET):
1 | Dim hndCP3112Dev As IntPtr = 0
|
2 | Result = HidSmbus_Open(hndCP3112Dev, 0, &H10C4, &HEA90)
|
… und dann:
1 | Dim b() As Byte = {0}
|
2 | Dim status As Byte = 0
|
3 | Dim nrRead As Byte = 0
|
4 | Result = HidSmbus_GetReadResponse(hndCP3112Dev, status, b, 1, nrRead)
|
5 | If Result = HID_SMBUS_INVALID_PARAMETER Then Stop
|
Ich habe die neueste Version genutzt:
http://www.silabs.com/products/interface/usbtouart/Pages/HID-USB-to-SMBus-Bridge.aspx
Die Funktion wird dort wie folgt deklariert:
1 | Public Declare Function HidSmbus_GetReadResponse Lib "SLABHIDtoSMBus.dll" (ByVal device As IntPtr, ByRef status As Byte, ByVal buffer() As Byte, ByVal bufferSize As Byte, ByRef numBytesRead As Byte) As Integer
|
Wie gesagt, es geht soweit, der Chip fühlt sich angesprochen:
HidSmbus_GetNumDevices: Geht, der CP2112 wird gefunden
HidSmbus_Open: Geht, ich bekomme einen IntPtr
HidSmbus_AddressReadRequest: Meldet "HID_SMBUS_SUCCESS"
HidSmbus_ForceReadResponse: Meldet "HID_SMBUS_SUCCESS"
HidSmbus_TransferStatusRequest: Meldet "HID_SMBUS_SUCCESS"
HidSmbus_GetTransferStatusResponse: Geht auch:
- bei korrekter I²C-Adresse kommt:
"HID_SMBUS_S0_COMPLETE"
- bei falscher I²C-Adresse kommt:
"HID_SMBUS_S1_BUSY_ADDRESS_NACKED"
Das Problem ist die API-Funktion "HidSmbus_GetReadResponse"^^.
Ich nehme an, dass "ByVal buffer() As Byte" von Silicon Labs in "Declare
Function" nicht korrekt ist, aber "ByRef buffer() As Byte" oder "ByRef
buffer As Byte" gehen auch nicht.
Der Prototyp ist gemäß Spec:
1 | HID_SMBUS_STATUS HidSmbus_GetTransferStatusResponse (HID_SMBUS_DEVICE device, HID_SMBUS_S0* status, HID_SMBUS_S1* detailedStatus, WORD* numRetries, WORD* bytesRead)
|
Ich wollte es auch in c++ probieren, aber da bin ich nicht so fit wie in
VB. Dort hänge ich schon viel früher (siehe Bild).