ich habe mit dem IOW24 Starterkit eine I2C Testanwendung bestehend aus 2x LM75, 1x RTC DS1307, 2x Portexpander PCA9555 und einem 7 Segment Treiber SAA1064 realisiert. Programmiert wurde das ganze zu Testzwecken jeweils mit VBA/VB6 und VB.Net. Orientiert habe ich mich an dem SDK und an dem Buch „Messen, Steuern und Regeln mit USB und C#“.
Über einen Timer gesteuert lese ich im Sekundentakt die Uhrzeit aus der RTC und die Temperaturen aus den jeweiligen LM75 aus und zeige die Uhrzeit und einen Temperaturwert auf einem LCD und den zweiten Temperaturwert auf einer 7 Segment Anzeige an. Funktioniert auch im Prinzip.
Nur nach einer undefinierbaren Zeitspanne liest der IOW24 aus den Registern der RTC und der LM75 die Werte 0 aus. Extrem häufig tritt dieser Effekt auf wenn der PC auf das Internet zugreift, entweder wenn ich Webseiten mit dem IE8 aufrufe oder der PC automatisch Updates runterläd. Ich muss den IOW24 erst schließen und wieder öffnen. Danach funktioniert es wieder bis zum nächsten Ausfall. Von alleine fängt sich der IOW24 nicht wieder.
Was ich bisher herausgefunden habe ist, dass im Fehlerfall eine falsche ReportID im Quittierungsbyte 0 zurückgegeben wird. Nämlich die Werte 3 für Write und 2 für Read. Das wurde mit zwei verschiedenen PCs, Privat und Firma, getestet und mit identischem Ergebnis. Da der Testaufbau zweimal vorhanden ist habe ich die RTC- und Temperaturmodule untereinander ausgetauscht was keinen Unterschied ausmachte. Nur der IOW24 war immer derselbe. Das Betriebsystem auf beiden PCs ist Win XP Professional SP3 (der Fehler trat auch schon vor April 2014 auf). Die Umgebungstemperaturen waren zwischen 20°C und 30°C.
Hat schon mal jemand anderes dies Phänomen beobachtet und kann mir weiterhelfen?
Ich will nicht ausschließen dass mein Code fehlerhaft ist, deswegen hänge ich die meiner Meinung nach entscheidenden Auszüge aus meinem VB6 Programm dran.
Vielen Dank schon mal.
Code: Select all
Private I2C_Data_Write(7) As Byte
Private I2C_Data_Read(7) As Byte
____________________________________________________________________________________
Function LM75_GetTemp(ByVal DeviceAddress As Byte) As Double
Dim MSB As Byte
Dim LSB As Byte
I2C_Data_Write(0) = IOW_I2C_WRITE_REPORTID
I2C_Data_Write(1) = &H82
I2C_Data_Write(2) = DeviceAddress
I2C_Data_Write(3) = &H0
I2C_Data_Write(4) = &H0
I2C_Data_Write(5) = &H0
I2C_Data_Write(6) = &H0
I2C_Data_Write(7) = &H0
If IOW_I2C_WriteBytes(I2C_Data_Write()) = True Then
I2C_Data_Write(0) = IOW_I2C_READ_REPORTID
I2C_Data_Write(1) = &H2
I2C_Data_Write(2) = DeviceAddress + 1
Call IOW_I2C_ReadBytes(I2C_Data_Write(), I2C_Data_Read())
MSB = I2C_Data_Read(2)
LSB = I2C_Data_Read(3)
'Hier erfolgt die Temperaturumrechnung
End If
Call Clear_I2C_Buffer
End Function
_____________________________________________________________________________________
Private Function IOW_I2C_WriteBytes(ByRef WriteData() As Byte) As Boolean
If IowKitWrite(IOW_Handle, IOW_PIPE_SPECIAL_MODE, WriteData(0), 8) = 8 Then
If IowKitRead(IOW_Handle, IOW_PIPE_SPECIAL_MODE, I2C_Data_Read(0), 8) = 8 Then
If I2C_Data_Read(0) = IOW_I2C_WRITE_REPORTID Then
If (I2C_Data_Read(1) And &H80) = &H80 Then
IOW_I2C_WriteBytes = False
Else
IOW_I2C_WriteBytes = True
End If
Else
Else
Debug.Print "ReportID von Write ist falsch, Sollwert 2, Istwert " & Hex(I2C_Data_Read(0))
IOW_I2C_WriteBytes = False
End If
Else
IOW_I2C_WriteBytes = False
End If
Else
IOW_I2C_WriteBytes = False
End If
End Function
_____________________________________________________________________________________
Private Sub IOW_I2C_ReadBytes(ByRef WriteData() As Byte, ByRef ReadData() As Byte)
On Error GoTo I2C_Error
If IowKitWrite(IOW_Handle, IOW_PIPE_SPECIAL_MODE, WriteData(0), 8) = 8 Then
If IowKitRead(IOW_Handle, IOW_PIPE_SPECIAL_MODE, ReadData(0), 8) = 8 Then
If ReadData(0) = IOW_I2C_READ_REPORTID Then
If (ReadData(1) And &H80) <> 0 Then
GoTo I2C_Error
End If
Else
Debug.Print "ReportID von Read ist falsch, Sollwert 3, Istwert " & Hex(ReadData(0))
GoTo I2C_Error
End If
Else
GoTo I2C_Error
End If
End If
Exit Sub
I2C_Error:
Call I2C_Stop
Call Clear_I2C_Buffer
End Sub
_____________________________________________________________________________________
Private Sub Clear_I2C_Buffer()
Dim i As Integer
For i = 0 To 7
I2C_Data_Write(i) = 0
I2C_Data_Read(i) = 0
Next i
End Sub