waterwoods123 2024-11-11 18:33 采纳率: 100%
浏览 40
已结题

GD32H7 从存储器到外设SPI传输数据无法重复启用DMA

GD32H7系列 DMA传输多个num到SPI外设就会出错,CHEN寄存器不再清零。

    dma_single_data_parameter_struct dma_init_struct;
__attribute__((aligned(32))) uint32_t spi3_send_array[BUFFER_SIZE] = {};

void DMA_Init(void)
{     
    uint16_t i;
    SCB_CleanDCache_by_Addr((uint32_t *)spi3_send_array, BUFFER_SIZE * 2);
    nvic_irq_enable(EXTI0_IRQn, 1U, 0U); //add DMA_INT EXTI0_IRQn ENET0_IRQn
//    dma_single_data_parameter_struct dma_init_struct;
    rcu_periph_clock_enable(RCU_DMA0);
    rcu_periph_clock_enable(RCU_DMAMUX);
    dma_deinit(DMA0, DMA_CH0);
    dma_single_data_para_struct_init(&dma_init_struct);
    dma_init_struct.request = DMA_REQUEST_SPI3_TX;
    dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;    
    dma_init_struct.memory0_addr = (uint32_t)spi3_send_array;
    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_32BIT;
    dma_init_struct.number = BUFFER_SIZE;
    dma_init_struct.periph_addr = SPI3_DATA_ADDRESS;
    dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
    dma_single_data_mode_init(DMA0, DMA_CH0, &dma_init_struct);
  
    dma_circulation_disable(DMA0, DMA_CH0);

//    dma_interrupt_enable(DMA0, DMA_CH0, DMA_CHXCTL_FTFIE);
    dma_interrupt_disable(DMA0, DMA_CH0, DMA_INTF_FEEIF);
    
    dma_channel_enable(DMA0, DMA_CH0);   
    
}

void 发送处理(void)   
{
        SCB_CleanInvalidateDCache();
        dma_flag_clear(DMA0, DMA_CH0, DMA_INTF_FTFIF);
        dma_init_struct.memory0_addr = (uint32_t)spi3_send_array;
        dma_init_struct.number = BUFFER_SIZE;
        dma_single_data_mode_init(DMA0, DMA_CH0, &dma_init_struct);
        dma_channel_enable(DMA0, DMA_CH0); 
        spi_dma_enable(SPI3, SPI_DMA_TRANSMIT);    
        spi_master_transfer_start(SPI3, SPI_TRANS_START);
        while(!dma_flag_get(DMA0, DMA_CH0, DMA_INTF_FTFIF));  //等待传输完成,FTFIF被置一
        dma_flag_clear(DMA0, DMA_CH0, DMA_INTF_FTFIF);
        spi_dma_disable(SPI3, SPI_DMA_TRANSMIT); 
        SCB_CleanInvalidateDCache();
       DMA_trans_enable = 0;
       exti_interrupt_flag_clear(EXTI_0);

}

  • 写回答

25条回答 默认 最新

  • 大花狸 2024-11-11 20:26
    关注

    发一下SPI的配置看下

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(24条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月13日
  • 已采纳回答 11月13日
  • 创建了问题 11月11日

悬赏问题

  • ¥15 多尺度特征图提取和融合
  • ¥15 微信小程序:渲染收货地址时页面不显示
  • ¥20 win7 64位DirectShow提示初始化失败如何解决?
  • ¥20 小规模孤立词识别系统设计
  • ¥15 关于Java对接海康威视车牌识别一体机SDK是否需要固定外网的IP?
  • ¥15 Linux扩容时,格式化卡住了:vgdispaly查看卷组信息,没有输出
  • ¥18 关于#ubuntu#的问题:使用背景-工作职责内有七八台ubuntu系统的电脑,平时需要互相调取资料,想实现把这几台电脑用交换机组成一个局域网,来实现指定文件夹的互相调取和写入
  • ¥20 求一个简易射频信号综测仪
  • ¥15 esp8266 tally灯 接收端改为发射端
  • ¥30 Labview代码调用access 数据库,相同代码其中一个调用不出来是为什么