找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 13198|回復(fù): 16
打印 上一主題 下一主題
收起左側(cè)

STM32 USB虛擬U盤例程 spi w25q16 flash芯片源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:415857 發(fā)表于 2018-10-26 16:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
發(fā)一個(gè)stm32 usb虛擬U盤的例程,采用spi w25q16 flash 芯片
1、該例程為USB-Mass_Storage-SD Card使用例程。

2、使用說(shuō)明
   (1)工程文件路徑:例程目錄\USB-Mass_Storage-SD Card\MDK-ARM\Project.uvproj。
   (2)請(qǐng)使用MDK 4.0以上版本打開(kāi),MDK版本過(guò)低會(huì)導(dǎo)致無(wú)法識(shí)別工程。
   (3)下載調(diào)試工具為ULINK。
   (4)請(qǐng)將USB線插板子上。
   (6)HEX文件下載到板子后,打開(kāi)我的電腦往新識(shí)別磁盤拷貝文件(LED為讀寫指示燈),成功拷貝表明例程運(yùn)行正確。

3、注意事項(xiàng)
   請(qǐng)務(wù)必在下載、調(diào)試、運(yùn)行過(guò)程中,保持板子上電、ULINK連接并插在電腦上。


USB-Mass_Storage-SPI_Flash(W25X16)

