OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5669|回复: 9

DMA操作SPI存取W25Q64

[复制链接]

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2018-6-4
在线时间
16 小时
发表于 2018-7-17 22:20:16 | 显示全部楼层 |阅读模式
10金钱
请问谁有做过DMA操作W25Q64的实验?想借鉴参考一下。32的flash太小,高速AD测得的数据不够保存了。谢谢😜

最佳答案

查看完整内容[请看2#楼]

spi的dma 看这个帖子http://www.openedv.com/forum.php?mod=viewthread&tid=273878&extra= 读 //读取SPI FLASH //在指定地址开始读取指定长度的数据 //pBuffer:数据存储区 //ReadAddr:开始读取的地址(24bit) //NumByteToRead:要读取的字节数(最大65535) void W25Qxx_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead) { u16 i; W25Qxx_SPI_SetSpeed(W25Qxx_SPI_BaudRatePrescaler_x); W25Qxx_CS=0 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-7-17 22:20:17 | 显示全部楼层
yw123 发表于 2018-7-20 23:44
那个您有DMA控制SPI的例程吗?原子哥好像没提供,网上也没找到完整的工程。如果您有,麻烦您分享一下,万 ...

spi的dma 看这个帖子http://www.openedv.com/forum.php ... d=273878&extra=


//读取SPI FLASH  
//在指定地址开始读取指定长度的数据
//pBuffer:数据存储区
//ReadAddr:开始读取的地址(24bit)
//NumByteToRead:要读取的字节数(最大65535)
void W25Qxx_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   
{
          u16 i;
          W25Qxx_SPI_SetSpeed(W25Qxx_SPI_BaudRatePrescaler_x);
          W25Qxx_CS=0;                            //使能器件   
    W25Qxx_SPIx_ReadWriteByte(W25X_ReadData);         //发送读取命令   
    W25Qxx_SPIx_ReadWriteByte((u8)((ReadAddr)>>16));  //发送24bit地址   
    W25Qxx_SPIx_ReadWriteByte((u8)((ReadAddr)>>8));   
    W25Qxx_SPIx_ReadWriteByte((u8)ReadAddr);   
       
#if W25Qxx_DMA==1
          W25Qxx_DMA1_Spix_RX(pBuffer,NumByteToRead);
#else
    for(i=0;i<NumByteToRead;i++)
        pBuffer=W25Qxx_SPIx_ReadWriteByte(0XFF);   //循环读数
#endif

          W25Qxx_CS=1;                            //取消片选         
}  



//SPI在一页(0~65535)内写入少于256个字节的数据
//在指定地址开始写入最大256字节的数据
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!         
void W25Qxx_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
          u16 i;  
    W25Qxx_Write_Enable();                  //SET WEL
          W25Qxx_SPI_SetSpeed(W25Qxx_SPI_BaudRatePrescaler_x);
          W25Qxx_CS=0;                            //使能器件   
    W25Qxx_SPIx_ReadWriteByte(W25X_PageProgram);      //发送写页命令   
    W25Qxx_SPIx_ReadWriteByte((u8)((WriteAddr)>>16)); //发送24bit地址   
    W25Qxx_SPIx_ReadWriteByte((u8)((WriteAddr)>>8));   
    W25Qxx_SPIx_ReadWriteByte((u8)WriteAddr);   
#if W25Qxx_DMA==1
          W25Qxx_DMA1_Spix_TX(pBuffer,NumByteToWrite);
#else
    for(i=0;i<NumByteToWrite;i++)W25Qxx_SPIx_ReadWriteByte(pBuffer);//循环写数
#endif
      
          W25Qxx_CS=1;                            //取消片选
          W25Qxx_Wait_Busy();                                           //等待写入结束
}

不过除了你上电就全片擦除,直接移植个只写的,不然块不到哪里去,估计还不如sdio写sd呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-7-18 01:26:41 | 显示全部楼层
写SPI FLASH速度也不快啊,提前还要擦除。擦除老占时间了。。。
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2018-6-4
在线时间
16 小时
 楼主| 发表于 2018-7-18 19:44:43 | 显示全部楼层
正点原子 发表于 2018-7-18 01:26
写SPI FLASH速度也不快啊,提前还要擦除。擦除老占时间了。。。

我主要是想借此试一下DMA控制SPI,原子哥,你没提供这个例程唉
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1768
金钱
1768
注册时间
2015-6-11
在线时间
312 小时
发表于 2018-7-19 15:21:14 | 显示全部楼层
就用DMA SPI-Memory和Memory-SPI的例程就可以的,就是在DMA启动之前要做好软件擦除和读写指令就OK
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2018-6-4
在线时间
16 小时
 楼主| 发表于 2018-7-20 23:44:07 来自手机 | 显示全部楼层
zc123 发表于 2018-7-19 15:21
就用DMA SPI-Memory和Memory-SPI的例程就可以的,就是在DMA启动之前要做好软件擦除和读写指令就OK

那个您有DMA控制SPI的例程吗?原子哥好像没提供,网上也没找到完整的工程。如果您有,麻烦您分享一下,万分感谢。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-7-21 20:54:44 | 显示全部楼层
yw123 发表于 2018-7-18 19:44
我主要是想借此试一下DMA控制SPI,原子哥,你没提供这个例程唉

我们精英版的综合实验,就是通过DMA读取SPI数据,放到LCD的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2016-1-4
在线时间
17 小时
发表于 2018-7-30 22:21:13 | 显示全部楼层
正点原子 发表于 2018-7-21 20:54
我们精英版的综合实验,就是通过DMA读取SPI数据,放到LCD的。

原子哥你好,精英版的综合实验没见到有代码啊,可以给个链接吗?谢谢。最近搞DMA读取SPI flash出了很奇怪的问题,一直没能解决。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-8-6
在线时间
2 小时
发表于 2019-8-16 14:13:46 | 显示全部楼层
本帖最后由 XMQ1124J 于 2019-8-16 14:16 编辑

我的一直在while(!DMA_GetFlagStatus(DMA1_FLAG_TC4));循环出不来了啊,还是说这里本来就需要循环很久?????都无限多了
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-8-22
在线时间
13 小时
发表于 2019-10-14 18:05:32 | 显示全部楼层
XMQ1124J 发表于 2019-8-16 14:13
我的一直在while(!DMA_GetFlagStatus(DMA1_FLAG_TC4));循环出不来了啊,还是说这里本来就需要循环很久?? ...

搞定了没有??现在难受得一比
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-7 23:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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