Hallo Möchte gerne einen PIC 16f887 als I2C Slave ansteuern, er soll vom anderen Prozessor nur daten erhalten und keine senden. Nun habe ich den i2c Bus so void vI2CInit (void) { // Pin RC3 und RC4 vom PORTC als Eingaenge konfigurieren TRISC=(TRISC|0b00011000); // Busgeschwindigkeit einstellen SSPADD=0x06; // Adresse 0x06 // Modus setzen SSPCON=0x3E; // Slave mode, Takt freigeben, Schnittstelle ein } initialisiert und das Interuptflag SSPIF mit SSPIE freigegeben. Wenn der andere Prozessor nun ein Telegramm sendet, empfange ich die direkt die Adresse 0x06. Muss ich das ACK nun selber setzen oder wieso habe ich die Adresse im I2C Buffer? Was habe ich falsch gemacht? gruss daniel
Es wird auf dem I2C Bus immer die Adresse gesendet. Das dient der Ansteuerung mehrerer Busteilnehemer. Wenn Du also "Eine" Adresse empfängst, musst Du nun vergleichen ob es "Deine" Adresse ist und auch nur dann entsprechend reagieren. Eine unschöne Aussnahme wäre, wenn Dein Master und Slave "alleine" am Bus hängen, dann könntest Du annehmen, dass der Slave immer gemeint ist. Wie gesagt, unschön und bei einem 2. Slave am Bus tödlich. Gruß, avrGerd
Danke Gerd M. für die schnelle Antwort Ich lege jedoch dem PIC die Adresse auf die er ansprechen soll ins SSPADD Register, sollte er dan nicht selbst erkennen wann er angesprochen wird und wann nicht? so müsste ich ja immer selbst das ACK setzen, damit er das gesammte Telegramm sendet.
Sorry, kenne mich mit den Details bei den Pic's nicht aus. Sieht aber wie ein Hardware I2C Interface aus, welches Du benutzt. Eigentlich sollte im Datenblatt das exakte Verhalten beschrieben sein. Wichtig ist auch die Art und Weise wie die I2C Adresse im PIC behandelt wird. Ist die Info schreiben/lesen in der Adresse mit verheiratet? Das ist oft ein Verständnissproblem und führt oft zu Fehlern. Prüf das bitte mal nach. Gruß, avrGerd
Ja genau es handelt sich um ein Hardwareinterface. Danke für den Tipp avrGerd, such erade den Aufbau des Registers. Bin leider noch nicht fündig geworden aber kann bstimmt einen einfluss haben.
Hallo nochmals okey so wies aussieht muss ich das ACK selbst durchführen. Weis einer wie? oder gehts auch anders? stehe grad auf dem schlauch
daniel schrieb: > okey so wies aussieht muss ich das ACK selbst durchführen. RTFM (13.4.1)
1 | When an address is matched, or the data transfer after |
2 | an address match is received, the hardware |
3 | automatically will generate the Acknowledge (ACK) |
4 | pulse and load the SSPBUF register with the received |
5 | value currently in the SSPSR register. |
Gruß Oliver
Aber das ACK kommt trozdem von allein. Du musst nur die Daten (in diesem Fall die Adresse) abholen sonst gibt es stress mit overflow. Hab das ganze gerade für 2 PIC 16F887 und einen 16F886 zum laufen gebracht. Der 16F886 multiplext 4 LED Bargraph Zeilen mit 16LEDs und die beiden 16F887 kümmern sich um je 4*4 Stellen 7 Segment LED Anzeigen. mfG Michael
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.