Hallo,
Ich würde gerne ein externes EEPROM an einen Controller (ATMega 168)
anschließen. Jetzt habe ich natürlich die Qual der Wahl was ich genau
nehme. I2C SPI oder Microwire.
Ich habe bis jetzt noch nichts externes an einen Controller angebunden.
Welches der üblichen Protokolle wäre denn am einfachsten zu
implementieren? Vorteile/Nachteile?
Vielen Dank für eure Hilfe
Greiner
So, meine Teile sind jetzt gekommen und ich hab schon ein wenig
rumgebastelt. Wenig erfolgreich....
Ich hab jetzt alles wieder auseinander gerissen und fange systematisch
von vorne an :)
Ich hab dieses EEPROM:
http://www.produktinfo.conrad.com/datenblaetter/150000-174999/150260-da-01-en-EEPROM_25LC040_I_P.pdf
und diesen Controller:
http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf
Erstmal richtig anschließen:
Pins am EEPROM werden verbunden mit:
CS --> GND hab nur das eine EEPROM deshalb lass ich es die ganze Zeit
aktiv.
SO --> MISO
WP --> VCC brauch ich nicht
VSS --> GND
SI --> MOSI
SCK --> SCK
HOLD --> VCC brauch ich auch nicht
VCC --> VCC
soweit alles richtig?
Der CS muss an den Controller angeschlossen sein, darüber werden die
Bytegrenzen synchronisiert. Auch wenn es nur einen Slave gibt, muss CS
angesteuert werden.
Ansonsten ist es richtig angeschlossen.
Grüße,
Peter
Warum machst Du Dir das Leben so schwer.
Mit 24LCxxx I2C-Eproms ist die Sache sehr einfach.
Schreiben:
Deviceadresse senden
Eprom High Adresse senden
Eprom Low Adresse senden
Datenbytes senden
Lesen:
Deviceadresse senden
Eprom High Adresse senden
Eprom Low Adresse senden
Datenbytes Empfangen
Gruß Peter
@Peter
Der von Samuel K. angegebene Beitrag zeigt doch, wie "sehr einfach" die
Sache ist. Immerhin ein ASM-Code, aber "Das komplette TWI arbeitet im
Polling Mode, also nicht Interrupt basiert." - das scheint mir nun
leider noch nicht die effizienteste Methode zu sein. Kennt jemand noch
eine Quelle die den TWI-Int verwendet und in einer modularen Form
daherkommt die sich bequem in eigene ASM-Programme einpassen lässt? Ich
benötige eine Ansteuerung für ein 24LC512...
Gruß Tim
So ich habe weiter gebastelt, nur leider funktionier es nicht. Hardware
mäßig müsste alles stimmen, deshalb werd ich mal den code Posten.
1
SPIINIT:
2
ldi r16,(1<<DDB3)|(1<<DDB5)|(1<<DDB2)
3
out DDRB,r16
4
ldi r16, (1<<DDB2)
5
out PORTB,r16
6
ldi r16,(1<<SPE)|(1<<MSTR)
7
out SPCR,r16
8
ret
9
10
11
WRITEEEPROM:
12
ldi r16, 0
13
out PORTB, r16
14
ldi r16, 0b00000110
15
out SPDR, r16
16
wait:
17
in r16, SPSR
18
sbrs r16, SPIF
19
rjmp wait
20
ldi r16, (1<<DDB2)
21
out PORTB, r16
22
ldi r16, 0
23
out PORTB, r16
24
ldi r16, 0b00000010
25
out SPDR, r16
26
wait1:
27
in r16, SPSR
28
sbrs r16, SPIF
29
rjmp wait1
30
out SPDR, r17
31
wait2:
32
in r16, SPSR
33
sbrs r16, SPIF
34
rjmp wait2
35
out SPDR, r18
36
wait3:
37
in r16, SPSR
38
sbrs r16, SPIF
39
rjmp wait3
40
ret
41
42
READEEPROM: ldi r16, 0
43
out PORTB, r16
44
ldi r16, 0b00000011
45
out SPDR,r16
46
wait8:
47
in r16, SPSR
48
sbrs r16, SPIF
49
rjmp wait8
50
out SPDR, r17
51
wait9:
52
in r16, SPSR
53
sbrs r16, SPIF
54
rjmp wait9
55
out SPDR, r17
56
wait10:
57
in r16, SPSR
58
sbrs r16, SPIF
59
rjmp wait10
60
rcall DELAY
61
ret
SPIINIT initalisert den SPI Modus als Master.
WRITEERPOM schreibt den in r18 respeicherten Wert an die Adresse die in
r17 angegeben ist.
READEEPROM lädt den aus dem eeprom an der Adresse in r17 gespeicherten
Wert in r16.
Die ganzen Funktionen können erstmal nur auf die vordere Hälfte des
eeprom zugreifen, da das achte Adressbit überall Null ist. Zum
ausprobieren dürfte das aber egal sein.
Wenn ich nun z.b. den Wert 0x41 ins eeprom schreibe, dann lese und ihn
mir dann auf meinem LCD ausgeben lasse erscheint nur ein schwarzer
Kasten anstell eines A. (das LCD funktioniert sonst einwandfrei, daran
liegt es nicht)
vielen Dank für eure Hilfe
Freiner
Ja, das ist richtig. Hab wohl beim kopieren Mist gemacht. Das "in r16,
SPDR" steht jetzt ganz am Ende von READEEPROM, natürlich vor dem ret ;)
Trotzdem bleibt das Problem erhalten, angezeigt wird nur ein schwarzer
kasten und kein "A".