From 0266e08dbf19e2204fb5f758d5d0f944d2afff7d Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Wed, 25 Apr 2012 23:26:57 -0700 Subject: [PATCH] altos: Add STM I2C recv and stop funcs Recv doesn't appear to work with more than one byte Signed-off-by: Keith Packard --- src/stm/ao_arch_funcs.h | 3 +++ src/stm/ao_i2c_stm.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) 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 @@ -130,6 +130,9 @@ ao_i2c_get(uint8_t i2c_index); 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); 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 @@ -134,12 +134,22 @@ ao_i2c_start(uint8_t index, uint16_t addr) return ao_i2c_state[index] == I2C_RUNNING; } +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, @@ -161,6 +171,34 @@ ao_i2c_send(void *block, uint16_t len, uint8_t index) ao_dma_done_transfer(tx_dma_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) { -- 2.30.2