GD32F4 spi dma读gd25Q

[复制链接]
2742|23
 楼主| wslwushili 发表于 2022-12-5 14:58 | 显示全部楼层 |阅读模式
demo中是spi 读gd25Q Norflash数据,运行正常,改用dma 方式无法工作。我的代码如下:

void spiflash_dma_config(uint8_t *data)
{
        rcu_periph_clock_enable(RCU_DMA1);
        dma_single_data_parameter_struct spi_dma_init_struct;
        dma_deinit(DMA1,DMA_CH6);       
        spi_dma_init_struct.direction = DMA_PERIPH_TO_MEMORY;
        spi_dma_init_struct.number = 8;
        spi_dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI5);
        spi_dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;
        spi_dma_init_struct.priority = DMA_PRIORITY_LOW;
        spi_dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
        spi_dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
        spi_dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_DISABLE;
        spi_dma_init_struct.memory0_addr = (uint32_t)data;               
        dma_single_data_mode_init(DMA1,DMA_CH6,&spi_dma_init_struct);
        dma_channel_subperipheral_select(DMA1,DMA_CH6,DMA_SUBPERI1);//接收通道配置
        dma_circulation_disable(DMA1, DMA_CH6);
        dma_channel_disable(DMA1,DMA_CH6);
        spi_dma_disable(SPI5,SPI_DMA_RECEIVE);
}

void spi_flash_dma_read(uint32_t read_addr)
{
     SPI_FLASH_CS_LOW();
    spi_flash_send_byte(READ);
    spi_flash_send_byte((read_addr & 0xFF0000) >> 16);
    spi_flash_send_byte((read_addr& 0xFF00) >> 8);
    spi_flash_send_byte(read_addr & 0xFF);
    dma_channel_enable(DMA1,DMA_CH6);
    spi_dma_enable(SPI5, SPI_DMA_RECEIVE);
    while(dma_flag_get(DMA1,DMA_CH6,DMA_FLAG_FTF)!= SET){}
    dma_flag_clear(DMA1,DMA_CH6,DMA_FLAG_FTF);
    dma_channel_disable(DMA1,DMA_CH6);
    SPI_FLASH_CS_HIGH();
}

main()
{。。。。初始化省略
  spi_flash_init(); //这是demo的
  spiflash_dma_config(my_buf);
  spi_flash_dma_read(0x0c0000);
}
发现一直在 while(dma_flag_get(DMA1,DMA_CH6,DMA_FLAG_FTF)!= SET){}中,求指导,谢谢!
 楼主| wslwushili 发表于 2022-12-11 22:30 | 显示全部楼层
可以采用DMA发送读命令数据,gd25q才会回数据。
earlmax 发表于 2022-12-12 10:35 | 显示全部楼层
spi的dma模式没有用过。              
benjaminka 发表于 2022-12-12 11:32 | 显示全部楼层
GD32F4 是有QSPI接口呢?
robincotton 发表于 2022-12-12 13:11 | 显示全部楼层
可以使用模拟spi判断是不是硬件的问题。
sesefadou 发表于 2022-12-12 14:29 | 显示全部楼层
直接spi读取就行,spi调试简单。
LLGTR 发表于 2022-12-13 16:59 | 显示全部楼层
看报错感觉是DMA状态不对,然后死等了。
V853 发表于 2022-12-13 17:00 | 显示全部楼层
你看看这个函数检测的是什么寄存器。
芯路例程 发表于 2022-12-13 17:04 | 显示全部楼层
用的是官方的例程吗?
MessageRing 发表于 2022-12-20 18:08 | 显示全部楼层
是不是DMA配置的问题
sxm1234567 发表于 2022-12-21 13:36 | 显示全部楼层
楼主问题解决了吗,我发现SPI速度比STM32的慢好多,也准备用DMA,和你一样卡在这了,可以分享一下吗
Jacquetry 发表于 2022-12-21 14:41 | 显示全部楼层
用模拟spi判断是不是硬件的问题
tpgf 发表于 2023-1-3 09:01 | 显示全部楼层
我也存在这个问题 使用普通模式没有问题  改用dma就一堆问题
qcliu 发表于 2023-1-3 09:13 | 显示全部楼层
看楼主的现象好像是一只在dma状态中等待了
drer 发表于 2023-1-3 09:23 | 显示全部楼层
使用dma发送数据和接收数据和普通的模式进行发送接收数据有什么不同的呢
coshi 发表于 2023-1-3 09:33 | 显示全部楼层
一般来说 有没有数据显示dma方式下通讯速度能快上多少呢
kxsi 发表于 2023-1-3 09:42 | 显示全部楼层
sxm1234567 发表于 2022-12-21 13:36
楼主问题解决了吗,我发现SPI速度比STM32的慢好多,也准备用DMA,和你一样卡在这了,可以分享一下吗 ...

我理解的只是提升了单片机的效率 并不能从根本上解决通讯速率的问题
wiba 发表于 2023-1-3 10:17 | 显示全部楼层
可以考虑使用dma进行发送吗  这样有助于效率的提高吗
wwppd 发表于 2023-1-11 21:48 | 显示全部楼层
dma太难用了,可能是我不会使用的吧。
minzisc 发表于 2023-1-12 11:28 | 显示全部楼层
gd25Q跟w25q有什么不同呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

9

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部