Hallo Daniel,
du solltest (zumindest beim Slave) auf jeden Fall die Pins für SCL und SDA verwenden, die hardwaremäßig dafür vorgesehen sind.
Folgender Code für einen Slave sollte funktionieren. Es wird z. B. der Buchstabe S oder X übertragen, gefolgt von einem weiteren Wert:
Code:
$regfile = "m8def.dat"
$crystal = 8000000
'Subs deklarieren
Declare Sub Twi_init_slave
'SDA = pind.4 ; SCL = pind.5 (Hardware TWI)
Waitms 100
Call Twi_init_slave ' TWI aktivieren
Const Maxanzahlbyte = 2 ' Wenn mehr Zeichen kommen werden diese verworfen !
Dim Messagebuf(maxanzahlbyte) As Byte
Dim Anzahlbuf As Byte ' Anzahl Zeichen die gesendet wurden
Dim Neuemsg As Byte ' zeigt an wenn eine neue Message gültig ist
Dim Twi_control As Byte ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte
dim tmp as byte
Const Slaveid = &H82 'Adresse für I2C
Twi_data = 0
Anzahlbuf = 0
Neuemsg = 0
Do
' schauen ob TWINT gesetzt ist
Twi_control = Twcr And &H80 ' Bit7 von Controlregister auslesen
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8 ' Status ->Bit3 bis Bit7
Select Case Twi_status
' Slave Adress received, wir sind gemeint !
Case &H60 :
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
Anzahlbuf = 0
Neuemsg = 0 ' Flag für Message ungültig
' Byte mit ACK
Case &H80 :
If Anzahlbuf < Maxanzahlbyte Then
Incr Anzahlbuf ' zähler +1
Messagebuf(anzahlbuf) = Twdr
End If
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
' Stop oder restart empfangen
Case &HA0 :
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
' es müssen 2 Byte sein, damit das Paket OK ist
If Anzahlbuf = 2 Then
Neuemsg = 1 ' Flag für Message gültig
Else
Neuemsg = 0 ' Flag für Message ungültig
End If
'Master will ein Byte haben
Case &HA8:
Twdr = Vers
Twcr = &B11000100
'Master will weiteres Byte haben
Case &HB8:
'TWDR = Count
'incr Count
'Twcr = &B11000100
' letztes Byte mit NACK, brauchen wir nicht
Case &H88 :
Case &HF8 :
' Fehler, dann reset TWI
Case &H00 :
Twcr = &B11010100 ' TWINT löschen, reset TWI
' was anderes empfangen, sollte nicht vorkommen
Case Else :
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
End Select
End If
' ein gültiges Paket angekommen
If Neuemsg = 1 Then
Neuemsg = 0 ' Flag wieder löschen
Select Case Messagebuf(1)
Case "S":
Tmp = Messagebuf(2)
'Mache etwas damit
Case "X":
Tmp = Messagebuf(2)
'Mache etwas anderes
Case Else:
End Select
Waitms 100
End If
Waitms 10
Loop
End
' TWI als slave aktivieren
Sub Twi_init_slave
Twsr = 0 ' status und Prescaler auf 0
Twdr = &HFF ' default
Twar = Slaveid ' Slaveadresse setzen
Twcr = &B01000100 ' TWI aktivieren, ACK einschalten
End Sub
Lesezeichen