• FLASHSPI


    因为稍后要用到字库等,所以先把Flash弄了,使用SPI接口,神舟的2Mbyte,原子的6Mbyte,都是W25X系列。神舟真是小气的可以,搞个Flash和EEPROM一样大。

    与SD的读写byte一样。

    初始化之后读取Flash ID以此来判断是否初始化成功。

    主要是一些读写,擦除函数。主要用的神舟代码这次,有部分借鉴原子的

    初始化,读取ID,擦除,读写都OK了。

    FLASHSPI_CONFIG_H
     1 #ifndef __FLASHSPI_CONFIG_H
     2 #define __FLASHSPI_CONFIG_H
     3 //#include "sys.h"
     4 
     5 /**
     6   * @brief  SPI_FLASH SPI Interface pins
     7   */
     8 
     9 #define SPI_FLASH_SPI                           SPI1
    10 #define SPI_FLASH_SPI_CLK                       RCC_APB2Periph_SPI1
    11 #define SPI_FLASH_SPI_SCK_PIN                   GPIO_Pin_5                  /* PA.05 */
    12 #define SPI_FLASH_SPI_SCK_GPIO_PORT             GPIOA                       /* GPIOA */
    13 #define SPI_FLASH_SPI_SCK_GPIO_CLK              RCC_APB2Periph_GPIOA
    14 #define SPI_FLASH_SPI_MISO_PIN                  GPIO_Pin_6                  /* PA.06 */
    15 #define SPI_FLASH_SPI_MISO_GPIO_PORT            GPIOA                       /* GPIOA */
    16 #define SPI_FLASH_SPI_MISO_GPIO_CLK             RCC_APB2Periph_GPIOA
    17 #define SPI_FLASH_SPI_MOSI_PIN                  GPIO_Pin_7                  /* PA.07 */
    18 #define SPI_FLASH_SPI_MOSI_GPIO_PORT            GPIOA                       /* GPIOA */
    19 #define SPI_FLASH_SPI_MOSI_GPIO_CLK             RCC_APB2Periph_GPIOA
    20 #define SPI_FLASH_CS_PIN                        GPIO_Pin_9                  /* PB.09 */
    21 #define SPI_FLASH_CS_GPIO_PORT                  GPIOB                       /* GPIOD */
    22 #define SPI_FLASH_CS_GPIO_CLK                   RCC_APB2Periph_GPIOB
    23 
    24 #define SD_CS_PIN                         GPIO_Pin_11             /* PD.11 */
    25 #define SD_CS_GPIO_PORT                   GPIOD                   /* GPIOD */
    26 #define SD_CS_GPIO_CLK                    RCC_APB2Periph_GPIOD
    27 
    28 /* Private define ------------------------------------------------------------*/
    29 //W25X系列/Q系列芯片列表       
    30 //W25Q80 ID  0XEF13
    31 //W25Q16 ID  0XEF14
    32 //W25Q32 ID  0XEF15
    33 //W25Q32 ID  0XEF16    
    34 //指令 90h Manufacturer/Device ID (ID7-ID0)
    35 #define W25Q80     0XEF13     
    36 #define W25Q16     0XEF14
    37 #define W25Q32     0XEF15
    38 #define W25Q64     0XEF16
    39 //指令 9Fh JEDEC ID      (ID15-ID0)
    40 //#define W25Q80     0XEF3014     
    41 //#define W25Q16     0XEF3015
    42 //#define W25Q32     0XEF3016
    43 //#define W25Q64     0XEF3017
    44 
    45 #define W25X_WriteEnable        0x06 
    46 #define W25X_WriteDisable        0x04 
    47 #define W25X_ReadStatusReg        0x05 
    48 #define W25X_WriteStatusReg        0x01 
    49 #define W25X_ReadData            0x03 
    50 #define W25X_FastReadData        0x0B 
    51 #define W25X_FastReadDual        0x3B 
    52 #define W25X_PageProgram        0x02 
    53 #define W25X_BlockErase            0xD8 
    54 #define W25X_SectorErase        0x20 
    55 #define W25X_ChipErase            0xC7 
    56 #define W25X_PowerDown            0xB9 
    57 #define W25X_ReleasePowerDown    0xAB 
    58 #define W25X_DeviceID            0xAB 
    59 #define W25X_ManufactDeviceID    0x90 
    60 #define W25X_JedecDeviceID        0x9F 
    61 
    62 #define WIP_Flag                0x01  /* Write In Progress (WIP) flag */
    63 
    64 #define Dummy_Byte              0xFF//0xA5
    65 
    66 /* Private typedef -----------------------------------------------------------*/
    67 //#define SPI_FLASH_PageSize      4096
    68 #define SPI_FLASH_PageSize      256
    69 #define SPI_FLASH_PerWritePageSize      256
    70 
    71 /* Exported macro ------------------------------------------------------------*/
    72 /* Select SPI FLASH: Chip Select pin low  */
    73 #define SPI_FLASH_CS_LOW()       GPIO_ResetBits(SPI_FLASH_CS_GPIO_PORT, SPI_FLASH_CS_PIN)
    74 /* Deselect SPI FLASH: Chip Select pin high */
    75 #define SPI_FLASH_CS_HIGH()      GPIO_SetBits(SPI_FLASH_CS_GPIO_PORT, SPI_FLASH_CS_PIN)
    76 
    77 /*----- Low layer function -----*/
    78 u8 SPI_FLASH_ReadByte(void);
    79 u8 SPI_FLASH_SendByte(u8 byte);
    80 u16 SPI_FLASH_SendHalfWord(u16 HalfWord);
    81 void SPI_FLASH_WriteEnable(void);
    82 void SPI_FLASH_WriteDisable(void);
    83 void SPI_FLASH_WaitForWriteEnd(void);
    84 
    85 /* Exported functions ------------------------------------------------------- */
    86 /*----- High layer function -----*/
    87 void SPI_FLASH_Init(void);
    88 void SPI_Flash_PowerDown(void);
    89 void SPI_Flash_WAKEUP(void);
    90 void SPI_FLASH_SectorErase(u32 SectorAddr);
    91 void SPI_FLASH_ChipErase(void);
    92 void SPI_FLASH_PageWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite);
    93 void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite);
    94 void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead);
    95 void SPI_FLASH_StartReadSequence(u32 ReadAddr);
    96 u32  SPI_FLASH_ReadJedecID(void);
    97 u32  SPI_FLASH_ReadDeviceID(void);
    98 
    99 #endif
    spi_config.c
      1 #include "stm32f10x.h"
      2 #include "stm32f10x_gpio.h"
      3 #include "stm32f10x_rcc.h"
      4 #include "stm32f10x_rtc.h"
      5 #include "stm32f10x_spi.h"
      6 #include "flashspi_config.h"
      7 #include "spi_config.h"
      8 
      9 //Flash pin map:FlashCS-PB9 MISO-PA6 MOSI-PA7 SCK-PA5 SDCS-PD11
     10 void SPI_FLASH_Init(void)
     11 {
     12   SPI_InitTypeDef  SPI_InitStructure;
     13   GPIO_InitTypeDef GPIO_InitStructure;
     14 
     15   
     16   /* Enable SPI1 and GPIO clocks */
     17   /*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO, 
     18        SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO 
     19        and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */
     20   RCC_APB2PeriphClockCmd(SPI_FLASH_CS_GPIO_CLK | SPI_FLASH_SPI_MOSI_GPIO_CLK |
     21                          SPI_FLASH_SPI_MISO_GPIO_CLK | SPI_FLASH_SPI_SCK_GPIO_CLK |
     22                          RCC_APB2Periph_GPIOD, ENABLE);
     23 
     24   /* Disable SD CS  */
     25   GPIO_InitStructure.GPIO_Pin = SD_CS_PIN;
     26   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
     27   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     28   GPIO_Init(SD_CS_GPIO_PORT, &GPIO_InitStructure);
     29   GPIO_SetBits(SD_CS_GPIO_PORT, SD_CS_PIN);
     30 
     31   /*!< SPI_FLASH_SPI Periph clock enable */
     32   RCC_APB2PeriphClockCmd(SPI_FLASH_SPI_CLK, ENABLE);
     33   /*!< AFIO Periph clock enable */
     34   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
     35   /*!< Remap SPI3 Pins */
     36   //GPIO_PinRemapConfig(GPIO_Remap_SPI3,ENABLE);  
     37   
     38   /*!< Configure SPI_FLASH_SPI pins: SCK */
     39   GPIO_InitStructure.GPIO_Pin = SPI_FLASH_SPI_SCK_PIN;
     40   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     41   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
     42   GPIO_Init(SPI_FLASH_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
     43 
     44   /*!< Configure SPI_FLASH_SPI pins: MISO */
     45   GPIO_InitStructure.GPIO_Pin = SPI_FLASH_SPI_MISO_PIN;
     46   GPIO_Init(SPI_FLASH_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
     47 
     48   /*!< Configure SPI_FLASH_SPI pins: MOSI */
     49   GPIO_InitStructure.GPIO_Pin = SPI_FLASH_SPI_MOSI_PIN;
     50   GPIO_Init(SPI_FLASH_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
     51 
     52   /*!< Configure SPI_FLASH_SPI_CS_PIN pin: SPI_FLASH Card CS pin */
     53   GPIO_InitStructure.GPIO_Pin = SPI_FLASH_CS_PIN;
     54   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
     55   GPIO_Init(SPI_FLASH_CS_GPIO_PORT, &GPIO_InitStructure);
     56 
     57   /* Deselect the FLASH: Chip Select high */
     58   SPI_FLASH_CS_HIGH();
     59 
     60   /* SPI1 configuration */
     61   // W25X16: data input on the DIO pin is sampled on the rising edge of the CLK. 
     62   // Data on the DO and DIO pins are clocked out on the falling edge of CLK.
     63   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
     64   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
     65   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
     66   SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
     67   SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
     68   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
     69   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
     70   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
     71   SPI_InitStructure.SPI_CRCPolynomial = 7;
     72   SPI_Init(SPI1, &SPI_InitStructure);
     73 
     74   /* Enable SPI1  */
     75   SPI_Cmd(SPI1, ENABLE);
     76 }
     77 
     78 u8 SPI_FLASH_ReadByte(void)
     79 {
     80     return  SPI1_ReadWriteByte(0xFF);
     81 }
     82 
     83 u8 SPI_FLASH_SendByte(u8 byte)
     84 {
     85     return  SPI1_ReadWriteByte(byte);
     86 }
     87 
     88 /*******************************************************************************
     89 * Function Name  : SPI_FLASH_WriteEnable
     90 * Description    : Enables the write access to the FLASH.
     91 * Input          : None
     92 * Output         : None
     93 * Return         : None
     94 *******************************************************************************/
     95 void SPI_FLASH_WriteEnable(void)
     96 {
     97   /* Select the FLASH: Chip Select low */
     98   SPI_FLASH_CS_LOW();
     99 
    100   /* Send "Write Enable" instruction */
    101   SPI_FLASH_SendByte(W25X_WriteEnable);
    102 
    103   /* Deselect the FLASH: Chip Select high */
    104   SPI_FLASH_CS_HIGH();
    105 }
    106 
    107 /*******************************************************************************
    108 * Function Name  : SPI_FLASH_WriteDisable
    109 * Description    : Disables the write access to the FLASH.
    110 * Input          : None
    111 * Output         : None
    112 * Return         : None
    113 *******************************************************************************/
    114 void SPI_FLASH_WriteDisable(void)
    115 {
    116   /* Select the FLASH: Chip Select low */
    117   SPI_FLASH_CS_LOW();
    118 
    119   /* Send "Write Enable" instruction */
    120   SPI_FLASH_SendByte(W25X_WriteDisable);
    121 
    122   /* Deselect the FLASH: Chip Select high */
    123   SPI_FLASH_CS_HIGH();
    124 }
    125 
    126 /*******************************************************************************
    127 * Function Name  : SPI_FLASH_WaitForWriteEnd
    128 * Description    : Polls the status of the Write In Progress (WIP) flag in the
    129 *                  FLASH's status  register  and  loop  until write  opertaion
    130 *                  has completed.
    131 * Input          : None
    132 * Output         : None
    133 * Return         : None
    134 *******************************************************************************/
    135 void SPI_FLASH_WaitForWriteEnd(void)
    136 {
    137   u8 FLASH_Status = 0;
    138 
    139   /* Select the FLASH: Chip Select low */
    140   SPI_FLASH_CS_LOW();
    141 
    142   /* Send "Read Status Register" instruction */
    143   SPI_FLASH_SendByte(W25X_ReadStatusReg);
    144 
    145   /* Loop as long as the memory is busy with a write cycle */
    146   do
    147   {
    148     /* Send a dummy byte to generate the clock needed by the FLASH
    149     and put the value of the status register in FLASH_Status variable */
    150     FLASH_Status = SPI_FLASH_SendByte(Dummy_Byte);
    151 
    152   }
    153   while ((FLASH_Status & WIP_Flag) == SET); /* Write in progress */
    154 
    155   /* Deselect the FLASH: Chip Select high */
    156   SPI_FLASH_CS_HIGH();
    157 }
    158 
    159 //进入掉电模式
    160 void SPI_Flash_PowerDown(void)   
    161 { 
    162   /* Select the FLASH: Chip Select low */
    163   SPI_FLASH_CS_LOW();
    164 
    165   /* Send "Power Down" instruction */
    166   SPI_FLASH_SendByte(W25X_PowerDown);
    167 
    168   /* Deselect the FLASH: Chip Select high */
    169   SPI_FLASH_CS_HIGH();
    170 }   
    171 
    172 //唤醒
    173 void SPI_Flash_WAKEUP(void)   
    174 {
    175   /* Select the FLASH: Chip Select low */
    176   SPI_FLASH_CS_LOW();
    177 
    178   /* Send "Power Down" instruction */
    179   SPI_FLASH_SendByte(W25X_ReleasePowerDown);
    180 
    181   /* Deselect the FLASH: Chip Select high */
    182   SPI_FLASH_CS_HIGH();                             //等待TRES1
    183 }   
    184 
    185 /*******************************************************************************
    186 * Function Name  : SPI_FLASH_SectorErase
    187 * Description    : Erases the specified FLASH sector.
    188 * Input          : SectorAddr: address of the sector to erase.
    189 * Output         : None
    190 * Return         : None
    191 *******************************************************************************/
    192 void SPI_FLASH_SectorErase(u32 SectorAddr)
    193 {
    194   /* Send write enable instruction */
    195   SPI_FLASH_WriteEnable();
    196 
    197   /* Sector Erase */
    198   /* Select the FLASH: Chip Select low */
    199   SPI_FLASH_CS_LOW();
    200   /* Send Sector Erase instruction */
    201   SPI_FLASH_SendByte(W25X_SectorErase);
    202   /* Send SectorAddr high nibble address byte */
    203   SPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16);
    204   /* Send SectorAddr medium nibble address byte */
    205   SPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8);
    206   /* Send SectorAddr low nibble address byte */
    207   SPI_FLASH_SendByte(SectorAddr & 0xFF);
    208   /* Deselect the FLASH: Chip Select high */
    209   SPI_FLASH_CS_HIGH();
    210 
    211   /* Wait the end of Flash writing */
    212   SPI_FLASH_WaitForWriteEnd();
    213 }
    214 
    215 /*******************************************************************************
    216 * Function Name  : SPI_FLASH_BulkErase
    217 * Description    : Erases the entire FLASH.
    218 * Input          : None
    219 * Output         : None
    220 * Return         : None
    221 *******************************************************************************/
    222 void SPI_FLASH_ChipErase(void)
    223 {
    224   /* Send write enable instruction */
    225   SPI_FLASH_WriteEnable();
    226 
    227   /* Bulk Erase */
    228   /* Select the FLASH: Chip Select low */
    229   SPI_FLASH_CS_LOW();
    230   /* Send Bulk Erase instruction  */
    231   SPI_FLASH_SendByte(W25X_ChipErase);
    232   /* Deselect the FLASH: Chip Select high */
    233   SPI_FLASH_CS_HIGH();
    234 
    235   /* Wait the end of Flash writing */
    236   SPI_FLASH_WaitForWriteEnd();
    237 }
    238 
    239 /*******************************************************************************
    240 * Function Name  : SPI_FLASH_PageWrite
    241 * Description    : Writes more than one byte to the FLASH with a single WRITE
    242 *                  cycle(Page WRITE sequence). The number of byte can't exceed
    243 *                  the FLASH page size.
    244 * Input          : - pBuffer : pointer to the buffer  containing the data to be
    245 *                    written to the FLASH.
    246 *                  - WriteAddr : FLASH's internal address to write to.
    247 *                  - NumByteToWrite : number of bytes to write to the FLASH,
    248 *                    must be equal or less than "SPI_FLASH_PageSize" value.
    249 * Output         : None
    250 * Return         : None
    251 *******************************************************************************/
    252 void SPI_FLASH_PageWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)
    253 {
    254   /* Enable the write access to the FLASH */
    255   SPI_FLASH_WriteEnable();
    256 
    257   /* Select the FLASH: Chip Select low */
    258   SPI_FLASH_CS_LOW();
    259   /* Send "Write to Memory " instruction */
    260   SPI_FLASH_SendByte(W25X_PageProgram);
    261   /* Send WriteAddr high nibble address byte to write to */
    262   SPI_FLASH_SendByte((WriteAddr & 0xFF0000) >> 16);
    263   /* Send WriteAddr medium nibble address byte to write to */
    264   SPI_FLASH_SendByte((WriteAddr & 0xFF00) >> 8);
    265   /* Send WriteAddr low nibble address byte to write to */
    266   SPI_FLASH_SendByte(WriteAddr & 0xFF);
    267 
    268   if(NumByteToWrite > SPI_FLASH_PerWritePageSize)
    269   {
    270      NumByteToWrite = SPI_FLASH_PerWritePageSize;
    271      printf("\n\r Err: SPI_FLASH_PageWrite too large!");
    272   }
    273 
    274   /* while there is data to be written on the FLASH */
    275   while (NumByteToWrite--)
    276   {
    277     /* Send the current byte */
    278     SPI_FLASH_SendByte(*pBuffer);
    279     /* Point on the next byte to be written */
    280     pBuffer++;
    281   }
    282 
    283   /* Deselect the FLASH: Chip Select high */
    284   SPI_FLASH_CS_HIGH();
    285 
    286   /* Wait the end of Flash writing */
    287   SPI_FLASH_WaitForWriteEnd();
    288 }
    289 
    290 /*******************************************************************************
    291 * Function Name  : SPI_FLASH_BufferWrite
    292 * Description    : Writes block of data to the FLASH. In this function, the
    293 *                  number of WRITE cycles are reduced, using Page WRITE sequence.
    294 * Input          : - pBuffer : pointer to the buffer  containing the data to be
    295 *                    written to the FLASH.
    296 *                  - WriteAddr : FLASH's internal address to write to.
    297 *                  - NumByteToWrite : number of bytes to write to the FLASH.
    298 * Output         : None
    299 * Return         : None
    300 *******************************************************************************/
    301 void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)
    302 {
    303   u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0;
    304 
    305   Addr = WriteAddr % SPI_FLASH_PageSize;
    306   count = SPI_FLASH_PageSize - Addr;
    307   NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize;
    308   NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;
    309 
    310   if (Addr == 0) /* WriteAddr is SPI_FLASH_PageSize aligned  */
    311   {
    312     if (NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */
    313     {
    314       SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
    315     }
    316     else /* NumByteToWrite > SPI_FLASH_PageSize */
    317     {
    318       while (NumOfPage--)
    319       {
    320         SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
    321         WriteAddr +=  SPI_FLASH_PageSize;
    322         pBuffer += SPI_FLASH_PageSize;
    323       }
    324 
    325       SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
    326     }
    327   }
    328   else /* WriteAddr is not SPI_FLASH_PageSize aligned  */
    329   {
    330     if (NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */
    331     {
    332       if (NumOfSingle > count) /* (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize */
    333       {
    334         temp = NumOfSingle - count;
    335 
    336         SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
    337         WriteAddr +=  count;
    338         pBuffer += count;
    339 
    340         SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp);
    341       }
    342       else
    343       {
    344         SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
    345       }
    346     }
    347     else /* NumByteToWrite > SPI_FLASH_PageSize */
    348     {
    349       NumByteToWrite -= count;
    350       NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize;
    351       NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;
    352 
    353       SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
    354       WriteAddr +=  count;
    355       pBuffer += count;
    356 
    357       while (NumOfPage--)
    358       {
    359         SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
    360         WriteAddr +=  SPI_FLASH_PageSize;
    361         pBuffer += SPI_FLASH_PageSize;
    362       }
    363 
    364       if (NumOfSingle != 0)
    365       {
    366         SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
    367       }
    368     }
    369   }
    370 }
    371 
    372 /*******************************************************************************
    373 * Function Name  : SPI_FLASH_BufferRead
    374 * Description    : Reads a block of data from the FLASH.
    375 * Input          : - pBuffer : pointer to the buffer that receives the data read
    376 *                    from the FLASH.
    377 *                  - ReadAddr : FLASH's internal address to read from.
    378 *                  - NumByteToRead : number of bytes to read from the FLASH.
    379 * Output         : None
    380 * Return         : None
    381 *******************************************************************************/
    382 void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead)
    383 {
    384   /* Select the FLASH: Chip Select low */
    385   SPI_FLASH_CS_LOW();
    386 
    387   /* Send "Read from Memory " instruction */
    388   SPI_FLASH_SendByte(W25X_ReadData);
    389 
    390   /* Send ReadAddr high nibble address byte to read from */
    391   SPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16);
    392   /* Send ReadAddr medium nibble address byte to read from */
    393   SPI_FLASH_SendByte((ReadAddr& 0xFF00) >> 8);
    394   /* Send ReadAddr low nibble address byte to read from */
    395   SPI_FLASH_SendByte(ReadAddr & 0xFF);
    396 
    397   while (NumByteToRead--) /* while there is data to be read */
    398   {
    399     /* Read a byte from the FLASH */
    400     *pBuffer = SPI_FLASH_SendByte(Dummy_Byte);
    401     /* Point to the next location where the byte read will be saved */
    402     pBuffer++;
    403   }
    404 
    405   /* Deselect the FLASH: Chip Select high */
    406   SPI_FLASH_CS_HIGH();
    407 }
    408 
    409 /*******************************************************************************
    410 * Function Name  : SPI_FLASH_StartReadSequence
    411 * Description    : Initiates a read data byte (READ) sequence from the Flash.
    412 *                  This is done by driving the /CS line low to select the device,
    413 *                  then the READ instruction is transmitted followed by 3 bytes
    414 *                  address. This function exit and keep the /CS line low, so the
    415 *                  Flash still being selected. With this technique the whole
    416 *                  content of the Flash is read with a single READ instruction.
    417 * Input          : - ReadAddr : FLASH's internal address to read from.
    418 * Output         : None
    419 * Return         : None
    420 *******************************************************************************/
    421 void SPI_FLASH_StartReadSequence(u32 ReadAddr)
    422 {
    423   /* Select the FLASH: Chip Select low */
    424   SPI_FLASH_CS_LOW();
    425 
    426   /* Send "Read from Memory " instruction */
    427   SPI_FLASH_SendByte(W25X_ReadData);
    428 
    429   /* Send the 24-bit address of the address to read from -----------------------*/
    430   /* Send ReadAddr high nibble address byte */
    431   SPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16);
    432   /* Send ReadAddr medium nibble address byte */
    433   SPI_FLASH_SendByte((ReadAddr& 0xFF00) >> 8);
    434   /* Send ReadAddr low nibble address byte */
    435   SPI_FLASH_SendByte(ReadAddr & 0xFF);
    436 }
    437 
    438 /*******************************************************************************
    439 * Function Name  : SPI_FLASH_ReadJedecID
    440 * Description    : Reads FLASH identification.
    441 * Input          : None
    442 * Output         : None
    443 * Return         : FLASH identification
    444 *******************************************************************************/
    445 u32 SPI_FLASH_ReadJedecID(void)
    446 {
    447   u32 Temp = 0, Temp0 = 0, Temp1 = 0, Temp2 = 0;
    448 
    449   /* Select the FLASH: Chip Select low */
    450   SPI_FLASH_CS_LOW();
    451 
    452   /* Send "RDID " instruction */
    453   SPI_FLASH_SendByte(W25X_JedecDeviceID);
    454 
    455   /* Read a byte from the FLASH */
    456   Temp0 = SPI_FLASH_SendByte(Dummy_Byte);
    457 
    458   /* Read a byte from the FLASH */
    459   Temp1 = SPI_FLASH_SendByte(Dummy_Byte);
    460 
    461   /* Read a byte from the FLASH */
    462   Temp2 = SPI_FLASH_SendByte(Dummy_Byte);
    463 
    464   /* Deselect the FLASH: Chip Select high */
    465   SPI_FLASH_CS_HIGH();
    466 
    467   Temp = (Temp0 << 16) | (Temp1 << 8) | Temp2;
    468 
    469   return Temp;
    470 }
    471 /*******************************************************************************
    472 * Function Name  : SPI_FLASH_ReadID
    473 * Description    : Reads FLASH identification.
    474 * Input          : None
    475 * Output         : None
    476 * Return         : FLASH identification
    477 *******************************************************************************/
    478 u32 SPI_FLASH_ReadDeviceID(void)
    479 {
    480   u32 Temp = 0;
    481 
    482   /* Select the FLASH: Chip Select low */
    483   SPI_FLASH_CS_LOW();
    484 
    485   /* Send "RDID " instruction */
    486   SPI_FLASH_SendByte(W25X_DeviceID);
    487   SPI_FLASH_SendByte(Dummy_Byte);
    488   SPI_FLASH_SendByte(Dummy_Byte);
    489   SPI_FLASH_SendByte(Dummy_Byte);
    490   
    491   /* Read a byte from the FLASH */
    492   Temp = SPI_FLASH_SendByte(Dummy_Byte);
    493 
    494   /* Deselect the FLASH: Chip Select high */
    495   SPI_FLASH_CS_HIGH();
    496 
    497   return Temp;
    498 }

         SPI_FLASH_Init();
      printf("\r\n SPI_FLASH_ReadJedecID:%x \n\r",SPI_FLASH_ReadJedecID());
      printf("\r\n SPI_FLASH_ReadDeviceID:%x \n\r",SPI_FLASH_ReadDeviceID());
      SPI_FLASH_SectorErase(0);
      for(sd_size=0;sd_size<512;sd_size++)buf[sd_size]=0x55;
            SPI_FLASH_BufferWrite(buf,0,500);
            SPI_FLASH_BufferRead(buf,0,512);
            for(sd_size=0;sd_size<512;sd_size++)printf("%x ",buf[sd_size]);//打印0扇区数据

  • 相关阅读:
    chrome浏览器(block)屏蔽http文件下载,如何解除?
    node项目无法编译
    Google的60款开源项目
    王兴:真正的高手,都在苦练基本功
    Flink SQL 写 hudi
    Python3 bytes函数
    Python中Base64编码与解码
    Python 类的__setitem__(),__getitem()__,__delitem__()方法
    Python queue(队列)
    Ubuntu20.04设置远程桌面连接
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/3049257.html
Copyright © 2020-2023  润新知