PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 24c128 24c256



Vitis
25.08.2005, 17: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

Keksdose
20.02.2006, 22:30
Ich weiß nich obs an mir liegt jedenfalls hat diese lösung mit sehr viel hin und herprobieren immernoch nicht funktioniert. Habs nu mit bisschen rumsuchen und probieren anders gelöst. Deshalb meine Lösung nochmal damit sich nich noch mehr leute damit rumärgern müssen wenns nich geht ](*,)


'Hardware: AT Mega 32
$regfile = "m32def.dat"
$crystal = 7372800

'I2C konfigurieren
Config Sda = Porta.7
Config Scl = Porta.6

Dim Wert As Byte
Dim Adresse As Word
Dim Temp As Byte

'Funktionen deklarieren
Declare Sub Read_byte(byval Ee_adresse As Word, Value As Byte)
Declare Sub Write_byte(byval Ee_adresse As Word , Byval Ee_daten As Byte)

'Hauptprogramm===================================
Print "EEPROM schreiben...";
Do

For Adresse = 1 To 5 ' die ersten 5 Byte schreiben
Wert = Adresse + 100 'Beginnend mit Zahlenwert 105 um Verwechslungen zu vermeiden
Call Write_byte(adresse , Wert) 'Daten schreiben
Next

Wait 1
Print "*2";
Print "EEPROM lesen: ";
Print "*3";

For Adresse = 1 To 5 'die geschriebenen 5 Byte auslesen
Call Read_byte(adresse , Wert) 'auslesen
Print Str(wert); 'Ausgabe an UART
Next

Loop


'Funktionen=============================

'Routine zum schreiben von Daten in das EEPROM
Sub Write_byte(byval Ee_adresse As Word , Byval Ee_daten As Byte)
Temp = High(ee_adresse) 'MSB von ee_adresse speichern
I2cstart 'generate start
I2cwbyte &B10100000 'write addres of24C65
I2cwbyte Temp 'write high adress
I2cwbyte Ee_adresse 'write low adress
I2cwbyte Ee_daten 'write daten
I2cstop 'Stop senden zum schreiben
End Sub

'Routine zum lesen von Daten aus dem EEPROM
Function Read_byte(byval Ee_adresse As Word , Value As Byte)
Temp = High(ee_adresse) 'MSB von ee_adresse speichern
I2cstart 'generate start
I2cwbyte &B10100000 'write addres of 24C65
I2cwbyte Temp 'write high adress
I2cwbyte Ee_adresse 'write low adress
I2cstart 'generate repeated start
I2cwbyte &B10100001 'write read commando
I2crbyte Value , Nack
I2cstop
End Function