OpenEdv-开源电子网

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

关于STM32HAL----F1+W25Q64实现U盘功能问题

[复制链接]

14

主题

141

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-12-20
在线时间
119 小时
发表于 2019-11-25 16:59:40 | 显示全部楼层 |阅读模式
5金钱
环境:CubeMX 5.4.0 + IAR 8.40.2 + F1 HAL 库1.7.0
硬件:stm32c8t6最小系统版(某宝最通用一款) + MX25L64
问题:问题不知出在哪,按网上教程,接入电脑不认U盘
win10:
3.png
win7
无标题.png



部分源码(删除系统注释):
usbd_storage_it.c:

int8_t STORAGE_Init_FS(uint8_t lun)
{
  return (USBD_OK);
}

int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  *block_num  = SECTOR_NBR;
  *block_size = SECTOR_SIZE;
  return (USBD_OK);
}

int8_t STORAGE_IsReady_FS(uint8_t lun)
{

  if(ExtFlash_GetStatus() == HAL_OK)
    return (USBD_OK);
  else
    return (USBD_FAIL);
}


int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  for (;blk_len >0;blk_len--)
  {
    ExtFlash_SectorRD(buf, blk_addr * SECTOR_SIZE);
    blk_addr++;
    buf += SECTOR_SIZE;
  }
  return (USBD_OK);
}

int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  uint16_t i;
  for (i=0;i<blk_len;i++)
  {
    ExtFlash_SectorWR(buf, blk_addr * SECTOR_SIZE);
    blk_addr++;
    buf += SECTOR_SIZE;
  }
  return (USBD_OK);
}

int8_t STORAGE_GetMaxLun_FS(void)
{
  return (STORAGE_LUN_NBR - 1);
}

flash.c:
void ExtFlash_SectorWR(uint8_t* pBuffer, uint32_t WriteAddr)
{
  uint32_t i;
  WriteAddr = WriteAddr & (~(SECTOR_SIZE-1));                    //保证地址为扇区起始地址
  ExtFLASH_SectorErase(WriteAddr);                              //擦除写入扇区
  for(i=0; i<SECTOR_SIZE; i+=PAGE_SIZE)
  {
    ExtFlash_PageProg(&pBuffer, WriteAddr+i, PAGE_SIZE);     //循环写入数据
  }  
}

void ExtFlash_PageProg(uint8_t* pBuffer, uint32_t WriteAddr,uint16_t NumberOfBytes)
{
  if (NumberOfBytes > 256) NumberOfBytes = 256;        //限定写入数据长度
  ExtFlash_WaitForWriteEnd();                           //检查FLASH是否忙
  ExtFlash_WriteEnable();                               //允许写入
  ExtFlash_CS_LOW();
  InstructionSynthesis(W25X_PageProgram,WriteAddr);     //合并指令与地址,页编程
  SPI_Send(Send32Bits, 4);
  SPI_Send(pBuffer, NumberOfBytes);
  ExtFlash_CS_HIGH();
  ExtFlash_WriteDisable();                              //禁止写入
}


void ExtFlash_SectorRD(uint8_t* pBuffer, uint32_t ReadAddr)
{
  ExtFlash_WaitForWriteEnd();
  ExtFlash_CS_LOW();
  InstructionSynthesis(W25X_FastReadData,ReadAddr);     //合并指令与地址,快速读数据
  Send32Bits[4] = Dummy_Byte;
  SPI_Send(Send32Bits, 5);
  SPI_Receive(pBuffer, SECTOR_SIZE);
  ExtFlash_CS_HIGH();
}

最佳答案

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

如果插进去电脑没反应,检查USB D+有没上拉 如果检测得到却不能正常使用,检查单片机堆设置得是否够大(4K) 如果读写不正常,检查flash代码,以及USB移植的文件函数以及形参是否正确
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2019-11-25 16:59:41 | 显示全部楼层
如果插进去电脑没反应,检查USB D+有没上拉
如果检测得到却不能正常使用,检查单片机堆设置得是否够大(4K)
如果读写不正常,检查flash代码,以及USB移植的文件函数以及形参是否正确
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-11-26 00:19:43 | 显示全部楼层
帮顶
回复

使用道具 举报

14

主题

141

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-12-20
在线时间
119 小时
 楼主| 发表于 2019-11-26 14:06:31 | 显示全部楼层
本帖最后由 网络孤客 于 2019-11-26 14:07 编辑

谢谢大家,解决了。
是代码这里的问题:
int8_t STORAGE_IsReady_FS(uint8_t lun)
{
  if(ExtFlash_GetStatus() == HAL_OK)
    return (USBD_OK);
  else
    return (USBD_FAIL);
}

我是按网上的检查ID方法操作,MX25L64的ID不一样,代码也有点Bug。
接入是,认为检查不到Flash。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 05:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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