-
Notifications
You must be signed in to change notification settings - Fork 4
Особенности работы железа STM32
Чтенние/запись SD-карты для STM32F2/F4 корректно работает только при вот таких настройках. В остальных случаях последние 16 или 12 байт данных будут повреждены. В документации и еррате это никак не указано. Возможно, это побочный результат описанного в еррате бага с HW flow control.
nvic_enable_irq(NVIC_DMA2_STREAM3_IRQ);
dma_stream_reset(DMA2, DMA_STREAM3);
dma_set_transfer_mode(DMA2, DMA_STREAM3, DMA_SxCR_DIR_PERIPHERAL_TO_MEM);
dma_set_priority(DMA2, DMA_STREAM3, DMA_SxCR_PL_HIGH);
dma_set_memory_size(DMA2, DMA_STREAM3, DMA_SxCR_MSIZE_32BIT);
dma_set_peripheral_size(DMA2, DMA_STREAM3, DMA_SxCR_PSIZE_32BIT);
dma_enable_memory_increment_mode(DMA2, DMA_STREAM3);
dma_set_peripheral_address(DMA2, DMA_STREAM3, (u32) &SDIO_FIFO);
dma_channel_select(DMA2, DMA_STREAM3, DMA_SxCR_CHSEL_4);
dma_set_memory_address(DMA2, DMA_STREAM3, (u32) buffer);
dma_set_number_of_data(DMA2, DMA_STREAM3, 128);
dma_enable_fifo_mode (DMA2, DMA_STREAM3);
dma_set_peripheral_flow_control(DMA2, DMA_STREAM3);
dma_set_fifo_threshold(DMA2, DMA_STREAM3, DMA_SxFCR_FTH_4_4_FULL);
dma_set_memory_burst(DMA2, DMA_STREAM3, DMA_SxCR_MBURST_INCR4);
dma_set_peripheral_burst(DMA2, DMA_STREAM3, DMA_SxCR_PBURST_INCR4);
dma_disable_fifo_error_interrupt(DMA2, DMA_STREAM3);
dma_disable_half_transfer_interrupt(DMA2, DMA_STREAM3);
dma_enable_transfer_complete_interrupt(DMA2, DMA_STREAM3);
dma_enable_transfer_error_interrupt(DMA2, DMA_STREAM3);
dma_enable_transfer_complete_interrupt(DMA2, DMA_STREAM3);
dma_enable_stream(DMA2, DMA_STREAM3);
Я думал в ардуино реализация i2c не очень - но нет, можно сделать еще хуже. Всё очень, очень криво. На корректное заведение fm24cl16 я потратил 2 дня,и код выглядит очень странно, но только так он работает. Трогать задержки в процедуре записи не советую, будет или зависание, или потеря последнего байта.
От ATSHA204A пришлось отказаться совсем - она требует каких-то своих правил обращения с ней (а их обеспечить можно только в режиме polling, у меня же все на прерываниях и dma), и должна висеть на отдельном канале i2c.