Forum: Mikrocontroller und Digitale Elektronik Problem I2C wenn SCL zum Slave hinzukommt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Martin M. (ats3788)


Lesenswert?

Hallo
Master PIC18F46K20 - Slave MCP3428
Ich habe ein Merkwürdiges Problem

wenn ich den SCL von Slave in den Bus schalte
geht SCL und SDA down, dann entferne ich SCL vom
Slaven, reboot den MC und (SCL und SDA) ist wieder da.

Manchmal funktioniert das ganze auch richtig
es gibt ein Ack vo Slave.

Ich habe den Bus schon verschieden terminiert (2,7K - 10k)
Wenn der Bus down ist hat, SDA - 0V SCL - High 3,3V

von I2CBusHalter (Gast)


Lesenswert?

Ein I2C Slave der selbständig einen Clock auf den Bus schickt
isr kein Slave. Da hast du was verwechselt. Ein Slave darf
nur auf den Clock vom Master mit Daten reagieren.

von Sepp (Gast)


Lesenswert?

Martin Michael schrieb:
> geht SCL und SDA down

nennt sich "BUS Error."

--> Da ist was faul

von Martin M. (ats3788)


Lesenswert?

Danke erst mal
--> Da ist was faul

Ja das ist es, ich habe den Code nochmal überarbeitet
und habe nun einen ganz guten sauberen Takt.
Aber wenn ich lese bekomme ich 0xff.

Hier mein Code den ich vom Adrino für Pic umgerschrieben habe

int mcp_read(unsigned char Adr, unsigned char ch) {
  unsigned char adcupper = 0;
  unsigned char adclower = 0;

  // Config
  // PGA = 1, Resolution = 16 bits (15 SPS), Conversion mode = One shot
 StartI2C();
 WaitStatus(Adr | I2C_WRITE);
 IdleI2C();
 WaitStatus(0b10001000);         // See page 18 in the MCP3428 datasheet

 IdleI2C();
  // MCP3428 read data addr
 WaitStatus(Adr | I2C_READ);     // set adc address for reading
 IdleI2C();
 adcupper = ReadI2C();      // read 2nd byte (upper data byte)
 //adcupper =  i2c_rx();
  AckI2C();
 //adclower =   i2c_rx();
  adclower = ReadI2C();     // read  3rd byte (lower data byte)
  NotAckI2C();
  StopI2C();                      // set stop conditon = release bus

  return (adcupper << 8 | adclower);
}

von Wolfgang (Gast)


Lesenswert?

I2CBusHalter schrieb:
> Ein I2C Slave der selbständig einen Clock auf den Bus schickt
> isr kein Slave.

Dann hast du I2C noch nicht verstanden. Wenn der Slave den Clock 
runter zieht, nennt sich das clock streching.
Ein defekter Slave kann damit den Bus lahm legen.
http://www.i2c-bus.org/de/clock-stretching/

von Peter D. (peda)


Lesenswert?

Martin Michael schrieb:
> Wenn der Bus down ist hat, SDA - 0V SCL - High 3,3V

Dann machst Du irgendwas falsch.
Ich kenne den PIC nicht, aber beim AVR muß man vor dem letzten Byte 
lesen auf NACK setzen. Vor dem Stop ist es zu spät, da wurde das ACK ja 
bereits gesendet.

von (prx) A. K. (prx)


Lesenswert?

Wolfgang schrieb:
> Dann hast du I2C noch nicht verstanden. Wenn der Slave den Clock
> runter zieht, nennt sich das clock streching.

Allerdings wird das von Hardware-Slaves recht selten genutzt und im 
Datasheet des MCP3428 ist SCL ausschliesslich ein Eingang (S.2). 
Stretching findet man dagegen regelmässig bei einem µC als Slave.

Es gibt also keinen Grund, weshalb ein korrekt verschalteter Slave SCL 
auf GND ziehen sollte. Weshalb ich das Augenmerk in diesem Fall eher auf 
die Hardware legen würde, nicht auf die Software.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Martin Michael schrieb:
> Ich habe ein Merkwürdiges Problem

