Forum: Mikrocontroller und Digitale Elektronik ATmega64, ansteuern eines externen EEPROMS


von StefanD (Gast)


Angehängte Dateien:

Lesenswert?

Moin,

ich habe ein Problem mit der Programmierung eines ATmega64. Ich möchte
über die I²C – Schnittstelle ein externes EEPROM ansteuern. Die
Programmierung erfolgt in C. Das beschreiben klappt wunderbar, nur das
Auslesen ist noch nicht so wie es mir vorstelle. Die Aufgabe ist, drei
Datenbytes aus dem EEPROM auszulesen. Zuerst wird die Adresse mit dem
Bit, das für die Schreib-Lese-Erkennung zuständig ist, gesendet.
Daraufhin wird vom EEPROM ein ACK gesendet.
Nach einer Stop bzw. Start - Condition wird das erste Datenbyte vom
EEPROM gelesen. Nun sollte der Controller mit einem ACK antworten
sodass das nächste Datenbyte ausgelesen werden kann. Tatsächlich aber
wird ein NACK gesendet und der Lesevorgang wird daraufhin beendet.
Im Datenblatt des Atmega unter TWI -> Data Packet  Format steht unter
anderem, dass aus einigen Gründen, welche nicht weiter aufgeführt sind,
kein weiteres Byte mehr empfangen werden kann. Der Sender wird dann mit
einem NACK nach dem letzten Byte automatisch „informiert“. Was sind nun
die Gründe?

Vielleicht hatte hier ja schon jemand ein solches Problem und hätte
eine passende Antwort auf meine Frage.

Den Source-Code habe ich beigefügt.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

1. Ich habe mir deinen Sourcecode nicht angeguckt
2. Ich habe noch nichts mit der TWI gemacht

Aber:
>Nach einer Stop bzw. Start - Condition
Der Master-Read-Mode wird mit dem Schreiben der Slave-Adresse (SL+R)
und der Speicherplatzadresse eingeleitet. Danach wird eine "repeated"
Start-Condition gesendet und die Daten empfangen. Die
Repeated-Start-Condition ist eine Start-Condition ohne vorherige
Stop-Condition.
Zumnidest habe ich die TWI bis jetzt so verstanden (mein nächstes
Projekt braucht die TWI, allerdings habe ich den Slave nocht nicht in
den Händen).

von Sonic (Gast)


Lesenswert?

Na, wenn's im Datenblatt steht dass nur 1 Byte empfangen werden kann
(warum auch immer) und das auch so abläuft wird's wohl schon richtig
sein. Wollte demnächst auch ein Projekt mit dem mega128 und TWI
starten, nehme jetzt aber lieber Abstand! Werd' mich mal lieber in den
2560 einlesen.

von Sonic (Gast)


Lesenswert?

Soory war wohl vom mega64 die Rede!

von Peter D. (peda)


Lesenswert?

Wenns nur ein Single-Master sein soll, ist Software-I2C viel einfacher,
universeller und codesparender.


Ganz wichtig bei HW-I2C ist, aber auch wirklich jeden Zustand zu
erkennen und behandeln !
Sonst bleibt beim kleinsten Störimpuls die Hardware in irgendeinem
Zustand hängen und nichts geht mehr.

Hat sich ein Slave verhakt, muß man das HW-I2C disablen und bis zu 9*
versuchen einen Taktimpuls und ein Stop zu senden.


Zum Lesen mehrerer Bytes muß der Master natürlich imme ein ACK senden.
Nur vor dem Lesen des letzten Bytes muß das ACK-Bit zurückgesetzt
werden, damit danach das NACK kommt.
Das NACK sagt dem Slave, daß nun Schluß ist und er den Bus loslassen
muß, damit der Master das STOP senden kann.


Peter

von StefanD (Gast)


Lesenswert?

Hallo Peter,

dass ein ACK gesendet werden muss ist mir klar, jedoch sendet der
Controller unabhängig von meinen Einstellungen im TWCR immer ein NACK.
Denn um ein ACK zu erhalten muss das TWEA Bit auf eins gesetzt werden.
Das habe ich auch getan, erhalte jedoch trotzdem ein NACK. Aber was
sind diese mir noch schleierhaften Gründe warum denn der Controller
selbsständig die Datenübertragung abbricht? Ich habe auch mal die
Textpassage eingefügt wo die Möglichkeit erwähnt wird.Die wichtigste
Textstelle hab ich umrandet. Ansonsten ist alles im Datenblatt des
Atmega64 zu finden, was ich nicht anhängen wollte da es doch recht groß
ist ( 3,5 MB).



Data Packet Format All data packets transmitted on the TWI bus are nine
bits long, consisting of one data byte and an acknowledge bit. During a
data transfer, the Master generates the clock and the START and STOP
conditions, while the Receiver is responsible for acknowledging the
reception. An Acknowledge (ACK) is signalled by the Receiver pulling
the SDA line low during the ninth SCL cycle. If the Receiver leaves the
SDA line high, a NACK is signalled.
__________________________________________________________________
When the Receiver has received the last byte, or for some reason   -
cannot receive any more bytes, it should inform the Transmitter by
-sending a NACK after the final byte. The MSB of the data byte is
-transmitted first.                                                 -
___________________________________________________________________-

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.