Hallo Leute! Ich bin gerade dabei dieses Modul anzusprechen http://www.eldat.de/images/stories/produkte/easywave/module/rtrm08/Specification.pdf Die I2C Schreibroutine funktioniert, die Leseroutine auch aber leider nur einmal. Das ist auch schon mein Urproblem. Lasse ich die Leseroutine ein zweites mal durchlaufen bleibt die dann gleich nach der Adressierung des Slave stecken und zwar genau da wo ich auf das Ack vom Slave warte. Mein Logicport zeigt mir ein NAK vom slave. Ich bin mir sicher, das es ein Problem mit dem positiven und negativen Acknowledge zusammen hängt. Ich kann aber mit meinem Prozessor nur ein standart Ack erzeugen. Kann mir bitte jemand bei diesem Problem helfen? LG norticum
Hallo nochmal! Ich habs schon finden können wie man ein NACK sendet. Ich bin mir sicher, dass es mich schon einen Schritt weiter gebracht hat aber es ist immer noch keine Lösung in Sicht. Beim zweiten Durchlauf der Routine hängt die sich dann auf. Mittlerweile hab ich auch rausgefunden, dass wenn ich step by step durch die Routine gehe. Dann funktioniert es. Also hab ich gleich mal den I2C Bustakt auf ~36khz runtergeschraubt. Hilft alles nichts. Der Prozessor auf dem Funkmodul ist ein 16F689. Hat denn jemand schon eine Idee??? LG norticum
Hallo, hast du in deiner Routine berücksichtigt dass ein Slave die Datenrate durch sogenanntes "Clock streching" beeinflussen darf/kann. Beschrieben ist das auf der Seite 6 deines Datenblattes. > A slave can slow down the transfer by pulling the SCL line to low after > the falling edge (clock stretching). Jedesmal wenn du Clk auf 1 setzt musst du prüfen ob er wirklich auf 1 ist und gegebenenfalls solange warten bis er 1 ist !!! Gerade beim "Lesen" spielt das eine grosse Rolle denn du musst dem Slave Zeit geben die Daten bereitzustellen. Gruss Steve
Hallo Steve! An das hab ich auch schon gedacht, das wird wahrscheinlich auch so ein Problempunkt sein. Ich hab das gestern schon im Freescale Forum gepostet aber noch keine Antwort bekommen. http://forums.freescale.com/t5/8-Bit-Microcontrollers/IIC-Clock-stretching-on-an-MC9S08SH8/td-p/81967 Ich bin ja der Ansicht, dass das mein Prozessor von selbst macht. Ich hab jetzt schon die Datenrate ganz runtergeschraubt. Hilft leider nicht weiter. Es ist immer noch so, dass ich im Debugger x mal per Hand problemlos durchsteppen kann und im Normalbetrieb bleibt er wieder beim zweiten Durchlauf stecken. Das mit dem Clockstretching ist ein guter Tipp vielen Dank! Ich hab heute schon mit dem Entwickler des Moduls gesprochen, der meinte das selbe. Ich werde mich mal auf das konzentrieren. Wie macht das eigendlich Atmel oder Microchip u. wie die alle heissen? Können die das Clock stretching automatisch in Hardware behandeln oder muss man sich hier in Software etwas einfallen lassen? LG norticum
Nochmals Hallo, ich hab mich erst vor Kurzem mit IIC bei einem ARM7 (LPC2148) abgemüht. Dieser uC macht eigentlich alles von selbst wenn man alle Register richtig setzt und auf die Interrupts richtig reagiert. Aber bis man soweit ist ...!!! Aber jetzt nochmal zu Deinem Problem. Ich hab mal rein aus Interesse die Datenblätter des Transceivers und das von MC9S08SH8 durchgelesen und mir ist folgendes aufgefallen. Die "SCL Stop hold time" im MC9S08SH8 kann selbst bei einer IIC baud rate von 100kbps mehr als 5.000 usec (d.h. 5 Millisekunden) betragen. Kann es sein dass du wieder auf den Transceiver zugreifst bevor der überhaupt ein "Stop"-Signal gesehen hat. Lass mal eine ausreichende Pause zwischen 2 Transfers. Denn die Tatsache dass es beim ersten Mal geht und dann nicht mehr ist eher ein Hinweis darauf dass der erste Transfer nicht richtig abgeschlossen ist !!! Gruss Steve
Hallo Steve! Also nun klappt es. Ich denke es war wirklich nur das mit dem positiven und negativen ACK am Ende des Datenempfangs. Ich hab folgendes gemacht; Ich habe am Ende meiner Leseroutine erst das STOP Signal gesendet und danach die Daten aus dem Datenregister entnommen. Das war vorher verdreht. Ich hab einfach mal auf das Bus Busy Flag am Anfang meiner Routine geachtet. Beim zweiten Durchlauf ist die Routine genau da stecken geblieben. Was bedeuten soll, dass der Bus wie Du schon meintes nicht richtig abgeschlossen wurde. Also die Kleinigkeit entgegen der Beschreibung im Datenblatt geändert und es klappte. Beim PCF8574 ist es genau anders, da muss ich als erstes das Datenbyte holen und danach die STOP Bedingung setzen. Vielen Dank für das "Brainstorming", es war sehr interessant und ausgesprochen zielführend! LG norticum
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.