Forum: Mikrocontroller und Digitale Elektronik Freescale HCS08 Positives u. negatives Acknowledge am I2C Bus


von norticum (Gast)


Lesenswert?

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

von norticum (Gast)


Lesenswert?

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

von Steve (Gast)


Lesenswert?

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

von norticum (Gast)


Lesenswert?

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

von Steve (Gast)


Lesenswert?

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

von norticum (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.