nochmal der Code ein wenig besser zu lesen
<c>
'
'* Created by SharpDevelop.
'* User: VeithC
'* Date: 04.10.2005
'* Time: 08:31
'*
'* To change this template use Tools | Options | Coding | Edit
Standard Headers.
'
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Namespace I2C
''' <summary>
''' Make Connection between Port.dll and MainForm.
''' </summary>
Public Class i2c_connection
<DllImport("port.dll")> _
Private Shared Function OPENCOM(ByVal A As String) As Boolean
End Function
<DllImport("port.dll")> _
Private Shared Sub CLOSECOM()
End Sub
<DllImport("port.dll")> _
Private Shared Sub DTR(ByVal B As Integer)
End Sub
<DllImport("port.dll")> _
Private Shared Sub RTS(ByVal B As Integer)
End Sub
<DllImport("port.dll")> _
Private Shared Function CTS() As Boolean
End Function
<DllImport("port.dll")> _
Private Shared Function DSR() As Boolean
End Function
Public Sub New()
End Sub
Public Function I2C_Open(ByVal Port As String) As Boolean
Try
OPENCOM(Port + ":1200,n,8,1")
Return True
Catch ex As Exception
MessageBox.Show("Com-Port " + Port + " nicht vorhanden" +
ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Hand,
MessageBoxDefaultButton.Button1)
Return False
End Try
End Function
Public Sub I2C_Close()
CLOSECOM()
End Sub
' I2C Taktleitung an RTS Leitung der RS-232 schalten
Public Sub SCL(ByVal i As Integer)
RTS(i)
End Sub
' I2C Datenleitung an DTR Leitung der RS-232 schalten
Public Sub SDA(ByVal i As Integer)
DTR(i)
End Sub
' Rücklesen der SDA-Leitung am DSR der RS-232
Public Function SDA_in() As Boolean
If DSR() Then
Return True
Else
Return False
End If
End Function
' Auslesen des INT am CTS der RS-232
Public Function I2C_INT() As Boolean
If CTS() Then
Return True
Else
Return False
End If
End Function
' Initialisieren des I2C Busses SDA=High, SCL = High
Public Function I2C_Init() As Boolean
SDA(1)
SCL(1)
Return SDA_in()
End Function
' Start der I2C Übertragung. Erst SDA dann SCL Low
Public Sub I2C_Start()
SDA(0)
SCL(0)
End Sub
' Stoppen der I2C Übertragung durch SDA dann SCL High
Public Sub I2C_Stop()
SDA(1)
SCL(1)
End Sub
' Acknowledge -> Byte wurde empfangen weiter Daten senden
Public Sub I2C_Ack()
SDA(0)
SCL(1)
SCL(0)
End Sub
' No Ack -> Byte empfangen - Nichts senden
Public Sub I2C_NoAck()
SDA(1)
SCL(1)
SCL(0)
End Sub
' Slave adressieren
Public Function I2C_Slave(ByVal Addr As Byte) As Boolean
Dim BytePos As Byte = 128
For count As Integer = 0 To 7
' Die 8 Bits der Slaveadresse werden nacheinander auf
' die SDA-Leitung gelegt und
' jeweils mit einem Impuls auf der SCL-Leitung bestätigt.
' nach dem Stop-Befehl quittiert der Slave den Empfang der Daten
If (Addr And BytePos) = 0 Then
SDA(0)
Else
SDA(1)
End If
SCL(1)
SCL(0)
BytePos /= 2
Next
' SDA auf High Pegel setzen. Slave zieht auf Masse
SDA(1)
' 9. Impuls
SCL(1)
' Der Slave antwortet darauf mit neg. Flanke an SDA
If SDA_in() Then
SCL(0)
Throw New Exception("Kein Slave mit Addr. " + Addr + "
vorhanden.")
Else
SCL(0)
Return True
End If
End Function
' Werte von Slave auslesen
' Master sendet dazu 8 Impulse auf SCL und erhält high <
' und low Pegel auf SDA.
Public Function I2C_in() As Byte
Dim BytePos As Byte = 128
Dim Wert As Byte = 0
SDA(1)
For count As Integer = 0 To 7
SCL(1)
If SDA_in() Then
Wert += BytePos
End If
SCL(0)
BytePos /= 2
Next
Return Wert
End Function
' Wert zu Slave senden
Public Function I2C_Out(ByVal Wert As Byte) As Boolean
' Die Datenbits werden nacheinander auf SDA gelegt <
' und mit SCL bestätigt
' nach dem neunten Impuls quittierung durch Slave
Dim BytePos As Byte = 128
For count As Integer = 0 To 7
If (Wert And BytePos) = 0 Then
SDA(0)
Else
SDA(1)
End If
SCL(1)
SCL(0)
BytePos /= 2
Next
SDA(1)
SCL(1)
' Slave antwortet mit neg. Flanke auf Daten
If SDA_in() Then
SCL(0)
Throw New Exception("Kein Ack von Slave")
Else
SCL(0)
Return True
End If
End Function
End Class
End Namespace
</c>