@@ -224,11 +224,11 @@ ao_i2c_send(void *block, uint16_t len, uint8_t index, uint8_t stop)
224
224
{
225
225
struct stm_i2c * stm_i2c = ao_i2c_stm_info [index ].stm_i2c ;
226
226
uint8_t tx_dma_index = ao_i2c_stm_info [index ].tx_dma_index ;
227
+ uint8_t rx_dma_index = ao_i2c_stm_info [index ].rx_dma_index ;
227
228
228
229
/* Clear any pending ADDR bit */
229
230
(void ) stm_i2c -> sr2 ;
230
231
ao_i2c_wait_addr (index );
231
- stm_i2c -> cr2 = AO_STM_I2C_CR2 | (1 << STM_I2C_CR2_DMAEN );
232
232
ao_dma_set_transfer (tx_dma_index ,
233
233
& stm_i2c -> dr ,
234
234
block ,
@@ -241,13 +241,14 @@ ao_i2c_send(void *block, uint16_t len, uint8_t index, uint8_t stop)
241
241
(0 << STM_DMA_CCR_PINC ) |
242
242
(0 << STM_DMA_CCR_CIRC ) |
243
243
(STM_DMA_CCR_DIR_MEM_TO_PER << STM_DMA_CCR_DIR ));
244
+ ao_dma_mutex_get (rx_dma_index );
245
+ stm_i2c -> cr2 = AO_STM_I2C_CR2 | (1 << STM_I2C_CR2_DMAEN );
244
246
245
247
ao_dma_start (tx_dma_index );
246
248
ao_arch_block_interrupts ();
247
249
while (!ao_dma_done [tx_dma_index ])
248
250
if (ao_sleep_for (& ao_dma_done [tx_dma_index ], 1 + len ))
249
251
break ;
250
- ao_dma_done_transfer (tx_dma_index );
251
252
stm_i2c -> cr2 = AO_STM_I2C_CR2 | (1 << STM_I2C_CR2_ITEVTEN ) | (1 << STM_I2C_CR2_ITERREN );
252
253
while ((stm_i2c -> sr1 & (1 << STM_I2C_SR1_BTF )) == 0 )
253
254
if (ao_sleep_for (& ao_i2c_state [index ], 1 + len ))
@@ -258,6 +259,8 @@ ao_i2c_send(void *block, uint16_t len, uint8_t index, uint8_t stop)
258
259
stm_i2c -> cr1 = AO_STM_I2C_CR1 | (1 << STM_I2C_CR1_STOP );
259
260
ao_i2c_wait_stop (index );
260
261
}
262
+ ao_dma_mutex_put (rx_dma_index );
263
+ ao_dma_done_transfer (tx_dma_index );
261
264
return true;
262
265
}
263
266
@@ -311,7 +314,9 @@ ao_i2c_recv(void *block, uint16_t len, uint8_t index, uint8_t stop)
311
314
ao_arch_release_interrupts ();
312
315
ret = ao_i2c_recv_len [index ] == 0 ;
313
316
} else {
317
+ uint8_t tx_dma_index = ao_i2c_stm_info [index ].tx_dma_index ;
314
318
uint8_t rx_dma_index = ao_i2c_stm_info [index ].rx_dma_index ;
319
+ ao_dma_mutex_get (tx_dma_index );
315
320
ao_dma_set_transfer (rx_dma_index ,
316
321
& stm_i2c -> dr ,
317
322
block ,
@@ -349,8 +354,9 @@ ao_i2c_recv(void *block, uint16_t len, uint8_t index, uint8_t stop)
349
354
break ;
350
355
ao_arch_release_interrupts ();
351
356
ret = ao_dma_done [rx_dma_index ];
352
- ao_dma_done_transfer (rx_dma_index );
353
357
stm_i2c -> cr1 = AO_STM_I2C_CR1 | (1 << STM_I2C_CR1_STOP );
358
+ ao_dma_done_transfer (rx_dma_index );
359
+ ao_dma_mutex_put (tx_dma_index );
354
360
}
355
361
if (stop )
356
362
ao_i2c_wait_stop (index );
0 commit comments