PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : eeprom an I²C Bus



Static
26.05.2005, 22:26
Hallo, ich habe ein RN-Control Board mit einem Mega 32 drauf. Da der interne Ram nicht ausreicht habe ich noch einen 24LC64 eeprom an den I²C Bus angeschlossen. Ich habe direkt diesen Stecker auf dem Board benutzt, da kann ich mir doch die Pull-Up Widerstände sparen, oder? Die Adress Anschlüsse des e²proms hab ich direkt auf GND gelegt.
Mein Programm in Bascom, zum testen sieht so aus:


$regfile = "m32def.dat"
$crystal = 7372800 'Quarzfrequenz
$baud = 9600

Enable Interrupts

Config Portc = Output
Config Sda = Portc.1
Config Scl = Portc.0

Print "EE - Test"
Waitms 500

Declare Sub Write_eeprom(byval Adres As Word , Byval Value As Byte)
Declare Sub Read_eeprom(byval Adres As Word , Value As Byte)

Const Addressw = 160 'slave write address
Const Addressr = 161 'slave read address
Dim I As Word
Dim B1 As Byte , Adres As Word , Value As Byte
Dim Temp As Byte , Temp2 As Byte

Print "schreibe"

For I = 1 To 100
Value = I
Print I
Call Write_eeprom(i , Value)
Next I

End

Waitms 200

Print "lese"

I = 1

For I = 1 To 100
Value = 0
Call Read_eeprom(i , Value)

Print I ; "= " ; Value ; " ";
Waitms 20
Next I
End

Print "fertig"

Sub Write_eeprom(byval Adres Word , Byval Value As Byte)
Temp = High(adres)
Temp2 = Low(adres)
I2cstart 'start condition
I2cwbyte Addressw 'slave address
I2cwbyte Temp 'asdress of EEPROM
I2cwbyte Temp2
I2cwbyte Value 'value to write
I2cstop 'stop condition
Waitms 10 'wait for 10 milliseconds
End Sub

Sub Read_eeprom(byval Adres Word , Value As Byte)
Temp = High(adres)
Temp2 = Low(adres)
I2cstart 'generate start
I2cwbyte Addressw 'slave adsress
I2cwbyte Temp
I2cwbyte Temp2 'address of EEPROM

I2cstart 'repeated start
I2cwbyte Addressr 'slave address (read)
I2crbyte Value , Nack 'read byte
I2cstop 'generate stop
Waitms 10
End Sub


Das funktioniert bloß leider nicht, nach dem schreibvorgang passiert nichts mehr. Die Ports für SDA und SCL sind doch richtig, oder? Woran kann es sonst liegen?

PicNick
27.05.2005, 07:29
Beim Lesen mußt du noch einen Stop einbauen, nach dem adress-senden.
Stimmt das mit der Reihenfolge High(addr) -- Low(addr) ?

27.05.2005, 10:14
Also laut Datenblatt muss da kein Stop hin. Nur 2x Start und am Ende einmal stop. Im Datenblatt steht auch, dass die Adresse in high und low bits getrennt gesendet werden muss.

Static
27.05.2005, 10:16
lol, vergessen einzuloggen

29.05.2005, 13:15
lol, wenn man auch zu dumm ist dem ding Strom zu geben. Jumper Jp6 war bei mir nicht gesetzt, da hätte ich ja lange rum probieren können. Jedenfalls klappts jetzt, nachdem ich noch das end nach der ersten Schleife weg gemacht habe ](*,)