Gast
#6495724
Hallo Gemeinde, kurze Frage: Ich verwende derzeit einen MSP430 i2c-Treiber der momentan endlos auf entsprechende Status-Bits des I2C-Bausteins polled: z.B.: /* Wait for the start condition to be sent and ready to transmit interrupt */ while ((UCB0CTL1 & UCTXSTT) && ((IFG2 & UCB0TXIFG) == 0)); /* Wait for the data */ while ( (IFG2 & UCB0RXIFG) == 0 ); Mit dieser Lösung bin ich leider nicht ganz zufrieden. Wenn nur ein Gerät am i2c-Bus sich aus welchen Gründen auch immer "verabschiedet" steht die SW halt für immer in einer der endlos-while()-Schleifen. Zudem verbraucht der MSP430 in der Schleife so um die 300uA. Ich würde die CPU daher gerne schlafen legen (LPM3) und von dem entsprechenden I2C-Interrupt wieder aufwecken. Allerdings: Was ist wenn der Interrupt niemals kommt, da ein angeschlossenes i2c-Gerät sich nicht meldet oder spinnt? Ich würde daher gerne den Watchdog parallel mitlaufen lassen, sodass ich aus diesem Endlos-Wartezustand wieder rauskomme... Den Watchdog würde ich vom ACLK speisen und auf 1000ms setzen. Nach einer 1 Sekunde würde die SW dann komplett neustarten, den I2c baustein wieder neu-initialisieren und versuchen das i2c-Gerät wieder anzusprechen. Die Frage ist, kann man das realisieren? Schlägt Watchdog auch zu, wenn man in LPM3 ist? Wie würdet ihr einen Timeout realisieren OHNE polling? Herzlichen Dank!!!