打印
[活动专区]

【AT-START-F425测评】+ spi flash做U盘存储

[复制链接]
740|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AD, ic, ar, pi
记上篇测试了flash读写,链接:https://bbs.21ic.com/icview-3205114-1-1.html  下面趁热打铁,把flash做成U盘测试下。

找到AT-START-F425开发板关于msc做U盘的例程改动一下。增加flash读写。U盘例子看了一下,很容易就加上了flash读写。
下面在U盘例子上增加一个盘。原例子是把mcu内部flash做的u盘。
首先修改如图
msc_bot_scsi.h文件
#define MSC_SUPPORT_MAX_LUN              2

然后主要是msc_diskio.c内修改:

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  disk read
  * @param  lun: logical units number
  * @param  addr: logical address
  * @param  read_buf: pointer to read buffer
  * @param  len: read length
  * @retval status of usb_sts_type                        
  */
usb_sts_type msc_disk_read(uint8_t lun, uint32_t addr, uint8_t *read_buf, uint32_t len)
{
  uint32_t i = 0;
  uint32_t flash_addr = addr + USB_FLASH_ADDR_OFFSET;
<font color="#ff0000">  printf("MSC_R%d>>%X:%X\r\n",lun,addr,len);//打印输出</font>
  switch(lun)
  {
    case INTERNAL_FLASH_LUN:
      for(i = 0; i < len; i ++)
      {
        read_buf[i] = *((uint8_t *)flash_addr);
        flash_addr += 1;
      }
      break;
    case SPI_FLASH_LUN:
<font color="#ff0000">        spiflash_read(read_buf,addr,len);</font>
      break;
    case SD_LUN:
      break;
    default:
      break;
  }
  return USB_OK;
}

/**
  * @brief  disk write
  * @param  lun: logical units number
  * @param  addr: logical address
  * @param  buf: pointer to write buffer
  * @param  len: write length
  * @retval status of usb_sts_type                        
  */
usb_sts_type msc_disk_write(uint8_t lun, uint32_t addr, uint8_t *buf, uint32_t len)
{
  uint32_t flash_addr = addr + USB_FLASH_ADDR_OFFSET;
  uint32_t i = 0, tolen = len;
  uint32_t erase_addr = flash_addr;
<font color="#ff0000">  printf("MSC_W%d>>%X:%X\r\n",lun,addr,len);</font>
  switch(lun)
  {
    case INTERNAL_FLASH_LUN:
      flash_unlock();
      while(tolen >= sector_size)
      {
        flash_sector_erase(erase_addr);
        tolen -= sector_size;
        erase_addr += sector_size;
      }
      for(i = 0; i < len; i ++)
      {
        flash_byte_program(flash_addr+i, buf[i]);
      }
      flash_lock();
      break;
<font color="#ff0000">    case SPI_FLASH_LUN:
      spiflash_write(buf,addr,len);</font>
      break;
    case SD_LUN:
      break;
    default:
      break;;
  }
  return USB_OK;
}

/**
  * @brief  disk capacity
  * @param  lun: logical units number
  * @param  blk_nbr: pointer to number of block
  * @param  blk_size: pointer to block size
  * @retval status of usb_sts_type                        
  */
usb_sts_type msc_disk_capacity(uint8_t lun, uint32_t *blk_nbr, uint32_t *blk_size)
{
  uint32_t devid = (*((uint32_t *)DEBUG_BASE) & 0x00007000) >> 12;
  msc_flash_size = (*((uint32_t *)0x1FFFF7E0) << 10) - (USB_FLASH_ADDR_OFFSET - FLASH_BASE);
  switch(devid)
  {
    case 2:
      sector_size = SECTOR_SIZE_1K;
      break;
    case 3:
      sector_size = SECTOR_SIZE_2K;
      break;
    case 4:
      sector_size = SECTOR_SIZE_4K;
      break;
    default:
      sector_size = SECTOR_SIZE_2K;
      break;
  }
  switch(lun)
  {
    case INTERNAL_FLASH_LUN:
      *blk_nbr = msc_flash_size / sector_size;
      *blk_size = sector_size;
      break;
<font color="#ff0000">    case SPI_FLASH_LUN://对应W25Q128
      *blk_nbr  = 1024*1024*16 / 4096;
      *blk_size = 4096;      </font>
      break;
    case SD_LUN:
      break;
    default:
      break;
  }
  return USB_OK;
}
主要修改基本完成了。记得初始化spiflash。
下面看看效果。枚举了2个U盘,一个内部flash的,一个W25Q128 flash的。枚举后要初始格式化一下。



下面是拷贝文件进去测试。



可以看到读写时串口信息输出。

使用特权

评论回复
沙发
claretttt| | 2022-12-5 20:40 | 只看该作者
spi flash的速度怎么样              

使用特权

评论回复
板凳
sdlls| | 2022-12-5 22:50 | 只看该作者
AT-START-F425是否有qpsi

使用特权

评论回复
地板
febgxu| | 2022-12-6 12:59 | 只看该作者
电脑端是否需要驱动程序?              

使用特权

评论回复
5
dspmana| | 2022-12-6 14:50 | 只看该作者
这个怎么确定哪段flash空间可以用来读写的

使用特权

评论回复
6
mnynt121| | 2022-12-6 16:00 | 只看该作者
AT-START-F425支持的功能真是多。

使用特权

评论回复
7
pl202| | 2022-12-6 17:19 | 只看该作者
使用的是usb读取的数据?              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

115

主题

4370

帖子

25

粉丝