亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? spi_flash.c

?? STM32F10x USB Library V1.0
?? C
?? 第 1 頁 / 共 2 頁
字號:
/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
* File Name          : spi_flash.c
* Author             : MCD Application Team
* Version            : V1.0
* Date               : 10/08/2007
* Description        : This file provides a set of functions needed to manage the
*                      communication between SPI peripheral and SPI M25P64 FLASH.
********************************************************************************
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "spi_flash.h"

/* Private typedef -----------------------------------------------------------*/
#define SPI_FLASH_PageSize 256

#define WRITE      0x02  /* Write to Memory instruction */
#define WRSR       0x01  /* Write Status Register instruction */ 
#define WREN       0x06  /* Write enable instruction */

#define READ       0x03  /* Read from Memory instruction */
#define RDSR       0x05  /* Read Status Register instruction  */
#define RDID       0x9F  /* Read identification */
#define SE         0xD8  /* Sector Erase instruction */
#define BE         0xC7  /* Bulk Erase instruction */

#define WIP_Flag   0x01  /* Write In Progress (WIP) flag */

#define Dummy_Byte 0xA5

/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : SPI_FLASH_Init
* Description    : Initializes the peripherals used by the SPI FLASH driver.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_FLASH_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
   
  /* Enable SPI1 and GPIOA clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE);
  
  /* Configure SPI1 pins: NSS, SCK, MISO and MOSI */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure PA.4 as Output push-pull, used as Flash Chip select */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();

  /* SPI1 configuration */ 
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);
  
  /* Enable SPI1  */
  SPI_Cmd(SPI1, ENABLE);   
}

/*******************************************************************************
* Function Name  : SPI_FLASH_SectorErase
* Description    : Erases the specified FLASH sector.
* Input          : SectorAddr: address of the sector to erase.
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_FLASH_SectorErase(u32 SectorAddr)
{
  /* Send write enable instruction */
  SPI_FLASH_WriteEnable();

  /* Sector Erase */ 
  /* Select the FLASH: Chip Select low */
  SPI_FLASH_CS_LOW();
  /* Send Sector Erase instruction */
  SPI_FLASH_SendByte(SE);
  /* Send SectorAddr high nibble address byte */
  SPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16);
  /* Send SectorAddr medium nibble address byte */
  SPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8);
  /* Send SectorAddr low nibble address byte */
  SPI_FLASH_SendByte(SectorAddr & 0xFF);
  /* Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();

  /* Wait the end of Flash writing */
  SPI_FLASH_WaitForWriteEnd();
}

/*******************************************************************************
* Function Name  : SPI_FLASH_BulkErase
* Description    : Erases the entire FLASH.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_FLASH_BulkErase(void)
{
  /* Send write enable instruction */
  SPI_FLASH_WriteEnable();

  /* Bulk Erase */ 
  /* Select the FLASH: Chip Select low */
  SPI_FLASH_CS_LOW();
  /* Send Bulk Erase instruction  */
  SPI_FLASH_SendByte(BE);
  /* Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();

  /* Wait the end of Flash writing */
  SPI_FLASH_WaitForWriteEnd();
}

/*******************************************************************************
* Function Name  : SPI_FLASH_PageWrite
* Description    : Writes more than one byte to the FLASH with a single WRITE
*                  cycle(Page WRITE sequence). The number of byte can't exceed
*                  the FLASH page size.
* Input          : - pBuffer : pointer to the buffer  containing the data to be 
*                    written to the FLASH.
*                  - WriteAddr : FLASH's internal address to write to.
*                  - NumByteToWrite : number of bytes to write to the FLASH,
*                    must be equal or less than "SPI_FLASH_PageSize" value. 
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_FLASH_PageWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)
{
  /* Enable the write access to the FLASH */
  SPI_FLASH_WriteEnable();
  
  /* Select the FLASH: Chip Select low */
  SPI_FLASH_CS_LOW();
  /* Send "Write to Memory " instruction */
  SPI_FLASH_SendByte(WRITE);
  /* Send WriteAddr high nibble address byte to write to */
  SPI_FLASH_SendByte((WriteAddr & 0xFF0000) >> 16);
  /* Send WriteAddr medium nibble address byte to write to */
  SPI_FLASH_SendByte((WriteAddr & 0xFF00) >> 8);  
  /* Send WriteAddr low nibble address byte to write to */
  SPI_FLASH_SendByte(WriteAddr & 0xFF);
  
  /* while there is data to be written on the FLASH */
  while(NumByteToWrite--) 
  {
    /* Send the current byte */
    SPI_FLASH_SendByte(*pBuffer);
    /* Point on the next byte to be written */
    pBuffer++; 
  }
  
  /* Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();
  
  /* Wait the end of Flash writing */
  SPI_FLASH_WaitForWriteEnd();
}

