硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5547|回复: 8
收起左侧

[有问必答] dma spi 到存储器的问题

[复制链接]

7

主题

10

回帖

31

积分

新手上路

积分
31
发表于 2021-4-12 14:13:09 | 显示全部楼层 |阅读模式
使用的是库函数配置的方式,尝试过使用串口到存储器的方式,是没有问题的,但一用到SPI的方式读FLASH的方式就出现了问题。麻烦硬汉哥帮忙看看哪里出了问题。正常读写flash是没有问题的。使用DMA读出来的全是0XFF主函数有关部分
MYDMA_Config(DMA1_Stream4,DMA_Channel_0,(u32)&SPI2->DR,(u32)SendBuff,SEND_BUF_SIZE);
DMA_ClearFlag(DMA1_Stream4,DMA_FLAG_TCIF4 | DMA_FLAG_HTIF4 | DMA_FLAG_TEIF4 | DMA_FLAG_DMEIF4 | DMA_FLAG_FEIF4);
        W25QXX_CS=0;                            //使能器件   
    SPI2_ReadWriteByte(W25X_ReadData);         //发送读取命令   
    SPI2_ReadWriteByte((u8)((0)>>16));  //发送24bit地址   
    SPI2_ReadWriteByte((u8)((0)>>8));   
    SPI2_ReadWriteByte((u8)0);
//        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly;
//        SPI_Init(SPI2, &SPI_InitStructure);       
        MYDMA_Enable(DMA1_Stream4,25);
        while(DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_TCIF4)==RESET);
        W25QXX_CS=1;

配置文件
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{

        DMA_InitTypeDef  DMA_InitStructure;
       
        if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能
               
        }else
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能
        }
  DMA_DeInit(DMA_Streamx);
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//等待DMA可配置
       
  /* 配置 DMA Stream */
  DMA_InitStructure.DMA_Channel = chx;  //通道选择
  DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMA外设地址
  DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA 存储器0地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//外设到存储器模式
  DMA_InitStructure.DMA_BufferSize = ndtr;//数据传输量
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度:8位
  DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;//存储器数据长度:8位
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
  DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化DMA Stream
}

void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{

        DMA_Cmd(DMA_Streamx, DISABLE);                      //关闭DMA传输
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}        //确保DMA可以被设置  
               
        DMA_SetCurrDataCounter(DMA_Streamx,ndtr);          //数据传输量  

        DMA_Cmd(DMA_Streamx, ENABLE);                      //开启DMA传输
}          


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2021-4-12 14:28:55 | 显示全部楼层
参考我的试试

【安富莱】V6,V5开发板用户手册,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至50章(2021-02-22)
http://www.armbbs.cn/forum.php?m ... 3255&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

7

主题

10

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2021-4-12 15:34:50 | 显示全部楼层
eric2013 发表于 2021-4-12 14:28
参考我的试试

【安富莱】V6,V5开发板用户手册,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更 ...

感谢硬汉哥的回答,主要我没学过HAL库,看得不太懂
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2021-4-12 16:55:39 | 显示全部楼层
mmd 发表于 2021-4-12 15:34
感谢硬汉哥的回答,主要我没学过HAL库,看得不太懂

跟标准库的配置选项差不多。
回复

使用道具 举报

7

主题

10

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2021-4-14 16:19:49 | 显示全部楼层
eric2013 发表于 2021-4-12 16:55
跟标准库的配置选项差不多。

硬汉哥,我现在用SPI 和DMA的方式将图片的数据显示到LCD屏幕上,但是还是有一些明显的刷图的痕迹,请问要通过什么方式能够去提升刷图的速度呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2021-4-15 08:22:32 | 显示全部楼层
mmd 发表于 2021-4-14 16:19
硬汉哥,我现在用SPI 和DMA的方式将图片的数据显示到LCD屏幕上,但是还是有一些明显的刷图的痕迹,请问要 ...

内存够大不,够大可以先绘制到内存里面
回复

使用道具 举报

7

主题

10

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2021-4-15 08:46:52 | 显示全部楼层
eric2013 发表于 2021-4-15 08:22
内存够大不,够大可以先绘制到内存里面

现在用的是F407的板子,要刷一张320*480的图像,内存够用吗?
如果内存够大的话,是绘制到RAM里面吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2021-4-17 08:35:38 | 显示全部楼层
mmd 发表于 2021-4-15 08:46
现在用的是F407的板子,要刷一张320*480的图像,内存够用吗?
如果内存够大的话,是绘制到RAM里面吗?

内部不够用,最好有外扩才行。
回复

使用道具 举报

7

主题

10

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2021-4-19 08:42:00 | 显示全部楼层
eric2013 发表于 2021-4-17 08:35
内部不够用,最好有外扩才行。

好的,谢谢硬汉哥
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 01:52 , Processed in 0.171998 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表