www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C / TWI EEPROM 24C02B


Autor: 7_of_9 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich möchte per Software ein serielles (I2C) eeprom ansteuern.
leider gelingt es mir nicht es zu assimilieren ;-)

Ich bekomme kein ACK nach dem ich die EEPROM Adresse und das write bit 
gesendet habe.

Mit den Bibliotheken im Compiler scheint es zu funktionieren obwohl ich 
auch da kein ACK seitens des EEPROMS feststellen konnte weswegen ich es 
nochmal selbst schreiben wollte.

Ich benutzte ein 24C02B von Microchip, liegt an 5V. Alle Adressbits sind 
= 0 und WP ist auch 0 (keine write protection).
SDA und SCL liegen über 10K an VCC.

Wenn das EEPROM nicht eingesteckt ist sieht das Signal so aus wie im 
Datenblatt.
Stecke ich es ein, kommt die "Start Condition" nicht mehr an, auch ist 
nach der Übetragung SDA immer low obwohl es input ist mit pull up 
versehen...

Siehe hierzu die beiden Bilder vom Oszi, sowie vom EEPROM.
Controller und PullUps sitzen auf dem Entwicklungsboard.

Wahrscheinlich hab ich etwas übersehen sonst würde es ja auch generell 
nicht funktionieren.

tnx
7

Autor: 7_of_9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh jetzt hab ich doch glatt den Programmcode vergessen ...

program att13softuart1;
//running on atmega8 8mhz external clock (from crystal)
var I2C_Scl_Output        : sbit at PORTB0_bit;
var I2C_Sda_Output        : sbit at PORTB1_bit;
var I2C_Scl_Input         : sbit at PINB0_bit;
var I2C_Sda_Input         : sbit at PINB1_bit;
var I2C_Scl_Direction : sbit at DDB0_bit;
var I2C_Sda_Direction : sbit at DDB1_bit;

procedure sendbyte(datenwort: byte);
var i: byte;
    begin
    i:=0;
    while i <8 do begin
    I2C_Sda_output := datenwort.7;
    datenwort := datenwort shl 1;
    delay_us(15);
    I2C_Scl_output := 1;
    delay_us(15);
    I2C_Scl_output := 0;
    delay_us(15);
    inc(i);
    end;
    I2C_Sda_Direction := 0;
    //await ack
    end;

begin
  I2C_Sda_output := 1;
  I2C_Scl_output := 1;
  I2C_Scl_Direction := 1;
  I2C_Sda_Direction := 1;

  delay_us(15);
  I2C_Sda_output :=0;  //start condition
  delay_us(15);
  I2C_Scl_output := 0;  //clock low
  delay_us(15);
  sendbyte(160); //sending device adress + write
end.

Autor: Klaus 2m5 (klaus2m5)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mir ins Auge sticht: die Clock bleibt am Ende low, auch mit offenem 
Ausgang. Dir fehlt noch eine halbe Clock, oder Du fängst auf der 
falschen Flanke an.

Autor: Mike R. (thesealion)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein EEPROM möchte dir vielleicht ein ACK senden, allerdings forderst du 
es nicht dazu auf.
Dir fehlt einfach der Clock Puls, bei dem das EEPROM das Ack senden 
soll. Von sich aus darf es das nicht, der Puls muß vom Master generiert 
werden.

Autor: 7_of_9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also der ClKport ist nach dem 8takt immer noch ausgang. Nur der SDAport 
wird als Input geschaltet.
Ich dachte der Master (µC) wartet auf das ACK und macht dann den 9Takt, 
deswegen wäre es ja nicht notwendig CLK als Input zu schalten oder?

Klaus 2m5 schrieb:
> Dir fehlt noch eine halbe Clock, oder Du fängst auf der
> falschen Flanke an.

...wieso? das Bit wird mein ich gültig zur steigenden Taktflanke. Und da 
sind 8 da. Oder meinst du ich muss bevor ich auf das ACK warte nochmal 
takten?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>  I2C_Sda_output := 1;
>  I2C_Scl_output := 1;


Bei Software-I2c wird Portx nicht auf H gesetzt. Das bleibt immer auf L. 
Es wird lediglich DDRx geschaltet.

MfG Spess

Autor: 7_of_9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gut, ich habe vor ende der procedure sentbyte noch die Anweisung 
I2C_Scl_output := 1; gesetzt um noch einen Takt zu erzeugen.
Allerdings bleibt SDA immer low egal welche adresse ich sende.

Autor: 7_of_9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Bei Software-I2c wird Portx nicht auf H gesetzt. Das bleibt immer auf L.
> Es wird lediglich DDRx geschaltet.

hmm du verwirrst mich ein bisschen. Um die start condition zu erzeugen 
müssenja SDA und CLK erstmal beide high sein, während dann SDA auf low 
geht ...
außerdem bleiben sie ja nicht immer auf high sondern nur eben am anfang.

Autor: Daniel H. (doomstar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

du hast auch ein pull up Widerstand für die beiden Bus Leiteungen 
verwenden?

auf dem Bild seh ich die leider nicht?

Gruß
Daniel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>hmm du verwirrst mich ein bisschen.

Um ein H auf der Busleitung zu erzeugen, wird das Pin auf Eingang 
geschaltet.
Der Pull-Up zieht die Leitung dann auf H. Das L wird durch Setzen als 
Ausgang erzeugt. Es gab mal eine AppNote von Atmel zu Software-I2C. Wenn 
es dich interessiert, kann ich die mal anhängen.

MfG Spess

Autor: 7_of_9 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Jo hab hier auch nochmal ein pic.
ich hatte die auch schonmal direct am EEPROM hat aber auch nix gebracht.
Ich denke eher das liegt am timing oder am EEPROM. Allerdings sollte das 
EEPROM 400khz takt verkraften da bin ich noch weit von entfernt ...

Autor: 7_of_9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Es gab mal eine AppNote von Atmel zu Software-I2C. Wenn
> es dich interessiert, kann ich die mal anhängen.

ja das wäre nett vielleicht springt mir ja was ins okkular implantat.

Ich habe es trotzdem schonmal so geändert das ich low high mit 
input/output schalte.

Was mich etwas verwunder hat ist, dass obwohl ich zu Beginn beide Pins 
als Input habe, SDA low ist wenn das EEPROM eingesteckt ist ansonsten 
high.
Das EEPROM darf SDA doch nicht auf low ziehen oder?

Autor: spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>ja das wäre nett vielleicht springt mir ja was ins okkular implantat.

Kein Problem.

>Das EEPROM darf SDA doch nicht auf low ziehen oder?

Nein. Aber möglicherweise hast du mit deinem aktiven H auf der 
Busleitung den Anschluss von EEPROM gekillt.

MfG Spess

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.