Schaltbild(er) und Fotos vom Aufbau könnten helfen.

von Martin M. (ats3788)


Angehängte Dateien:

Lesenswert?

Ja das dachte ich mir auch

Kann das Oszi Screenshot
für eine

11011100 + 10001000
hinhalten und kann jemand das
I2C Diagramm erklären

Achso oben ist der SCL und unten SDA

Vielleicht weiss ja jemand eine Seite wo das I2C
Protokoll mit vielen Schaubildern erklärt wird.


void mcp_general_call_reset(unsigned char Adr) {

  // Adr  = 0b11011100 + I2C_WRITE = 0;
  StartI2C();
   WaitStatus(Adr | I2C_WRITE);
   IdleI2C();
   WaitStatus(0b10001000);
   StopI2C();           // set stop conditon = release bus
}




Seit mir nicht böse wenn manches unlogisch klingt
vorgestern hatte ich nur das Wissen das es so was wie I2C
als Bus gibt.

von (prx) A. K. (prx)


Lesenswert?

Im LA/DSO I2C korrekt einfangen, inklusive start condition:

Im Programm eine einmalige Sequenz aus Adresse und 1 Datenbyte 
übertragen. Keine Wiederholung, danach Totschleife.

Oszi auf single event stellen, Trigger auf negative Flanke von SDA.

Programm loslaufen lassen.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Martin Michael schrieb:
> Vielleicht weiss ja jemand eine Seite wo das I2C
> Protokoll mit vielen Schaubildern erklärt wird.

Timing-Diagramme findest du in fast jedem Datenblatt von I2C-Bausteinen.
Oder hier Kurzfassung
Beitrag "Re: PCF8583 Uhr mit I2C ansteuern"

oder die I2C-Bus Spezifikation vom Erfinder des I2C
http://i2c2p.twibright.com/spec/i2c.pdf

von (prx) A. K. (prx)


Lesenswert?

Martin Michael schrieb:
> Vielleicht weiss ja jemand eine Seite wo das I2C
> Protokoll mit vielen Schaubildern erklärt wird.

http://de.wikipedia.org/wiki/I²C#Weblinks

von Martin M. (ats3788)


Angehängte Dateien:

Lesenswert?

Hallo
Erst mal Danke für die Hilfe
Den Single Shot habe ich ja hinbekommen.

von Wolfgang (Gast)


Lesenswert?

Martin Michael schrieb:
> Den Single Shot habe ich ja hinbekommen.

Deine steigenden Flanken sehen arg verschliffen aus. Wie groß waren dein 
Pull-up Widerstände? Etwas kleinere Werte würden da nicht schaden.

von (prx) A. K. (prx)


Lesenswert?

Martin Michael schrieb:
> Den Single Shot habe ich ja hinbekommen.

Bei dem Trace kriege ich den längeren Puls direkt nach der 
Startbedingung nicht sauber einsortiert. Das sieht aus wie zwei 
Startbedingungen direkt hintereinander.

Der vorherige Trace hingegen sieht gut aus, da wird die Adresse auch 
acked, hier nicht.

: Bearbeitet durch User
von Martin M. (ats3788)


Lesenswert?

Vielen Herzlichen Dank für die Antworten.
Bin erst mal gefrustet.

Wenigsten verstehe ich das I2C Protokoll ein wenig.
Ich hätte nicht mit dem ADC MCP3424
anfangen sollen.

Werde mir nächste Wochen ein I2C EEProm holen und damit üben,
bis ich das richtig verstehe, dafür gibt es Beispiele.

By the way

Microchip schlägt 5 - 10 k vor,
das ging gar nicht habe jetzt 2,7 k.

Wenn ich fertig bin werde ich das bei
http://pic-projekte.de/

veröffentlichen

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]
  • [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.