Hallo
Ich verfolge diesen Thread nun schon fast von Anfang an und habe ein ähnliches Problem. Ich möchte ein VB.NET 2005 (Version 8.0.5) und Framework 2.0, Program schreiben, das einen I2C-Bus über
RN-I2C-RS232 Adapter ansteuert. Den VB Code kann man ja nach einigen wenigen Änderungen unverändert nutzen,(ja ich weiß kein guter Stil.....) nur die letzten Functionen die SDL und SDA lesen und setzten bereiten mir Kopfzerbrechen.
Die erste test Function für sieht so aus.
Code:
Imports System.IO
Public Class I2C
Private Ob_Port As IO.Ports.SerialPort
Private Int_Delay As Integer = 500
Public Sub New()
Ob_Port = New Ports.SerialPort("COM1")
Try
Ob_Port.Open()
S_I2C_INIT()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Public Sub S_I2C_INIT()
S_I2C_STOP()
S_Delay(Int_Delay)
End Sub
Public Function F_I2C_START() As Boolean
Do
Loop Until (get_sda() = True And get_scl() = True)
set_sda(False)
S_Delay(Int_Delay)
set_scl(False)
S_Delay(Int_Delay)
Return True
End Function
Public Sub S_I2C_STOP()
set_sda(False)
set_scl(True)
Do
If get_scl() = True Then Exit Do
Loop Until get_scl() = True
set_sda(True)
End Sub
Public Sub S_I2C_ACK(ByVal Boo_ACK As Boolean)
If Boo_ACK = True Then
set_scl(False)
S_Pullse()
Else
set_sda(True)
S_Pullse()
S_Delay(Int_Delay)
End If
End Sub
Public Sub i2c_SendByte(ByVal wert As Byte)
Dim i As Integer
Dim bitmask As Byte
bitmask = 128
For i = 1 To 8
set_sda(0)
If (wert And bitmask) > 0 Then
set_sda(1)
Else
set_sda(0)
End If
bitmask = bitmask / 2
S_Delay(Int_Delay)
S_Pullse()
Next i
S_Delay(Int_Delay)
End Sub
Public Function i2c_EmpfangeByte() As Byte
Dim i As Integer
Dim bitmask As Byte
set_sda(1)
i2c_EmpfangeByte = 0
bitmask = 128
For i = 1 To 8
set_scl(1)
empanga:
If get_scl() = 0 Then GoTo empanga
If get_sda() = True Then
i2c_EmpfangeByte = i2c_EmpfangeByte Or bitmask
End If
bitmask = bitmask / 2
set_scl(0)
S_Delay(Int_Delay)
Next i
End Function
Public Function S_Pullse() As Boolean
set_scl(True)
Dim Timeoute As Integer = 0
Do
If Timeoute >= 999999999 Then
Return False
Exit Function
Else
Timeoute = Timeoute + 1
End If
If get_scl() = True Then Exit Do
Loop Until get_scl() = True
set_scl(False)
Return True
End Function
Private Sub S_Delay(ByVal int_Count As Integer)
Dim int_Lauf As Integer
For int_Lauf = 0 To int_Count
Next
End Sub
Public Sub set_sda(ByVal Boo_zustand As Boolean)
Ob_Port.DtrEnable = Boo_zustand
End Sub
Public Sub set_scl(ByVal Boo_zustand As Boolean)
Ob_Port.RtsEnable = Boo_zustand
End Sub
Public Function get_scl() As Boolean
Return Ob_Port.CtsHolding
End Function
Public Function get_sda() As Boolean
Return Ob_Port.DsrHolding
End Function
End Class
Nebenbei, es hat etwas gedauert, eine brauchbare Erklärung zu finden, die einem den Wechsel von MSComm.OCX auf die neuen Framework Funktionen erklären.
Ich öffne also den Port mit
Code:
Private Ob_Port As IO.Ports.SerialPort
Ob_Port = New Ports.SerialPort("COM1")
Ob_Port.Open()
und es geht um die Funktionen
Code:
Public Sub set_sda(ByVal Boo_zustand As Boolean)
Ob_Port.DtrEnable = Boo_zustand
End Sub
Public Sub set_scl(ByVal Boo_zustand As Boolean)
Ob_Port.RtsEnable = Boo_zustand
End Sub
Public Function get_scl() As Boolean
Return Ob_Port.CtsHolding
End Function
Public Function get_sda() As Boolean
Return Ob_Port.DsrHolding
End Function
Aber mir gelingt es nicht SDA oder SCL auf HIGH zu setzten, hat irgendjemand so etwas schon mal gemacht oder hat ne Idee???
Schon mal Danke!!!!
Lesezeichen