/*******************************************************************************
* Function Name  : SPI_FLASH_BufferWrite
* Description    : Writes block of data to the FLASH. In this function, the
*                  number of WRITE cycles are reduced, using Page WRITE sequence.
* Input          : - pBuffer : pointer to the buffer  containing the data to be 
*                    written to the FLASH.
*                  - WriteAddr : FLASH's internal address to write to.
*                  - NumByteToWrite : number of bytes to write to the FLASH.
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)
{
  u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0;

  Addr = WriteAddr % SPI_FLASH_PageSize;
  count = SPI_FLASH_PageSize - Addr;
  NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize;
  NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;
  
  if(Addr == 0) /* WriteAddr is SPI_FLASH_PageSize aligned  */
  {
    if(NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */
    {
      SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
    }
    else /* NumByteToWrite > SPI_FLASH_PageSize */ 
    {
      while(NumOfPage--)
      {
        SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
        WriteAddr +=  SPI_FLASH_PageSize;
        pBuffer += SPI_FLASH_PageSize;  
      }    
     
      SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
   }
  }
  else /* WriteAddr is not SPI_FLASH_PageSize aligned  */
  {
    if(NumOfPage== 0) /* NumByteToWrite < SPI_FLASH_PageSize */
    {
      if(NumOfSingle > count) /* (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize */
      {
        temp = NumOfSingle - count;
      
        SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
        WriteAddr +=  count;
        pBuffer += count; 
        
        SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp);
      }
      else
      {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美人妇做爰xxxⅹ性高电影| 蜜臀久久久久久久| 欧美日韩日日摸| 九九久久精品视频| 一区二区三区中文免费| 91精品在线麻豆| 91老司机福利 在线| 奇米色777欧美一区二区| 国产精品妹子av| 日韩手机在线导航| 色香蕉久久蜜桃| 国产剧情在线观看一区二区| 日韩电影在线免费| 亚洲欧美aⅴ...| 亚洲国产日韩a在线播放性色| 精品国产乱码久久久久久闺蜜| 色久综合一二码| 国产一区欧美日韩| 日本vs亚洲vs韩国一区三区二区| 亚洲视频在线观看一区| 久久久99精品免费观看| 精品裸体舞一区二区三区| 欧美日韩aaa| 色老汉一区二区三区| 99在线精品观看| 国产精品一二三| 精品亚洲porn| 蜜芽一区二区三区| 日韩精品1区2区3区| 亚洲第一福利视频在线| 一区二区三区四区av| 亚洲欧洲日韩av| 中文在线资源观看网站视频免费不卡 | 一区二区中文视频| 久久久精品tv| 国产亚洲一区字幕| 2欧美一区二区三区在线观看视频| 91精品国产综合久久久蜜臀粉嫩 | 日韩国产精品久久久久久亚洲| 伊人夜夜躁av伊人久久| 日韩毛片一二三区| 亚洲欧洲制服丝袜| 亚洲精品高清在线观看| 亚洲少妇中出一区| 亚洲精品高清在线| 亚洲一区二区三区自拍| 亚洲国产aⅴ天堂久久| 日韩成人午夜电影| 免费一级片91| 精品一区二区三区久久| 国产在线国偷精品产拍免费yy| 精彩视频一区二区| 国产一区二区三区免费看| 国产一区视频在线看| 国产91精品免费| 99精品在线免费| 日本精品一级二级| 在线成人小视频| 日韩限制级电影在线观看| 日韩欧美精品在线| 日韩av一区二区三区| 日本色综合中文字幕| 蜜桃精品视频在线观看| 国内精品伊人久久久久影院对白| 国产精品123| 色婷婷综合久久久| 欧美日韩国产美| 2017欧美狠狠色| 中文字幕在线不卡一区| 亚洲综合清纯丝袜自拍| 美女网站一区二区| 成人精品鲁一区一区二区| www.日本不卡| 欧美精品亚洲二区| 久久久亚洲国产美女国产盗摄| 国产精品不卡在线| 日韩黄色片在线观看| 国产原创一区二区| 色成年激情久久综合| 7777精品久久久大香线蕉 | 一区二区三区日本| 免播放器亚洲一区| 成人福利电影精品一区二区在线观看 | 亚洲同性gay激情无套| 日韩国产欧美三级| 成人va在线观看| 91麻豆精品91久久久久同性| 国产精品嫩草影院com| 亚洲大尺度视频在线观看| 国产老肥熟一区二区三区| 在线观看亚洲一区| 国产亚洲人成网站| 亚洲一卡二卡三卡四卡| 国产自产2019最新不卡| 色综合天天狠狠| 欧美成va人片在线观看| 一区二区三区日韩欧美| 国产精品 欧美精品| 在线成人av影院| 1000精品久久久久久久久| 老司机午夜精品| 91美女在线看| 久久一二三国产| 天天操天天色综合| 91在线播放网址| 久久这里都是精品| 日本aⅴ亚洲精品中文乱码| 99视频精品免费视频| 日韩一区二区电影| 亚洲综合久久av| 成人性生交大片免费看中文| 欧美一卡2卡3卡4卡| 亚洲综合色噜噜狠狠| 成人app软件下载大全免费| 日韩视频一区二区在线观看| 一区二区三区在线播放| 成人免费精品视频| 久久久久久综合| 蜜桃一区二区三区在线| 欧美日韩国产综合一区二区三区| 亚洲欧美一区二区在线观看| 国产精品1024| 国产亚洲午夜高清国产拍精品| 日本亚洲天堂网| 6080yy午夜一二三区久久| 亚洲一区二区精品3399| 色域天天综合网| 亚洲视频图片小说| 91无套直看片红桃| 综合久久久久久久| 久久伊99综合婷婷久久伊| 麻豆精品一区二区综合av| 3751色影院一区二区三区| 香蕉成人啪国产精品视频综合网| 欧美在线视频不卡| 亚洲一区二区三区美女| 欧美性色黄大片| 亚洲小说春色综合另类电影| 欧美色精品在线视频| 午夜久久久影院| 91精品国产91久久综合桃花 | 日韩理论在线观看| 91亚洲午夜精品久久久久久| 亚洲欧洲99久久| 欧美伊人久久大香线蕉综合69| 一区二区三区四区国产精品| 在线免费观看成人短视频| 亚洲成年人影院| 欧美一区二区三区不卡| 蜜桃视频在线观看一区二区| 精品免费一区二区三区| 国产成人夜色高潮福利影视| 久久精品视频一区二区| 成人黄色一级视频| 一区二区三区在线免费播放| 欧美色区777第一页| 老司机午夜精品| 国产精品无遮挡| 色婷婷久久99综合精品jk白丝| 亚洲在线观看免费| 制服丝袜国产精品| 精品一区二区精品| 国产精品网站在线播放| 欧洲av一区二区嗯嗯嗯啊| 日韩在线a电影| 久久一区二区视频| 91美女在线视频| 免费xxxx性欧美18vr| 欧美激情在线观看视频免费| 一本高清dvd不卡在线观看| 日韩黄色一级片| 国产视频911| 欧洲精品一区二区| 美女视频网站黄色亚洲| 欧美高清在线视频| 欧美在线观看你懂的| 捆绑紧缚一区二区三区视频| 国产精品久久一级| 欧美日韩成人高清| 粉嫩欧美一区二区三区高清影视| 一级女性全黄久久生活片免费| 日韩精品一区国产麻豆| av在线不卡观看免费观看| 日精品一区二区三区| 欧美激情资源网| 欧美日韩小视频| 成人午夜看片网址| 午夜欧美视频在线观看| 久久精品视频一区二区三区| 欧美丰满一区二区免费视频 | 日韩二区在线观看| 欧美激情一区二区三区四区| 欧美三级视频在线观看| 国产.精品.日韩.另类.中文.在线.播放| 日韩码欧中文字| 久久综合av免费| 欧美精品1区2区| 99riav久久精品riav| 国内一区二区在线| 丝袜美腿亚洲色图|