aboutsummaryrefslogtreecommitdiffstats
path: root/src/stm32/stm32f0_i2c.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/stm32/stm32f0_i2c.c')
-rw-r--r--src/stm32/stm32f0_i2c.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/stm32/stm32f0_i2c.c b/src/stm32/stm32f0_i2c.c
index 9f4bbcc6..da632c35 100644
--- a/src/stm32/stm32f0_i2c.c
+++ b/src/stm32/stm32f0_i2c.c
@@ -195,6 +195,7 @@ i2c_write(struct i2c_config config, uint8_t write_len, uint8_t *write)
I2C_TypeDef *i2c = config.i2c;
uint32_t timeout = timer_read_time() + timer_from_us(5000);
int ret = I2C_BUS_SUCCESS;
+ uint8_t *write_orig = write;
// Send start and address
i2c->CR2 = (I2C_CR2_START | config.addr | (write_len << I2C_CR2_NBYTES_Pos)
@@ -207,6 +208,8 @@ i2c_write(struct i2c_config config, uint8_t write_len, uint8_t *write)
}
return i2c_wait(i2c, I2C_ISR_TXE, timeout);
abrt:
+ if (write == write_orig && ret == I2C_BUS_NACK)
+ ret = I2C_BUS_START_NACK;
i2c->CR2 |= I2C_CR2_STOP;
return ret;
}
@@ -218,6 +221,8 @@ i2c_read(struct i2c_config config, uint8_t reg_len, uint8_t *reg
I2C_TypeDef *i2c = config.i2c;
uint32_t timeout = timer_read_time() + timer_from_us(5000);
int ret = I2C_BUS_SUCCESS;
+ uint8_t *write_orig = reg;
+ uint8_t *read_orig = read;
// Send start, address, reg
i2c->CR2 = (I2C_CR2_START | config.addr |
@@ -236,11 +241,16 @@ i2c_read(struct i2c_config config, uint8_t reg_len, uint8_t *reg
while (read_len--) {
ret = i2c_wait(i2c, I2C_ISR_RXNE, timeout);
if (ret != I2C_BUS_SUCCESS)
- goto abrt;
+ goto abrt_read;
*read++ = i2c->RXDR;
}
return i2c_wait(i2c, I2C_ISR_STOPF, timeout);
+abrt_read:
+ if (read == read_orig && ret == I2C_BUS_NACK)
+ ret = I2C_BUS_START_READ_NACK;
abrt:
+ if (reg == write_orig && ret == I2C_BUS_NACK)
+ ret = I2C_BUS_START_NACK;
i2c->CR2 |= I2C_CR2_STOP;
return ret;
}