ao_mutex_put(&ao_i2c_mutex[index]);
}
+static inline void
+ao_i2c_delay(void)
+{
+ uint8_t i;
+
+ for (i = 0; i < 10; i++)
+ ao_arch_nop();
+}
+
#define I2C_DEBUG 0
#if I2C_DEBUG
-#define DBG(x...) printf(x)
+#define DBG(x...) do { printf(x); flush(); } while (0)
#else
-#define DBG(x...)
+#define DBG(x...)
#endif
static inline uint32_t in_sr1(char *where, struct stm_i2c *stm_i2c) {
uint32_t sr1 = stm_i2c->sr1;
- DBG("%s: sr1: %x\n", where, sr1); flush();
+ DBG("%s: sr1: %x\n", where, sr1);
return sr1;
}
static inline uint32_t in_sr2(char *where, struct stm_i2c *stm_i2c) {
uint32_t sr2 = stm_i2c->sr2;
- DBG("%s: sr2: %x\n", where, sr2); flush();
+ DBG("%s: sr2: %x\n", where, sr2);
return sr2;
}
static inline void out_cr1(char *where, struct stm_i2c *stm_i2c, uint32_t cr1) {
- DBG("%s: cr1: %x\n", where, cr1); flush();
+ DBG("%s: cr1: %x\n", where, cr1);
stm_i2c->cr1 = cr1;
}
static inline uint32_t in_cr1(char *where, struct stm_i2c *stm_i2c) {
uint32_t cr1 = stm_i2c->cr1;
- DBG("%s: cr1: %x\n", where, cr1); flush();
+ DBG("%s: cr1: %x\n", where, cr1);
return cr1;
}
static inline void out_cr2(char *where, struct stm_i2c *stm_i2c, uint32_t cr2) {
- DBG("%s: cr2: %x\n", where, cr2); flush();
+ DBG("%s: cr2: %x\n", where, cr2);
stm_i2c->cr2 = cr2;
}
static inline uint32_t in_dr(char *where, struct stm_i2c *stm_i2c) {
uint32_t dr = stm_i2c->dr;
- DBG("%s: dr: %x\n", where, dr); flush();
+ DBG("%s: dr: %x\n", where, dr);
return dr;
}
static inline void out_dr(char *where, struct stm_i2c *stm_i2c, uint32_t dr) {
- DBG("%s: dr: %x\n", where, dr); flush();
+ DBG("%s: dr: %x\n", where, dr);
stm_i2c->dr = dr;
}
out_cr2("start", stm_i2c, AO_STM_I2C_CR2);
out_cr1("start", stm_i2c,
AO_STM_I2C_CR1 | (1 << STM_I2C_CR1_START));
+ ao_i2c_delay();
out_cr2("start", stm_i2c,
AO_STM_I2C_CR2 | (1 << STM_I2C_CR2_ITEVTEN) | (1 << STM_I2C_CR2_ITERREN));
ao_alarm(1);
struct stm_i2c *stm_i2c = ao_i2c_stm_info[index].stm_i2c;
uint8_t *b = block;
uint32_t sr1;
- int t;
-
uint8_t tx_dma_index = ao_i2c_stm_info[index].tx_dma_index;
/* Clear any pending ADDR bit */
ao_i2c_channel_init(uint8_t index)
{
struct stm_i2c *stm_i2c = ao_i2c_stm_info[index].stm_i2c;
+ int i;
/* Turn I2C off while configuring */
+ stm_i2c->cr1 = (1 << STM_I2C_CR1_SWRST);
+ for (i = 0; i < 100; i++)
+ asm("nop");
stm_i2c->cr1 = 0;
stm_i2c->cr2 = AO_STM_I2C_CR2;
stm_nvic_set_priority(STM_ISR_I2C2_ER_POS, 3);
#endif
}
-