野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8542|回复: 18

【求助】外部Flash模拟U盘可以识别但无法读写

[复制链接]
发表于 2018-1-4 16:43:41 | 显示全部楼层 |阅读模式


这两天在弄外部Flash模拟U盘,于是移植了火哥的f1的程序,移植后插上电脑可以识别,但是无法读写,也没有获取到磁盘大小,flash用的是W25Q128.各位大神,有了解的吗?

U盘1.PNG
U盘.PNG
回复

使用道具 举报

 楼主| 发表于 2018-1-4 16:48:59 | 显示全部楼层
大概是哪部分出了问题,指个方向呗
回复 支持 反对

使用道具 举报

发表于 2018-1-4 17:14:51 | 显示全部楼层
tiandijianji 发表于 2018-1-4 16:48
大概是哪部分出了问题,指个方向呗

有个usb mas mal.c 文件,要给它提供块的数目,各种接口

你这个跟我们型号不同,可能是初始化flash获取FLASH ID不同,然后程序认为初始化不正常,就没下文了,你要改好对应的FLASH ID
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-4 17:34:18 | 显示全部楼层
flyleaf 发表于 2018-1-4 17:14
有个usb mas mal.c 文件,要给它提供块的数目,各种接口

你这个跟我们型号不同,可能是初始化flash获 ...

谢谢回答
但是,这段代码改过了也是这样,偏移地址也改过了,需要对这块存储空间进行格式化吗?
uint16_t MAL_Init(uint8_t lun)
{
  uint16_t status = MAL_OK;

  switch (lun)
  {
    case 0:
                        SPI_FLASH_Init();
                        if(SPI_FLASH_ReadID()==sFLASH_ID)
                        {
                                printf("flash init succse\r\n");
                                Status = MAL_OK;
                        }
                        else
                                Status = MAL_FAIL;
      break;
    default:
      return MAL_FAIL;
  }
  return status;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-4 17:35:38 | 显示全部楼层
我在diskgenius上看到了空间大小,但无法对其进行格式化操作
磁盘格式化.PNG
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-4 22:39:55 | 显示全部楼层
发现错误卡在CBW_Decode,每次出现硬件错误,但是获取flash状态,读ID是没错的,不知道怎么回事,是不是解包错误的问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-4 23:11:42 | 显示全部楼层
进一步发现每次读数据的时候都会发生地址溢出错误,错误发生的位置在Address Manager函数,给定的地址非常大,远远超过我的块数量3072,怎么解决啊,

是数据包接收错误吗,USB接收部分代码在哪一块呢
回复 支持 反对

使用道具 举报

发表于 2018-1-5 08:48:13 | 显示全部楼层
        if(SPI_FLASH_ReadID()==sFLASH_ID) 这个sFLASH_ID改了?

或者你参考下429、407的代码,他们就是W25Q128的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-5 08:56:04 | 显示全部楼层
flyleaf 发表于 2018-1-5 08:48
if(SPI_FLASH_ReadID()==sFLASH_ID) 这个sFLASH_ID改了?

或者你参考下429、407的代码,他们就 ...

嗯,对,ID读取正确,0xef4017记得是
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-5 08:57:09 | 显示全部楼层
flyleaf 发表于 2018-1-5 08:48
if(SPI_FLASH_ReadID()==sFLASH_ID) 这个sFLASH_ID改了?

或者你参考下429、407的代码,他们就 ...

做U盘之前还移植了字节读取和文件系统,都没问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-5 09:01:07 | 显示全部楼层
我追踪了下U盘插上之后的操作:查询->文件格式->查询->获取容量->读->设备错误;出现错误的原因在于解码的块地址跟我原来指定的块大小不是一个数量级,导致越界错误。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-5 10:19:54 | 显示全部楼层
可能发现根源了,#define BULK_MAX_PACKET_SIZE  0x00000020 , 这个数字之前改过改成了#define BULK_MAX_PACKET_SIZE  0x00000010 , 然后发现在数据传输过程中至少为32 , 而改成32后无法编译,因为32*64*4 = 8kB,总共stm32f103cbt6只有20k的ram,又导致无法编译成功,RAM不够,怎么破啊
回复 支持 反对

使用道具 举报

发表于 2018-1-5 10:46:18 | 显示全部楼层
tiandijianji 发表于 2018-1-5 10:19
可能发现根源了,#define BULK_MAX_PACKET_SIZE  0x00000020 , 这个数字之前改过改成了#define BULK_MAX_P ...

把栈空间改大点,8k还是有的吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-5 11:20:53 | 显示全部楼层
随风 发表于 2018-1-5 10:46
把栈空间改大点,8k还是有的吧

修改堆栈不管用啊,全局变量好像没定义在堆栈里面?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-5 11:45:01 | 显示全部楼层
把器件改成STM32F103RE后仍然出现..\Output\stm32f10x_xxx.axf: Error: L6405E: No .ANY selector matches stm32f10x_usart.o(i.USART_ITConfig).
难道不是RAM、FLASH的问题吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-5 12:32:09 | 显示全部楼层
果然还是memory文件分配空间的问题,把两处作了修改uint32_t Data_Buffer[BULK_MAX_PACKET_SIZE*8];  和  uint32_t temp =  Counter + 8; 这样就再也没有出现过溢出错误和硬件错误了,但是一直返回NO_SENSE
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-5 12:45:15 | 显示全部楼层
搞错了,是返回SCSI_TEST_UNIT_READY , 并没有出现错误,但是PC端还是无法对其进行操作
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-5 12:46:24 | 显示全部楼层
应该选个RAM大的芯片了,几块钱成本能省好多事
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-6 17:56:34 | 显示全部楼层

折腾了两三天,现在终于可以看到磁盘,进入,拷贝东西进去了,但仍然存在问题:把文件拷贝进去之后,拔下U盘,再插上,发现文件大小被占用了,但是看不到我的文件,这是怎么回事呢?????
读盘.PNG
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 20:58 , Processed in 0.052112 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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