單片機(jī)源程序如下:
  1. #include  <stm32f10x.h>
  2. #include "W25X16.h"                          
  3. #include  <stdio.h>
  4.                                           
  5. #define MAX_ADDR 0x1fffff
  6. #define SEC_SIZE 4095          //byte
  7. #define SEC_MAX 511
  8. //以下是SPI模塊的初始化代碼,配置成主機(jī)模式,訪問(wèn)SD Card/W25X16/24L01/JF24C                                                          
  9. //SPI口初始化
  10. //這里針是對(duì)SPI1的初始化
  11. SPI_InitTypeDef  SPI_InitStructure;

  12. #define DF_CS_ENABLE()      GPIO_ResetBits(GPIOB,GPIO_Pin_6)   //選中SD卡
  13. #define DF_CS_DISABLE()     GPIO_SetBits(GPIOB,GPIO_Pin_6)     //不選中SD卡
  14. u8 SPIx_ReadWriteByte(u8 TxData);

  15. void SPIx_Init(void)
  16. {
  17.         GPIO_InitTypeDef GPIO_InitStructure;
  18.   
  19.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE );       

  20.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //復(fù)用推挽輸出
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  23.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  24.         GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);

  25.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //設(shè)置SPI單向或者雙向的數(shù)據(jù)模式:SPI設(shè)置為雙線雙向全雙工
  26.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //設(shè)置SPI工作模式:設(shè)置為主SPI
  27.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //設(shè)置SPI的數(shù)據(jù)大小:SPI發(fā)送接收8位幀結(jié)構(gòu)
  28.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //選擇了串行時(shí)鐘的穩(wěn)態(tài):時(shí)鐘懸空高
  29.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //數(shù)據(jù)捕獲于第二個(gè)時(shí)鐘沿
  30.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信號(hào)由硬件(NSS管腳)還是軟件(使用SSI位)管理:內(nèi)部NSS信號(hào)有SSI位控制
  31.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定義波特率預(yù)分頻的值:波特率預(yù)分頻值為256
  32.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定數(shù)據(jù)傳輸從MSB位還是LSB位開(kāi)始:數(shù)據(jù)傳輸從MSB位開(kāi)始
  33.         SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值計(jì)算的多項(xiàng)式
  34.         SPI_Init(SPI1, &SPI_InitStructure);  //根據(jù)SPI_InitStruct中指定的參數(shù)初始化外設(shè)SPIx寄存器

  35.         SPI_Cmd(SPI1, ENABLE); //使能SPI外設(shè)
  36.        
  37.         SPIx_ReadWriteByte(0xff);//啟動(dòng)傳輸                 
  38. }   

  39. //SPIx 讀寫一個(gè)字節(jié)
  40. //TxData:要寫入的字節(jié)
  41. //返回值:讀取到的字節(jié)
  42. u8 SPIx_ReadWriteByte(u8 TxData)
  43. {               
  44.         u8 retry=0;                                 
  45.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //檢查指定的SPI標(biāo)志位設(shè)置與否:發(fā)送緩存空標(biāo)志位
  46.         {
  47.                 retry++;
  48.                 if(retry>200){printf("SPI Write TimeOut!\r\n");return 0;}
  49.         }                          

  50.         SPI_I2S_SendData(SPI1, TxData); //通過(guò)外設(shè)SPIx發(fā)送一個(gè)數(shù)據(jù)
  51.         retry=0;
  52.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//檢查指定的SPI標(biāo)志位設(shè)置與否:接受緩存非空標(biāo)志位
  53.         {
  54.                 retry++;
  55.                 if(retry>200){printf("SPI Read TimeOut!\r\n");return 0;}
  56.         }                                                              
  57.         return SPI_I2S_ReceiveData(SPI1); //返回通過(guò)SPIx最近接收的數(shù)據(jù)                                            
  58. }

  59. //SPI硬件層初始化
  60. void Flash_SPI_Init(void)
  61. {
  62.     GPIO_InitTypeDef GPIO_InitStructure;
  63.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );         

  64.     GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_7;
  65.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽輸出
  66.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  67.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  68.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  69.         GPIO_SetBits(GPIOB,GPIO_Pin_6);
  70.         GPIO_SetBits(GPIOB,GPIO_Pin_7);
  71.         GPIO_SetBits(GPIOA,GPIO_Pin_4);
  72.         SPIx_Init();
  73. }

  74. // 讀
  75. u8 W25X16_Read(u32 DstAdr, u8* RcvBufPt ,u32 NByte)
  76. {
  77.         u32 i = 0;
  78.         if ((DstAdr+NByte > MAX_ADDR)||(NByte == 0))        return (0);         /*        檢查入口參數(shù) */       

  79.                 DF_CS_ENABLE();                         
  80.                 SPIx_ReadWriteByte(0x05);        //
  81.                 while(SPIx_ReadWriteByte(0xff)&0x01)
  82.                 {}                         
  83.                 DF_CS_DISABLE();

  84.         DF_CS_ENABLE();
  85.         SPIx_ReadWriteByte(0x0B);        //read comand
  86.         SPIx_ReadWriteByte(((DstAdr & 0xFFFFFF) >> 16));        /* 發(fā)送地址信息:該地址由3個(gè)字節(jié)組成        */
  87.         SPIx_ReadWriteByte(((DstAdr & 0xFFFF) >> 8));
  88.         SPIx_ReadWriteByte(DstAdr & 0xFF);
  89.         SPIx_ReadWriteByte(0xff);        //啞字節(jié)
  90.         for (i = 0; i < NByte; i++)               
  91.         {
  92.        RcvBufPt[i] = SPIx_ReadWriteByte(0xFF);               
  93.         }

  94.         DF_CS_DISABLE();
  95.         return 1;
  96. }
  97. u8 W25X16_SectorRead(u32 sec,  u8* RcvBufPt)
  98. {
  99.         u16 i;
  100.         sec*=4096;


  101.         DF_CS_ENABLE();
  102.         SPIx_ReadWriteByte(0x03);        //read comand
  103.         SPIx_ReadWriteByte(((sec & 0xFFFFFF) >> 16));        /* 發(fā)送地址信息:該地址由3個(gè)字節(jié)組成        */
  104.         SPIx_ReadWriteByte(((sec & 0xFFFF) >> 8));
  105.         SPIx_ReadWriteByte(sec & 0xFF);
  106. //        SPIx_ReadWriteByte(0xff);        //啞字節(jié)
  107.         for (i = 0; i < 4096; i++)               
  108.         {
  109.        RcvBufPt[i] = SPIx_ReadWriteByte(0xFF);               
  110.         }
  111.         DF_CS_DISABLE();       
  112.         DF_CS_ENABLE();                         
  113.         SPIx_ReadWriteByte(0x05);        //
  114.         while(SPIx_ReadWriteByte(0xff)&0x01)
  115.         {}                         
  116.         DF_CS_DISABLE();
  117.        
  118.         return 1;
  119. }

  120. //寫一個(gè)扇區(qū)
  121. //每個(gè)扇區(qū)有4096個(gè)字節(jié)
  122. u8 W25X16_SectorWrite(u32 sec,  u8* SndbufPt)
  123. {

  124.         u32 i = 0, j;
  125. //        u32 addr;
  126.         sec*=4096;
  127.         for(j=0;j<16;j++)
  128.         {       

  129.                

  130.                 DF_CS_ENABLE();
  131.                 SPIx_ReadWriteByte(0x06);        //write enable
  132.                 DF_CS_DISABLE();

  133.                 DF_CS_ENABLE();
  134.                 SPIx_ReadWriteByte(0x02);  //page program
  135.                 SPIx_ReadWriteByte((( sec& 0xFFFFFF) >> 16));  /* 發(fā)送3個(gè)字節(jié)的地址信息 */
  136.                 SPIx_ReadWriteByte(((sec& 0xFFFF) >> 8));
  137.                 SPIx_ReadWriteByte( sec& 0xFF);
  138.                 for(i=0;i<256;i++)
  139.                 {
  140.                         SPIx_ReadWriteByte(SndbufPt[i]);
  141.                 }
  142.                 DF_CS_DISABLE();        
  143.                 SndbufPt+=256;       
  144.                 sec+=256;                
  145.                 DF_CS_ENABLE();
  146.                 SPIx_ReadWriteByte(0x05);        //        等待  BUZY = 0
  147.                 while(SPIx_ReadWriteByte(0xff)&0x01)
  148.                 {}                         
  149.                 DF_CS_DISABLE();
  150.         }
  151.         return 1;               
  152. }
  153. //sec1,sec (0,511)
  154. u8 W25X16_SectorErase(u32 sec)
  155. {
  156.         sec *=4096;


  157.         DF_CS_ENABLE();
  158.         SPIx_ReadWriteByte(0x06);        //write enable        WEL = 1
  159.         DF_CS_DISABLE();

  160.         DF_CS_ENABLE();       
  161.         SPIx_ReadWriteByte(0x20); //  sector erase reg       
  162.         SPIx_ReadWriteByte((((sec) & 0xFFFFFF) >> 16));  /* 發(fā)送3個(gè)字節(jié)的地址信息 */
  163.         SPIx_ReadWriteByte((((sec) & 0xFFFF) >> 8));
  164.         SPIx_ReadWriteByte((sec) & 0xFF);
  165.         DF_CS_DISABLE();
  166.         DF_CS_ENABLE();
  167.         SPIx_ReadWriteByte(0x05);        //                        等待  BUZY = 0
  168.         while(SPIx_ReadWriteByte(0xff)&0x01)
  169.         {}                 
  170.         DF_CS_DISABLE();
  171.         return 1;
  172. }
