OpenEdv-开源电子网

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

W25Q256FV实现USB读写的问题

[复制链接]

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-12-23
在线时间
32 小时
发表于 2014-4-9 14:17:23 | 显示全部楼层 |阅读模式
现在是移植了FATFS文件系统后成功格式化,读文件,创建文件和显示剩余空间都正常,根据战舰开发板USB代码修改的代码移植后能够成功识别盘符,但是打开后里面有二十几个2G的文件(256的Flash只有32M),下面是代码
看了原子兄的代码后自认为这里是最重要的
    Mass_Memory_Size[0] = 1024*1024*32;//32M字节
    Mass_Block_Size[0] = 512;
    Mass_Block_Count[0] = Mass_Memory_Size[0] / Mass_Block_Size[0];

因为不需要用到SD卡所以改了一下数组下标,可移动磁盘个数的宏也修改为0,mass_mal中的read和write内容也改为
        case 0:
              STA=0;
            SPI_Flash_Write((u8*)Writebuff, Memory_Offset, Transfer_Length);

        case 0:
             STA=0;
            SPI_Flash_Read((u8*)Readbuff, Memory_Offset, Transfer_Length);
不知道Read_Memory和Write_Memory需不需要修改,我的一个块的size是65536,Mass_Block_Size[0]为512时就会出现前面说到的有几十个2G文件的情况,如果改为65536那么PC机上可移动磁盘的大小就为0,原子兄的代码在Mass_Block_Size[0]后的注释说Mass_Block_Size[0]是init中定了的512,不知道是不是需要把这个定长的512修改一下,请教一下各位大哥解决的办法!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-9 14:50:05 | 显示全部楼层
1、发现楼主这代码有问题,图中红色框框


2、具体可以参考原子哥的读卡器实验或者这个帖子http://www.openedv.com/posts/list/27484.htm中的战舰读卡器实验工程

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-12-23
在线时间
32 小时
 楼主| 发表于 2014-4-9 15:28:07 | 显示全部楼层
Badu_Space 您好,看过您发的链接这部分的代码您和我是一样的,只不过我没有写在mass_mal.c这个文件中,如果您说的错误是第三行的下标写成了1的话那是我的笔误,我的FLash是32M的我想把这32M都利用起来,做FATFS的时候格式化的也是32M,不知道1024*1024*32这样写对不对。现在不知道Mass_Block_Size[0]这个参数应该如何设置,设置成512的话打开后是二十几个2G左右的文件,设置一个扇区的大小4096,PC机上提示插入你的可移动磁盘,如果设置成65536在PC上出来的可移动磁盘的大小为0.
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-9 15:41:57 | 显示全部楼层
回复【3楼】csf4824521:
---------------------------------
1、你要明白0对应的是SD卡,1对应的才是flash
2、加上你上面出现了两个case 0: 这个语句,编译的时候应该会报警的
3、你用的是原子哥的Mini板子???战舰板子???还是自己画的最小系统板子
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-12-23
在线时间
32 小时
 楼主| 发表于 2014-4-9 17:32:53 | 显示全部楼层
非常感谢Badu_Space,我的理解是,SD卡和Flash是两个设备,0,1应该也不是必然的一一对应关系,现在我只需要一个设备,也就是Flash,如果我还是设置0和1的话上电后PC机会识别到两个可移动磁盘,这应该是没有必要的,所以设备个数只能设置成一个,相应的Flash的代码也就不能放在1中了需要放在0里才能被执行。出现两个case 0的问题怪我,我本来想少贴点代码,但是引起了误会
case 0:
              STA=0;
            SPI_Flash_Write((u8*)Writebuff, Memory_Offset, Transfer_Length);是在MAL_Write函数中
自然在MAL_Read函数中就是第二个case 0
case 0:
             STA=0;
            SPI_Flash_Read((u8*)Readbuff, Memory_Offset, Transfer_Length);
我用的是自己的板子,Flash是直接焊上去的
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-10 08:37:45 | 显示全部楼层
回复【5楼】csf4824521:
---------------------------------
1、你这样的话程序选择哪个呢?
switch(*****)
{
    case 0:
         *******
         break;
    case 0:
         *******
         break;
    *****
}
2、你想将FLASH的写到0项上面去,记得好像要在USB操作里面修改代码的,具体也记得不清,你可以goto看下
3、或者你试下直接就将FLASH的添加到那个0项上面,1项直接break(或者不写),将这个宏定义改为这样#define MAX_LUN    0
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-12-23
在线时间
32 小时
 楼主| 发表于 2014-4-10 09:32:51 | 显示全部楼层
我就是这样做的,MAX_LUN也改了,FLASH也是写在0里面的,现在就出现这样的问题!我昨天试过用原子兄的工程代码,只修改了GPIO口和读写Flash时的几个参数FLASH_SECTOR_SIZE改成了4096,FLASH_SECTOR_COUNT改成了8192,FLASH_BLOCK_SIZE改为65536其他的全部都没有动过,上电后出现和我的工程代码一样的现象,有二十几个2G大小的文件,连名字都一样,都是?这个符号组成的,是不是读FAT表的时候出现了问题?
回复 支持 反对

使用道具 举报

4

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2013-3-11
在线时间
5 小时
发表于 2015-8-3 11:49:29 | 显示全部楼层
回复【3楼】csf4824521:
---------------------------------
你好,不知道你i的W25Q256的驱动是什么样的,我最近也在弄只能操作3byte地址,最大支持16M,超过16M时需要,使用4byte地址,但是不知道,怎么开启,4byte模式。看了芯片资料,试了好多次,都不行。你的代码支持4byte模式吗
回复 支持 反对

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-12-23
在线时间
32 小时
 楼主| 发表于 2015-8-29 11:58:42 | 显示全部楼层
回复【8楼】gaohuihui258:
---------------------------------
不知道你弄好了没有,我的是支持4地址模式的,Flash的手册上有说的这是我的4地址模式代码你这样做就开启了4地址模式了,然后直接可以用4地址进行访问后面的内存。

#define W25Q_4ByteAddrModeEnable      0xB7
void Enter4ByteAddrMode(void)
{
SPI_FLASH_CS=0;                            //使能器件   
    SPI2_ReadWriteByte(W25Q_4ByteAddrModeEnable);   //进入4Byte地址模式W25Q128以上使用
SPI_FLASH_CS = 1;
}
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2015-3-19
在线时间
10 小时
发表于 2016-11-25 20:49:36 | 显示全部楼层
gaohuihui258 发表于 2015-8-3 11:49
回复【3楼】csf4824521:
---------------------------------
你好,不知道你i的W25Q256的驱动是什么样的, ...

同样只支持16M,不知道你弄好了没有
回复 支持 反对

使用道具 举报

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2016-9-23
在线时间
21 小时
发表于 2017-2-21 14:04:17 | 显示全部楼层
csf4824521 发表于 2015-8-29 11:58
回复【8楼】gaohuihui258:
---------------------------------
不知道你弄好了没有,我的是支持4地址模式的 ...

特意登录来感谢,非常感谢!调了两天,按你说的成功了,芯片资料英文的看不懂
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2021-9-7
在线时间
0 小时
发表于 2021-9-8 03:11:38 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 12:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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