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
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.
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); }
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/
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.
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
Martin Michael schrieb: > Ich habe ein Merkwürdiges Problem Schaltbild(er) und Fotos vom Aufbau könnten helfen.
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.
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
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
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
Hallo Erst mal Danke für die Hilfe Den Single Shot habe ich ja hinbekommen.
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.