OpenEdv-开源电子网

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

STM32F4 SPI双线双向全双工DMA读写W25Q128

[复制链接]

2

主题

6

帖子

1

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2015-11-29
在线时间
1 小时
发表于 2015-11-29 13:51:27 | 显示全部楼层 |阅读模式
        首先说明,本人是刚刚入手F4的新人,各位大牛还请多指教。      
        在学习了一年半的stm32f103后,逐渐逐渐的觉得F1的资源已经不够自己用了,前两天购入了一块F4的开发板,接下来这几天一直钻在实验室写F4板子上的各种驱动,这两天写到了SPI flash的驱动,借鉴了原子哥的flash驱动的主体架构,自己修改了SPI的DMA传输。调试了两天,刚刚调通,还没测试两个传输方式之间的差异,现在将我的代码与大家一起分享,再来说一下我调试过程中遇到的一些问题,和我的一些心得。
        
        这两天的时间,第一天拿着我之前的F1和新买的F4调试两块板子的SPI DMA方式的通信,对于调试方式,我采取的是:先调通两块板子普通方式的SPI通信,调通之后再修改为DMA方式。直到晚上,普通方式的通信还是有问题,我就一直在检查两块板子的SPI部分的代码,遇到的问题是F1从机一直在while (SPI_I2S_GetFlagStatus(SPI_NUM, SPI_I2S_FLAG_RXNE) == RESET),判断接受区不为空这里出不来了,调试了很久,最后终于解决了。我的从机是通过片选引脚来判断主机是否来了数据,CS拉低则接收主机的数据,并且发送出去数据,结果问题就是出在这个片选脚上,主机没及时的拉高CS引脚,导致从机再次进入读数据,这是主机已经不再发数据过来了,导致从机卡在了接收缓冲区那里。这个问题解决了,接下来的DMA方式很快也弄好了。对于DMA,需要注意一点的就是,两个DMA通道一定要配置好,每次修改传输数据长度之前需要关闭DMA通道,DMA传输完成后需要清除标志位。
        第二天开始调试FLASH,读flash的ID很easy的就完成了,我心中就有些窃喜了,想着接下来的数据读写问题也不大了,主要是操作一些寄存器就OK了。根据原子哥的程序逻辑,把代码全部写完打好注释之后,把程序烧到板子上,结果傻眼了,数据都出来全为0xFF,很明显数据写入就有问题,仔细的查看了自己的代码,发现并没有什么问题,于是我上网搜索,看到了这篇帖子http://www.openedv.com/posts/list/47163.htm,我发现我的问题与这位仁兄的一模一样,于是我再仔细看了自己的代码,
[mw_shl_code=c,true] uint8_t cnt = 0; uint8_t temp = 0; /* 写入页写入指令 */ SPI_TX_BUFFER[cnt++] = PAGE_PROGRAM; /* 写入24位写数据地址 */ SPI_TX_BUFFER[cnt++] = (uint8_t)(write_addr >> 16); SPI_TX_BUFFER[cnt++] = (uint8_t)(write_addr >> 8); SPI_TX_BUFFER[cnt++] = (uint8_t) write_addr; /* 使能写 */ w25qxx_write_enable(); W25QXX_CS_L; /* 开始传输 */ spi_trans(SPI_RX_BUFFER, SPI_TX_BUFFER, cnt); spi_trans_write(&temp, tx_buffer, length); W25QXX_CS_H; w25qxx_wait_free();[/mw_shl_code]
看到这里我的写入使能是在flash 片选信号上调用的,这时是不能正确的写入数据的,我修改之后的代码如下:
[mw_shl_code=c,true] uint8_t cnt = 0; uint8_t temp = 0; w25qxx_write_enable(); /* 写入页写入指令 */ SPI_TX_BUFFER[cnt++] = PAGE_PROGRAM; /* 写入24位写数据地址 */ SPI_TX_BUFFER[cnt++] = (uint8_t)(write_addr >> 16); SPI_TX_BUFFER[cnt++] = (uint8_t)(write_addr >> 8); SPI_TX_BUFFER[cnt++] = (uint8_t) write_addr; /* 使能写 */ W25QXX_CS_L; /* 开始传输 */ spi_trans(SPI_RX_BUFFER, SPI_TX_BUFFER, cnt); spi_trans_write(&temp, tx_buffer, length); W25QXX_CS_H; w25qxx_wait_free();[/mw_shl_code]
我把使能写在写入数据的一开始就执行。这时能正常写入和读出了,那么问题在哪里呢?

我猜测是IO口的速度太快,FLASH没有成功的判断出CS脚的电平变化。

因为使能flash写之后紧跟着的是一个CS置高信号,函数出来之后,又来一个CS置低信号,就是这里导致了我的程序写入错误。
至此,我的SPI flash驱动就算完成了。下面我贴出我的代码,由于板子不是用的原子哥的,用探索者运行该程序,需要修改CS引脚。

BSP_PRJ.zip

8.66 MB, 下载次数: 37184

Let's us code for world!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11474
金钱
11474
注册时间
2014-4-1
在线时间
1297 小时
发表于 2015-11-29 15:20:01 | 显示全部楼层
很详细的笔记,要支持!
回复 支持 反对

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11474
金钱
11474
注册时间
2014-4-1
在线时间
1297 小时
发表于 2015-11-29 15:21:54 | 显示全部楼层
w25qxx_write_enable()可能是用IO方式操作的,
SPI自带使能信号,只要发送数据就会自动产生片选。
回复 支持 反对

使用道具 举报

2

主题

6

帖子

1

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2015-11-29
在线时间
1 小时
 楼主| 发表于 2015-11-29 20:31:45 | 显示全部楼层
刚刚把FATFS挂载上去了,驱动没问题
Let's us code for world!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-11-29 23:28:23 | 显示全部楼层
必须COOL。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-11-30 12:52:35 | 显示全部楼层
很好,很牛逼的说。。。
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

6

帖子

1

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2015-11-29
在线时间
1 小时
 楼主| 发表于 2015-11-30 19:05:43 | 显示全部楼层
回复【6楼】八度空间:
---------------------------------
米有米有,还请各位大牛指教。
Let's us code for world!
回复 支持 反对

使用道具 举报

7

主题

19

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-11-5
在线时间
1 小时
发表于 2015-12-1 11:50:19 | 显示全部楼层
mark,等学习,

能详细说下如何解决第一个问题的吗,我有也类似的问题!!
回复 支持 反对

使用道具 举报

2

主题

6

帖子

1

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2015-11-29
在线时间
1 小时
 楼主| 发表于 2015-12-1 19:11:19 | 显示全部楼层
回复【8楼】tudou:
---------------------------------
从机自己是不能产生时钟的,必须要主机供给时钟时才能同步的和主机收发数据,假如你的主机没有发送数据了,从机通信自然行不通。
Let's us code for world!
回复 支持 反对

使用道具 举报

26

主题

193

帖子

8

精华

金牌会员

Rank: 6Rank: 6

积分
1800
金钱
1800
注册时间
2012-8-23
在线时间
57 小时
发表于 2015-12-2 17:53:45 | 显示全部楼层
我用STM32F407+USB3300实现了一个SPI Flash高速烧录器,详情如下:
http://www.usbxyz.com/archives/154
上位机软件可以开源,有需要的可以联系我,QQ 188298598


回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-12-2 19:11:53 | 显示全部楼层
谢谢分享,收藏了
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-5-18
在线时间
2 小时
发表于 2017-4-10 10:57:46 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

10

主题

147

帖子

0

精华

高级会员

Rank: 4

积分
602
金钱
602
注册时间
2015-7-11
在线时间
94 小时
发表于 2017-4-20 09:51:34 | 显示全部楼层
谢谢分享!!!
回复 支持 反对

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2017-3-20
在线时间
64 小时
发表于 2017-10-7 11:30:45 | 显示全部楼层
mark,很赞
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2018-12-12
在线时间
0 小时
发表于 2018-12-12 09:43:47 | 显示全部楼层
怎么看不到?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2018-12-12
在线时间
0 小时
发表于 2018-12-12 09:44:54 | 显示全部楼层
什么破玩意
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-12-13
在线时间
8 小时
发表于 2018-12-12 09:50:45 | 显示全部楼层
这个是个好东西
回复 支持 反对

使用道具 举报

6

主题

119

帖子

0

精华

高级会员

Rank: 4

积分
712
金钱
712
注册时间
2015-11-26
在线时间
139 小时
发表于 2018-12-12 11:27:18 | 显示全部楼层
你可以加上rtos的支持  多线程读写
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
397
金钱
397
注册时间
2017-7-20
在线时间
39 小时
发表于 2020-3-5 10:52:54 | 显示全部楼层
感谢分享。  我现在也在攻克这个难关
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2020-4-27
在线时间
0 小时
发表于 2020-4-27 15:22:23 | 显示全部楼层
hanzixi_angel 发表于 2018-12-12 11:27
你可以加上rtos的支持  多线程读写

你好,看你回复挺专业,有项目合作,我电话13673356078
回复 支持 反对

使用道具 举报

0

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2014-9-18
在线时间
21 小时
发表于 2022-4-24 19:16:21 | 显示全部楼层
很好的例程,学习学习
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 21:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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