Problem I2C wenn SCL zum Slave hinzukommt

OP #4041363
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
OP #4042791
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);
}
#4042932
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.
OP #4043106
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.
Angehängte Dateien:
#4043115
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.
OP #4045868
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren