[活动专区] 【AT-START-F425测评】+ spi flash做U盘存储

[复制链接]
1309|6
 楼主| WoodData 发表于 2022-3-14 18:38 | 显示全部楼层 |阅读模式
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
6.png
然后主要是msc_diskio.c内修改:
7.png
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  disk read
  3.   * @param  lun: logical units number
  4.   * @param  addr: logical address
  5.   * @param  read_buf: pointer to read buffer
  6.   * @param  len: read length
  7.   * @retval status of usb_sts_type                        
  8.   */
  9. usb_sts_type msc_disk_read(uint8_t lun, uint32_t addr, uint8_t *read_buf, uint32_t len)
  10. {
  11.   uint32_t i = 0;
  12.   uint32_t flash_addr = addr + USB_FLASH_ADDR_OFFSET;
  13. <font color="#ff0000">  printf("MSC_R%d>>%X:%X\r\n",lun,addr,len);//打印输出</font>
  14.   switch(lun)
  15.   {
  16.     case INTERNAL_FLASH_LUN:
  17.       for(i = 0; i < len; i ++)
  18.       {
  19.         read_buf[i] = *((uint8_t *)flash_addr);
  20.         flash_addr += 1;
  21.       }
  22.       break;
  23.     case SPI_FLASH_LUN:
  24. <font color="#ff0000">        spiflash_read(read_buf,addr,len);</font>
  25.       break;
  26.     case SD_LUN:
  27.       break;
  28.     default:
  29.       break;
  30.   }
  31.   return USB_OK;
  32. }

  33. /**
  34.   * @brief  disk write
  35.   * @param  lun: logical units number
  36.   * @param  addr: logical address
  37.   * @param  buf: pointer to write buffer
  38.   * @param  len: write length
  39.   * @retval status of usb_sts_type                        
  40.   */
  41. usb_sts_type msc_disk_write(uint8_t lun, uint32_t addr, uint8_t *buf, uint32_t len)
  42. {
  43.   uint32_t flash_addr = addr + USB_FLASH_ADDR_OFFSET;
  44.   uint32_t i = 0, tolen = len;
  45.   uint32_t erase_addr = flash_addr;
  46. <font color="#ff0000">  printf("MSC_W%d>>%X:%X\r\n",lun,addr,len);</font>
  47.   switch(lun)
  48.   {
  49.     case INTERNAL_FLASH_LUN:
  50.       flash_unlock();
  51.       while(tolen >= sector_size)
  52.       {
  53.         flash_sector_erase(erase_addr);
  54.         tolen -= sector_size;
  55.         erase_addr += sector_size;
  56.       }
  57.       for(i = 0; i < len; i ++)
  58.       {
  59.         flash_byte_program(flash_addr+i, buf[i]);
  60.       }
  61.       flash_lock();
  62.       break;
  63. <font color="#ff0000">    case SPI_FLASH_LUN:
  64.       spiflash_write(buf,addr,len);</font>
  65.       break;
  66.     case SD_LUN:
  67.       break;
  68.     default:
  69.       break;;
  70.   }
  71.   return USB_OK;
  72. }

  73. /**
  74.   * @brief  disk capacity
  75.   * @param  lun: logical units number
  76.   * @param  blk_nbr: pointer to number of block
  77.   * @param  blk_size: pointer to block size
  78.   * @retval status of usb_sts_type                        
  79.   */
  80. usb_sts_type msc_disk_capacity(uint8_t lun, uint32_t *blk_nbr, uint32_t *blk_size)
  81. {
  82.   uint32_t devid = (*((uint32_t *)DEBUG_BASE) & 0x00007000) >> 12;
  83.   msc_flash_size = (*((uint32_t *)0x1FFFF7E0) << 10) - (USB_FLASH_ADDR_OFFSET - FLASH_BASE);
  84.   switch(devid)
  85.   {
  86.     case 2:
  87.       sector_size = SECTOR_SIZE_1K;
  88.       break;
  89.     case 3:
  90.       sector_size = SECTOR_SIZE_2K;
  91.       break;
  92.     case 4:
  93.       sector_size = SECTOR_SIZE_4K;
  94.       break;
  95.     default:
  96.       sector_size = SECTOR_SIZE_2K;
  97.       break;
  98.   }
  99.   switch(lun)
  100.   {
  101.     case INTERNAL_FLASH_LUN:
  102.       *blk_nbr = msc_flash_size / sector_size;
  103.       *blk_size = sector_size;
  104.       break;
  105. <font color="#ff0000">    case SPI_FLASH_LUN://对应W25Q128
  106.       *blk_nbr  = 1024*1024*16 / 4096;
  107.       *blk_size = 4096;      </font>
  108.       break;
  109.     case SD_LUN:
  110.       break;
  111.     default:
  112.       break;
  113.   }
  114.   return USB_OK;
  115. }
主要修改基本完成了。记得初始化spiflash。
下面看看效果。枚举了2个U盘,一个内部flash的,一个W25Q128 flash的。枚举后要初始格式化一下。
2.png
1.png

下面是拷贝文件进去测试。
3.png
4.png
5.png
可以看到读写时串口信息输出。

claretttt 发表于 2022-12-5 20:40 | 显示全部楼层
spi flash的速度怎么样              
sdlls 发表于 2022-12-5 22:50 | 显示全部楼层
AT-START-F425是否有qpsi
febgxu 发表于 2022-12-6 12:59 | 显示全部楼层
电脑端是否需要驱动程序?              
dspmana 发表于 2022-12-6 14:50 | 显示全部楼层
这个怎么确定哪段flash空间可以用来读写的
mnynt121 发表于 2022-12-6 16:00 | 显示全部楼层
AT-START-F425支持的功能真是多。
pl202 发表于 2022-12-6 17:19 | 显示全部楼层
使用的是usb读取的数据?              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

4786

帖子

28

粉丝
快速回复 在线客服 返回列表 返回顶部