diff options
-rw-r--r-- | src/stm/ao_arch_funcs.h | 3 | ||||
-rw-r--r-- | src/stm/ao_i2c_stm.c | 38 |
2 files changed, 41 insertions, 0 deletions
diff --git a/src/stm/ao_arch_funcs.h b/src/stm/ao_arch_funcs.h index 05bb7784..3027b337 100644 --- a/src/stm/ao_arch_funcs.h +++ b/src/stm/ao_arch_funcs.h @@ -131,6 +131,9 @@ uint8_t ao_i2c_start(uint8_t i2c_index, uint16_t address); void +ao_i2c_stop(uint8_t i2c_index); + +void ao_i2c_put(uint8_t i2c_index); void diff --git a/src/stm/ao_i2c_stm.c b/src/stm/ao_i2c_stm.c index 1a0280d3..0717be98 100644 --- a/src/stm/ao_i2c_stm.c +++ b/src/stm/ao_i2c_stm.c @@ -135,11 +135,21 @@ ao_i2c_start(uint8_t index, uint16_t addr) } void +ao_i2c_stop(uint8_t index) +{ + struct stm_i2c *stm_i2c = ao_i2c_stm_info[index].stm_i2c; + + ao_i2c_state[index] = I2C_IDLE; + stm_i2c->cr1 = AO_STM_I2C_CR1 | (1 << STM_I2C_CR1_STOP); +} + +void ao_i2c_send(void *block, uint16_t len, uint8_t index) { struct stm_i2c *stm_i2c = ao_i2c_stm_info[index].stm_i2c; uint8_t tx_dma_index = ao_i2c_stm_info[index].tx_dma_index; + stm_i2c->cr2 &= ~(1 << STM_I2C_CR2_LAST); ao_dma_set_transfer(tx_dma_index, &stm_i2c->dr, block, @@ -162,6 +172,34 @@ ao_i2c_send(void *block, uint16_t len, uint8_t index) } void +ao_i2c_recv(void *block, uint16_t len, uint8_t index) +{ + struct stm_i2c *stm_i2c = ao_i2c_stm_info[index].stm_i2c; + uint8_t rx_dma_index = ao_i2c_stm_info[index].rx_dma_index; + + stm_i2c->cr2 |= (1 << STM_I2C_CR2_LAST); + ao_dma_set_transfer(rx_dma_index, + &stm_i2c->dr, + block, + len, + (0 << STM_DMA_CCR_MEM2MEM) | + (STM_DMA_CCR_PL_MEDIUM << STM_DMA_CCR_PL) | + (STM_DMA_CCR_MSIZE_8 << STM_DMA_CCR_MSIZE) | + (STM_DMA_CCR_PSIZE_8 << STM_DMA_CCR_PSIZE) | + (1 << STM_DMA_CCR_MINC) | + (0 << STM_DMA_CCR_PINC) | + (0 << STM_DMA_CCR_CIRC) | + (STM_DMA_CCR_DIR_PER_TO_MEM << STM_DMA_CCR_DIR)); + + ao_dma_start(rx_dma_index); + cli(); + while (!ao_dma_done[rx_dma_index]) + ao_sleep(&ao_dma_done[rx_dma_index]); + sei(); + ao_dma_done_transfer(rx_dma_index); +} + +void ao_i2c_channel_init(uint8_t index) { struct stm_i2c *stm_i2c = ao_i2c_stm_info[index].stm_i2c; |