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扇区数据

原文地址:https://www.cnblogs.com/wwjdwy/p/3049257.html