Vitis
25.08.2005, 18:18
Für diejenigen, die wie ich Probleme mit dem Umgang mit I2C EEPROM haben hab ich mal mein Ergebniss hier rein gestellt, auf dass es anderen helfen möge.
Bausteine: 24c128 , 24c256
Declare Sub Write_eeprom(byval Adresh As Byte , Byval Adresl As Byte , Byval Value As Byte)
Declare Sub Read_eeprom(byval Adresh As Byte , Byval Adresl As Byte , Value As Byte)
' Adresse erzeugen:
' Pin A0 und A1 sind intern mit Pulldowns versehen, sind also
' wenn extern nicht beschaltet 0
' Die Der Baustein halt serienmäßig die Adresse Binär:
' 1 0 1 0 0 A1 A0 R/W
' also, angenommen man möcht bei A0 = 0 und A1=0 schreiben:
' Adresse: 10100000 = 160
' Lesen Adresse: 10100001 = 161
'
' der 24c128 und 24c256 brauchen für die Adressierung 2 Byte
' Den High-Byte der Adresse und den Lowbyte der Adresse.
' Einfach, da die soviel Speicher habn :o)
Const Addressw = 160 'slave write address
Const Addressr = 161 'slave read address
Dim B1 As Byte
Dim Value As Byte 'dim byte
dim Adresse as word at &HA0 ' Der Speicherbereich ist dem jeweiligen Baustein anzupassen, muß aber den overlayvariablen gleich sein
Dim Adresh As Byte at &HA1 overlay 'Highbyte der Adresse
Dim Adresl As Byte at &HA0 overlay 'Lowbyte der Adresse
Dim A As Byte 'allgemeine Variable für Berechnungen
For Adresse = 1 To 5 ' die ersten 5 Byte schreiben
Value = Adresse + 100 'Beginnend mit Zahlenwert 105 um Verwechslungen zu vermeiden
Call Write_eeprom(1 , Adresse , Value) 'Daten schreiben
Next Adresse
For Adresse = 1 To 5 'die geschriebenen 5 Byte auslesen
Call Read_eeprom(1 , Adresse , Value) 'auslesen
Print Value 'Ausgabe an UART
Next Adresse
Sub Write_eeprom(byval Adresh As Byte , Adresl As Byte , Value As Byte)
I2cstart 'start condition
I2cwbyte Addressw 'slave address
I2cwbyte Adresh 'asdress H of EEPROM
I2cwbyte Adresl 'asdress L of EEPROM
I2cwbyte Value 'value to write
I2cstop 'stop condition
Waitms 10 'wait for 10 milliseconds
End Sub
Sub Read_eeprom(byval Adresh As Byte , Adresl As Byte , Value As Byte)
I2cstart 'generate start
I2cwbyte Addressw 'slave adsress
I2cwbyte Adresh 'asdress H of EEPROM
I2cwbyte Adresl 'asdress L of EEPROM
I2cstart 'repeated start
I2cwbyte Addressr 'slave address (read)
I2crbyte Value , Nack 'read byte
I2cstop 'generate stop
End Sub
' Wires from the I2C address that are not connected will default to 0 in most cases!
' I2cstart 'start condition
' I2cwbyte &B1010_0000 'slave address
' I2cwbyte H 'high address
' I2cwbyte L 'low address
' I2cwbyte Value 'value to write
' I2cstop 'stop condition
' Waitms 10
Bausteine: 24c128 , 24c256
Declare Sub Write_eeprom(byval Adresh As Byte , Byval Adresl As Byte , Byval Value As Byte)
Declare Sub Read_eeprom(byval Adresh As Byte , Byval Adresl As Byte , Value As Byte)
' Adresse erzeugen:
' Pin A0 und A1 sind intern mit Pulldowns versehen, sind also
' wenn extern nicht beschaltet 0
' Die Der Baustein halt serienmäßig die Adresse Binär:
' 1 0 1 0 0 A1 A0 R/W
' also, angenommen man möcht bei A0 = 0 und A1=0 schreiben:
' Adresse: 10100000 = 160
' Lesen Adresse: 10100001 = 161
'
' der 24c128 und 24c256 brauchen für die Adressierung 2 Byte
' Den High-Byte der Adresse und den Lowbyte der Adresse.
' Einfach, da die soviel Speicher habn :o)
Const Addressw = 160 'slave write address
Const Addressr = 161 'slave read address
Dim B1 As Byte
Dim Value As Byte 'dim byte
dim Adresse as word at &HA0 ' Der Speicherbereich ist dem jeweiligen Baustein anzupassen, muß aber den overlayvariablen gleich sein
Dim Adresh As Byte at &HA1 overlay 'Highbyte der Adresse
Dim Adresl As Byte at &HA0 overlay 'Lowbyte der Adresse
Dim A As Byte 'allgemeine Variable für Berechnungen
For Adresse = 1 To 5 ' die ersten 5 Byte schreiben
Value = Adresse + 100 'Beginnend mit Zahlenwert 105 um Verwechslungen zu vermeiden
Call Write_eeprom(1 , Adresse , Value) 'Daten schreiben
Next Adresse
For Adresse = 1 To 5 'die geschriebenen 5 Byte auslesen
Call Read_eeprom(1 , Adresse , Value) 'auslesen
Print Value 'Ausgabe an UART
Next Adresse
Sub Write_eeprom(byval Adresh As Byte , Adresl As Byte , Value As Byte)
I2cstart 'start condition
I2cwbyte Addressw 'slave address
I2cwbyte Adresh 'asdress H of EEPROM
I2cwbyte Adresl 'asdress L of EEPROM
I2cwbyte Value 'value to write
I2cstop 'stop condition
Waitms 10 'wait for 10 milliseconds
End Sub
Sub Read_eeprom(byval Adresh As Byte , Adresl As Byte , Value As Byte)
I2cstart 'generate start
I2cwbyte Addressw 'slave adsress
I2cwbyte Adresh 'asdress H of EEPROM
I2cwbyte Adresl 'asdress L of EEPROM
I2cstart 'repeated start
I2cwbyte Addressr 'slave address (read)
I2crbyte Value , Nack 'read byte
I2cstop 'generate stop
End Sub
' Wires from the I2C address that are not connected will default to 0 in most cases!
' I2cstart 'start condition
' I2cwbyte &B1010_0000 'slave address
' I2cwbyte H 'high address
' I2cwbyte L 'low address
' I2cwbyte Value 'value to write
' I2cstop 'stop condition
' Waitms 10