復(fù)制代碼

所有資料51hei提供下載:
USB-Mass_Storage-SPI_Flash(W25X16).rar (538.94 KB, 下載次數(shù): 359)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

16#
ID:517951 發(fā)表于 2021-9-22 09:49 | 只看該作者
spi接口的U盤,讀寫是不是很慢。
回復(fù)

使用道具 舉報(bào)

15#
ID:965170 發(fā)表于 2021-9-20 14:32 | 只看該作者
不錯(cuò),感謝熱心網(wǎng)友
回復(fù)

使用道具 舉報(bào)

14#
ID:806655 發(fā)表于 2021-8-25 10:58 | 只看該作者
PC端不需要驅(qū)動(dòng)嗎????
回復(fù)

使用道具 舉報(bào)

13#
ID:474637 發(fā)表于 2021-3-24 08:42 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

12#
ID:629912 發(fā)表于 2021-1-26 14:20 | 只看該作者
好資料,51黑有你更精彩!!!!!!!!
回復(fù)

使用道具 舉報(bào)

11#
ID:471251 發(fā)表于 2020-5-6 09:19 | 只看該作者
感謝分享!無(wú)私奉獻(xiàn)
回復(fù)

使用道具 舉報(bào)

10#
ID:61261 發(fā)表于 2019-12-6 10:44 | 只看該作者
感謝分享!無(wú)私奉獻(xiàn)
回復(fù)

使用道具 舉報(bào)

9#
ID:280272 發(fā)表于 2019-12-5 17:49 | 只看該作者

好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

8#
ID:377989 發(fā)表于 2019-11-18 17:23 | 只看該作者
好資料啊,正好需要
回復(fù)

使用道具 舉報(bào)

7#
ID:591015 發(fā)表于 2019-7-26 21:06 | 只看該作者
牛逼 怎么才能免費(fèi)下載呢 這么好的東西
回復(fù)

使用道具 舉報(bào)

6#
ID:156606 發(fā)表于 2019-5-1 17:39 | 只看該作者
不錯(cuò),好好學(xué)習(xí)下。
回復(fù)

使用道具 舉報(bào)

5#
ID:64682 發(fā)表于 2019-3-29 21:17 | 只看該作者
STM32 USB虛擬U盤例程 spi w25q16 flash芯片源碼
回復(fù)

使用道具 舉報(bào)

地板
ID:90169 發(fā)表于 2019-3-5 22:36 | 只看該作者
不錯(cuò),好好學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

板凳
ID:285301 發(fā)表于 2019-1-16 16:35 | 只看該作者
下載了,不過(guò)不是CUBEMX工程
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:91469 發(fā)表于 2018-12-1 08:30 來(lái)自手機(jī) | 只看該作者
感謝分享!為我所用
回復(fù)

使用道具 舉報(bào)

樓主
ID:1 發(fā)表于 2018-11-1 17:01 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表