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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13147|回復(fù): 16
收起左側(cè)

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

  [復(fù)制鏈接]
ID:415857 發(fā)表于 2018-10-26 16:17 | 顯示全部樓層 |閱讀模式
發(fā)一個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版本過低會導(dǎo)致無法識別工程。
   (3)下載調(diào)試工具為ULINK。
   (4)請將USB線插板子上。
   (6)HEX文件下載到板子后,打開我的電腦往新識別磁盤拷貝文件(LED為讀寫指示燈),成功拷貝表明例程運行正確。

3、注意事項
   請務(wù)必在下載、調(diào)試、運行過程中,保持板子上電、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;  //復(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;                //選擇了串行時鐘的穩(wěn)態(tài):時鐘懸空高
  29.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //數(shù)據(jù)捕獲于第二個時鐘沿
  30.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信號由硬件(NSS管腳)還是軟件(使用SSI位)管理:內(nèi)部NSS信號有SSI位控制
  31.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定義波特率預(yù)分頻的值:波特率預(yù)分頻值為256
  32.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定數(shù)據(jù)傳輸從MSB位還是LSB位開始:數(shù)據(jù)傳輸從MSB位開始
  33.         SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值計算的多項式
  34.         SPI_Init(SPI1, &SPI_InitStructure);  //根據(jù)SPI_InitStruct中指定的參數(shù)初始化外設(shè)SPIx寄存器

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

  39. //SPIx 讀寫一個字節(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); //通過外設(shè)SPIx發(fā)送一個數(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); //返回通過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個字節(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個字節(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. //寫一個扇區(qū)
  121. //每個扇區(qū)有4096個字節(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個字節(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個字節(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)
回復(fù)

使用道具 舉報

ID:1 發(fā)表于 2018-11-1 17:01 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

ID:91469 發(fā)表于 2018-12-1 08:30 來自手機 | 顯示全部樓層
感謝分享!為我所用
回復(fù)

使用道具 舉報

ID:285301 發(fā)表于 2019-1-16 16:35 | 顯示全部樓層
下載了,不過不是CUBEMX工程
回復(fù)

使用道具 舉報

ID:90169 發(fā)表于 2019-3-5 22:36 | 顯示全部樓層
不錯,好好學(xué)習(xí)下
回復(fù)

使用道具 舉報

ID:64682 發(fā)表于 2019-3-29 21:17 | 顯示全部樓層
STM32 USB虛擬U盤例程 spi w25q16 flash芯片源碼
回復(fù)

使用道具 舉報

ID:156606 發(fā)表于 2019-5-1 17:39 | 顯示全部樓層
不錯,好好學(xué)習(xí)下。
回復(fù)

使用道具 舉報

ID:591015 發(fā)表于 2019-7-26 21:06 | 顯示全部樓層
牛逼 怎么才能免費下載呢 這么好的東西
回復(fù)

使用道具 舉報

ID:377989 發(fā)表于 2019-11-18 17:23 | 顯示全部樓層
好資料啊,正好需要
回復(fù)

使用道具 舉報

ID:280272 發(fā)表于 2019-12-5 17:49 | 顯示全部樓層

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

使用道具 舉報

ID:61261 發(fā)表于 2019-12-6 10:44 | 顯示全部樓層
感謝分享!無私奉獻
回復(fù)

使用道具 舉報

ID:471251 發(fā)表于 2020-5-6 09:19 | 顯示全部樓層
感謝分享!無私奉獻
回復(fù)

使用道具 舉報

ID:629912 發(fā)表于 2021-1-26 14:20 | 顯示全部樓層
好資料,51黑有你更精彩!!!!!!!!
回復(fù)

使用道具 舉報

ID:474637 發(fā)表于 2021-3-24 08:42 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

ID:806655 發(fā)表于 2021-8-25 10:58 | 顯示全部樓層
PC端不需要驅(qū)動嗎????
回復(fù)

使用道具 舉報

ID:965170 發(fā)表于 2021-9-20 14:32 | 顯示全部樓層
不錯,感謝熱心網(wǎng)友
回復(fù)

使用道具 舉報

ID:517951 發(fā)表于 2021-9-22 09:49 | 顯示全部樓層
spi接口的U盤,讀寫是不是很慢啊?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品综合 | 一区二区在线 | 免费在线看黄 | 在线亚洲免费 | 日韩精品 电影一区 亚洲 | 毛片链接| 免费久久精品 | 国产精品a久久久久 | 亚洲va欧美va天堂v国产综合 | 欧美日韩成人在线观看 | 人人玩人人干 | 亚洲精品99999 | 一本大道久久a久久精二百 国产成人免费在线 | 精品久久一区 | 久久五月婷 | 99精品久久久久 | 国产a级毛片 | 久久免费精品视频 | 精品久 | 国产一级特黄aaa大片评分 | 福利片一区二区 | 亚洲午夜精品一区二区三区他趣 | 色婷婷亚洲国产女人的天堂 | 国产精品99 | 97精品国产97久久久久久免费 | 亚洲精品91 | 91社影院在线观看 | 日批免费看 | 日韩在线一区二区三区 | 一级片子| 日韩亚洲一区二区 | 欧美一区二区另类 | 91av久久久 | 亚洲精品视频在线播放 | 美女视频一区二区三区 | 亚洲精品区 | 欧美a在线 | 99亚洲视频| 色综合视频在线 | 免费久久99精品国产婷婷六月 | 免费a级毛片在线播放 |