久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13358|回復: 16
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
ID:415857 發表于 2018-10-26 16:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發一個stm32 usb虛擬U盤的例程,采用spi w25q16 flash 芯片
1、該例程為USB-Mass_Storage-SD Card使用例程。

2、使用說明
   (1)工程文件路徑:例程目錄\USB-Mass_Storage-SD Card\MDK-ARM\Project.uvproj。
   (2)請使用MDK 4.0以上版本打開,MDK版本過低會導致無法識別工程。
   (3)下載調試工具為ULINK。
   (4)請將USB線插板子上。
   (6)HEX文件下載到板子后,打開我的電腦往新識別磁盤拷貝文件(LED為讀寫指示燈),成功拷貝表明例程運行正確。

3、注意事項
   請務必在下載、調試、運行過程中,保持板子上電、ULINK連接并插在電腦上。


USB-Mass_Storage-SPI_Flash(W25X16)

單片機源程序如下:
  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模塊的初始化代碼,配置成主機模式,訪問SD Card/W25X16/24L01/JF24C                                                          
  9. //SPI口初始化
  10. //這里針是對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;  //復用推挽輸出
  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;  //設置SPI單向或者雙向的數據模式:SPI設置為雙線雙向全雙工
  26.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //設置SPI工作模式:設置為主SPI
  27.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //設置SPI的數據大小:SPI發送接收8位幀結構
  28.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //選擇了串行時鐘的穩態:時鐘懸空高
  29.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //數據捕獲于第二個時鐘沿
  30.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信號由硬件(NSS管腳)還是軟件(使用SSI位)管理:內部NSS信號有SSI位控制
  31.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定義波特率預分頻的值:波特率預分頻值為256
  32.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定數據傳輸從MSB位還是LSB位開始:數據傳輸從MSB位開始
  33.         SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值計算的多項式
  34.         SPI_Init(SPI1, &SPI_InitStructure);  //根據SPI_InitStruct中指定的參數初始化外設SPIx寄存器

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

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

  50.         SPI_I2S_SendData(SPI1, TxData); //通過外設SPIx發送一個數據
  51.         retry=0;
  52.         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//檢查指定的SPI標志位設置與否:接受緩存非空標志位
  53.         {
  54.                 retry++;
  55.                 if(retry>200){printf("SPI Read TimeOut!\r\n");return 0;}
  56.         }                                                              
  57.         return SPI_I2S_ReceiveData(SPI1); //返回通過SPIx最近接收的數據                                            
  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);         /*        檢查入口參數 */       

  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));        /* 發送地址信息:該地址由3個字節組成        */
  87.         SPIx_ReadWriteByte(((DstAdr & 0xFFFF) >> 8));
  88.         SPIx_ReadWriteByte(DstAdr & 0xFF);
  89.         SPIx_ReadWriteByte(0xff);        //啞字節
  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));        /* 發送地址信息:該地址由3個字節組成        */
  104.         SPIx_ReadWriteByte(((sec & 0xFFFF) >> 8));
  105.         SPIx_ReadWriteByte(sec & 0xFF);
  106. //        SPIx_ReadWriteByte(0xff);        //啞字節
  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. //寫一個扇區
  121. //每個扇區有4096個字節
  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));  /* 發送3個字節的地址信息 */
  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));  /* 發送3個字節的地址信息 */
  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. }
復制代碼

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


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

使用道具 舉報

沙發
ID:1 發表于 2018-11-1 17:01 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:91469 發表于 2018-12-1 08:30 來自觸屏版 | 只看該作者
感謝分享!為我所用
回復

使用道具 舉報

地板
ID:285301 發表于 2019-1-16 16:35 | 只看該作者
下載了,不過不是CUBEMX工程
回復

使用道具 舉報

5#
ID:90169 發表于 2019-3-5 22:36 | 只看該作者
不錯,好好學習下
回復

使用道具 舉報

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

使用道具 舉報

7#
ID:156606 發表于 2019-5-1 17:39 | 只看該作者
不錯,好好學習下。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

10#
ID:280272 發表于 2019-12-5 17:49 | 只看該作者

好資料,51黑有你更精彩!!!
回復

使用道具 舉報

11#
ID:61261 發表于 2019-12-6 10:44 | 只看該作者
感謝分享!無私奉獻
回復

使用道具 舉報

12#
ID:471251 發表于 2020-5-6 09:19 | 只看該作者
感謝分享!無私奉獻
回復

使用道具 舉報

13#
無效樓層,該帖已經被刪除
14#
無效樓層,該帖已經被刪除
15#
無效樓層,該帖已經被刪除
16#
ID:629912 發表于 2021-1-26 14:20 | 只看該作者
好資料,51黑有你更精彩!!!!!!!!
回復

使用道具 舉報

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

使用道具 舉報

18#
ID:806655 發表于 2021-8-25 10:58 | 只看該作者
PC端不需要驅動嗎????
回復

使用道具 舉報

19#
ID:965170 發表于 2021-9-20 14:32 | 只看該作者
不錯,感謝熱心網友
回復

使用道具 舉報

20#
ID:517951 發表于 2021-9-22 09:49 | 只看該作者
spi接口的U盤,讀寫是不是很慢啊?
回復

使用道具 舉報

21#
無效樓層,該帖已經被刪除
22#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色婷婷综合久久久中字幕精品久久 | 一级黄色日本片 | 亚州春色 | 久久精品屋 | 久久99蜜桃综合影院免费观看 | 国产黄色在线观看 | 亚洲精久久久 | 欧美日韩在线免费观看 | 国产精品区一区二 | 又黑又粗又长的欧美一区 | 男女午夜免费视频 | 日本视频中文字幕 | 韩日精品视频 | 亚洲精品欧美 | 亚洲国产一区视频 | 成人在线精品视频 | 欧美日产国产成人免费图片 | 福利一区在线观看 | 午夜精品一区二区三区在线观看 | 性高湖久久久久久久久aaaaa | 毛片高清 | 一区二区三区四区免费在线观看 | 四虎成人免费视频 | 亚洲国产精品一区二区久久 | 久久综合一区二区三区 | 国产精品亚洲一区二区三区在线 | 日韩中文一区 | 久久久一二三区 | 亚洲精品短视频 | 美女一级黄 | 中文字幕一级 | 欧美一区二区免费电影 | 免费看片在线播放 | 久久精品青青大伊人av | 久久久www成人免费精品张筱雨 | 91精品国产综合久久婷婷香蕉 | 在线国产视频观看 | 在线观看中文字幕亚洲 | 老司机67194精品线观看 | 97国产超碰 | 一级欧美一级日韩片 |