summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2014-07-12 07:42:42 +1000
committerLorenz Meier <lm@inf.ethz.ch>2014-07-12 16:06:14 +0200
commit7e1b97bcf10d8495169eec355988ca5890bfd5df (patch)
tree576b43e5befe3dfb77383928c58eaba7aebe9607
parent4b217e9a36b28975e5a7b40e525424cde72f7227 (diff)
downloadnuttx-7e1b97bcf10d8495169eec355988ca5890bfd5df.tar.gz
nuttx-7e1b97bcf10d8495169eec355988ca5890bfd5df.tar.bz2
nuttx-7e1b97bcf10d8495169eec355988ca5890bfd5df.zip
stm32_i2c: handle more unexpected ISR conditions
this clears the interrupt for more unexpected ISR conditions that otherwise lead to an ISR storm. When that happens no user threads are able to run as the I2C ISR is continually raised Thanks to Lorenz for help in tracking this down
-rw-r--r--nuttx/arch/arm/src/stm32/stm32_i2c.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/nuttx/arch/arm/src/stm32/stm32_i2c.c b/nuttx/arch/arm/src/stm32/stm32_i2c.c
index 30a8dc5e4..44978862d 100644
--- a/nuttx/arch/arm/src/stm32/stm32_i2c.c
+++ b/nuttx/arch/arm/src/stm32/stm32_i2c.c
@@ -1184,6 +1184,9 @@ static int stm32_i2c_isr(struct stm32_i2c_priv_s *priv)
priv->msgv++;
priv->msgc--;
+ } else {
+ /* clear ISR by writing to DR register */
+ stm32_i2c_putreg(priv, STM32_I2C_DR_OFFSET, 0);
}
}
@@ -1191,7 +1194,11 @@ static int stm32_i2c_isr(struct stm32_i2c_priv_s *priv)
else if ((status & I2C_SR1_ADD10) != 0)
{
- /* TODO: Finish 10-bit mode addressing */
+ /* TODO: Finish 10-bit mode addressing
+ for now just clear ISR by writing to DR register. As we
+ don't do 10 bit addressing this must be a spurious ISR
+ */
+ stm32_i2c_putreg(priv, STM32_I2C_DR_OFFSET, 0);
}
/* Was address sent, continue with either sending or reading data */
@@ -1251,6 +1258,9 @@ static int stm32_i2c_isr(struct stm32_i2c_priv_s *priv)
#ifdef CONFIG_I2C_POLLED
irqrestore(state);
#endif
+ } else {
+ // throw away the unexpected byte
+ stm32_i2c_getreg(priv, STM32_I2C_DR_OFFSET);
}
}