|
在使用spi+DMA通信时只配置使能一次DMA接收函数可以正常接收数据,若重置DMA收发消息只有第一次可以在缓冲区看到数据,后续能进入接收中断但缓冲区数据无变化,示波器可以捕获到接收数据波形。以下是部分代码请问哪里配置有误。
void spi_dma_config(void)
{
dma_single_data_parameter_struct dma_init_struct;
/* deinitialize DMA registers of a channel */
dma_deinit(DMA1, DMA_CH4);
dma_deinit(DMA1, DMA_CH5);
dma_deinit(DMA1, DMA_CH6);
dma_single_data_para_struct_init(&dma_init_struct);
/* SPI1 transmit DMA config: DMA_CH4 */
dma_init_struct.request = DMA_REQUEST_SPI1_TX;
dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
dma_init_struct.memory0_addr = (uint32_t)spi1_send_array;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.periph_memory_width = DMA_MEMORY_WIDTH_8BIT;
dma_init_struct.number = 16;
dma_init_struct.periph_addr = (uint32_t)&SPI_TDATA(SPI1);
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.priority = DMA_PRIORITY_HIGH;
dma_single_data_mode_init(DMA1, DMA_CH4, &dma_init_struct);
dma_circulation_disable(DMA1, DMA_CH4);
dma_interrupt_enable(DMA1,DMA_CH4,DMA_INT_FTF);
/* SPI1 receive DMA config: DMA_CH5 */
dma_init_struct.request = DMA_REQUEST_SPI1_RX;
dma_init_struct.direction = DMA_PERIPH_TO_MEMORY;
dma_init_struct.memory0_addr = (uint32_t)ad7606.ad_buff;
dma_init_struct.periph_addr = (uint32_t)&SPI_RDATA(SPI1);
dma_init_struct.priority = DMA_PRIORITY_HIGH;
dma_init_struct.number = 16;
dma_single_data_mode_init(DMA1, DMA_CH5, &dma_init_struct);
dma_circulation_disable(DMA1, DMA_CH5);
dma_interrupt_enable(DMA1,DMA_CH5,DMA_INT_FTF);
/* SPI4 transmit DMA config: DMA_CH6 */
dma_init_struct.request = DMA_REQUEST_SPI4_TX;
dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
dma_init_struct.memory0_addr = (uint32_t)spi4_send_array;
dma_init_struct.periph_addr = (uint32_t)&SPI_TDATA(SPI4);
dma_init_struct.priority = DMA_PRIORITY_HIGH;
dma_single_data_mode_init(DMA1, DMA_CH6, &dma_init_struct);
dma_circulation_disable(DMA1, DMA_CH6);
// dma_interrupt_enable(DMA1,DMA_CH6,DMA_INT_FTF);
/* enable DMA channel */
dma_channel_enable(DMA1, DMA_CH4);
dma_channel_enable(DMA1, DMA_CH5);
dma_channel_enable(DMA1, DMA_CH6);
spi_dma_enable(SPI1, SPI_DMA_TRANSMIT);
spi_dma_enable(SPI1, SPI_DMA_RECEIVE);
spi_dma_enable(SPI4, SPI_DMA_TRANSMIT);
}
//中断重置spi、dma收发消息
void EXTI5_9_IRQHandler(void)
{
if(RESET != exti_interrupt_flag_get(EXTI_5)) {
// ad7670_read();
dma_channel_disable(DMA1,DMA_CH4);
//重置发送地址
dma_memory_address_config(DMA1, DMA_CH4, DMA_MEMORY_0, (uint32_t)spi1_send_array);
//重置发送长度
dma_transfer_number_config(DMA1, DMA_CH4, 16);
gpio_bit_reset(SPI1__CS_PORT, SPI1_CS_PIN);
//启动DMA发送
dma_channel_enable(DMA1, DMA_CH4);
exti_interrupt_flag_clear(EXTI_5);
//此部分重置DMA接收,地址、数据长度都重置,但在缓冲区看不到数据变化,可以正常进去接收数据满中断,示波器也可以看到真实数据的波形
dma_channel_disable(DMA1,DMA_CH5);
dma_memory_address_config(DMA1, DMA_CH5, DMA_MEMORY_0, (uint32_t)ad7606.ad_buff);
dma_transfer_number_config(DMA1, DMA_CH5, 16);
dma_channel_enable(DMA1,DMA_CH5);
spi_master_transfer_start(DMA1, SPI_TRANS_START);
}
}
//清中断
void DMA1_Channel4_IRQHandler(void)
{
if(RESET != dma_interrupt_flag_get(DMA1,DMA_CH4,DMA_INT_FLAG_FTF)){
dma_interrupt_flag_clear(DMA1,DMA_CH4,DMA_INT_FLAG_FTF);
}
}
//清中断
void DMA1_Channel5_IRQHandler(void)
{
if(RESET != dma_interrupt_flag_get(DMA1,DMA_CH5,DMA_INT_FLAG_FTF)){
dma_interrupt_flag_clear(DMA1,DMA_CH5,DMA_INT_FLAG_FTF);
gpio_bit_set(SPI1__CS_PORT, SPI1_CS_PIN);
}
}
|
|