aboutsummaryrefslogtreecommitdiff
path: root/src/sample/io_sample/SPI/Polling_fullduplex/spi_flash.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sample/io_sample/SPI/Polling_fullduplex/spi_flash.c')
-rw-r--r--src/sample/io_sample/SPI/Polling_fullduplex/spi_flash.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/sample/io_sample/SPI/Polling_fullduplex/spi_flash.c b/src/sample/io_sample/SPI/Polling_fullduplex/spi_flash.c
new file mode 100644
index 0000000..854a5f4
--- /dev/null
+++ b/src/sample/io_sample/SPI/Polling_fullduplex/spi_flash.c
@@ -0,0 +1,87 @@
+/**
+*********************************************************************************************************
+* Copyright(c) 2018, Realtek Semiconductor Corporation. All rights reserved.
+*********************************************************************************************************
+* @file spi_flash.c
+* @brief This file provides demo code of adc continuous mode.
+* @details
+* @author yuan
+* @date 2019-07-03
+* @version v1.0
+*********************************************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "spi_flash.h"
+#include "board.h"
+
+/**
+ * @brief Read spi flash(gd25q128e) id.
+ * @param Flash_ID_Type.
+ * @return void
+ */
+void spi_flash_read_id(Flash_ID_Type vFlashIdType, uint8_t *pFlashId)
+{
+ uint8_t send_buf[4] = {SPI_FLASH_JEDEC_ID, 0, 0, 0};
+ uint8_t recv_len = 3;
+
+ switch (vFlashIdType)
+ {
+ case DEVICE_ID:
+ send_buf[0] = SPI_FLASH_DEVICE_ID;
+ recv_len = 4 + 1;
+ break;
+ case MF_DEVICE_ID:
+ send_buf[0] = SPI_FLASH_MANU_ID;
+ recv_len = 5 + 1;
+ break;
+ case JEDEC_ID:
+ send_buf[0] = SPI_FLASH_JEDEC_ID;
+ recv_len = 3 + 1;
+ break;
+ default:
+ return;
+ }
+ *pFlashId++ = recv_len;
+
+ SPI_SendBuffer(FLASH_SPI, send_buf, recv_len);
+ while (recv_len--)
+ {
+ while (RESET == SPI_GetFlagState(FLASH_SPI, SPI_FLAG_RFNE));
+ *pFlashId++ = SPI_ReceiveData(FLASH_SPI);
+ }
+}
+
+void spi_flash_read(uint8_t vReadCmd, uint32_t vReadAddr, uint8_t *pBuffer, uint16_t vLength)
+{
+ uint8_t send_buf[10] = {0};
+ uint8_t send_len = 0;
+ uint16_t recv_len = 0;
+
+ if (SPI_FLASH_READ_DATA == vReadCmd)
+ {
+ send_len = 4;
+ }
+ else if (SPI_FLASH_FAST_READ == vReadCmd)
+ {
+ send_len = 5;
+ }
+ send_buf[0] = vReadCmd;
+ send_buf[1] = (vReadAddr >> 16) & 0xFF;
+ send_buf[2] = (vReadAddr >> 8) & 0xFF;
+ send_buf[3] = (vReadAddr) & 0xFF;
+
+ SPI_SendBuffer(FLASH_SPI, send_buf, send_len);
+ recv_len = vLength + send_len;
+ while (recv_len--)
+ {
+ SPI_SendBuffer(FLASH_SPI, &send_buf[9], 1);
+ while (SPI_GetFlagState(FLASH_SPI, SPI_FLAG_RFNE) == RESET);
+ *pBuffer++ = SPI_ReceiveData(FLASH_SPI);
+ }
+ SPI_SetReadLen(FLASH_SPI, 1);
+}
+
+
+
+