aboutsummaryrefslogtreecommitdiff
path: root/src/sample/io_sample/SPI/Interrupt/io_spi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sample/io_sample/SPI/Interrupt/io_spi.c')
-rw-r--r--src/sample/io_sample/SPI/Interrupt/io_spi.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/sample/io_sample/SPI/Interrupt/io_spi.c b/src/sample/io_sample/SPI/Interrupt/io_spi.c
new file mode 100644
index 0000000..fb96efc
--- /dev/null
+++ b/src/sample/io_sample/SPI/Interrupt/io_spi.c
@@ -0,0 +1,165 @@
+/**
+*********************************************************************************************************
+* Copyright(c) 2018, Realtek Semiconductor Corporation. All rights reserved.
+*********************************************************************************************************
+* @file io_spi.c
+* @brief This file provides demo code of spi master.
+ GD25Q128E is slave.
+ Read the chip id of GD25Q128E.
+* @details
+* @author yuan
+* @date 2018-12-07
+* @version v1.0
+*********************************************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "io_spi.h"
+
+#include "spi_flash.h"
+#include "app_task.h"
+
+/* Globals ------------------------------------------------------------------*/
+
+uint8_t flash_id_type = 0;
+
+/**
+ * @brief Initialization of pinmux settings and pad settings.
+ * @param No parameter.
+ * @return void
+*/
+void board_spi_init(void)
+{
+ Pad_Config(SPI0_SCK_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_ENABLE, PAD_OUT_HIGH);
+ Pad_Config(SPI0_MOSI_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_ENABLE, PAD_OUT_HIGH);
+ Pad_Config(SPI0_MISO_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_ENABLE, PAD_OUT_HIGH);
+ Pad_Config(SPI0_CS_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_ENABLE, PAD_OUT_HIGH);
+
+ Pinmux_Deinit(P4_0);
+ Pinmux_Deinit(P4_1);
+ Pinmux_Deinit(P4_2);
+ Pinmux_Deinit(P4_3);
+
+ Pinmux_Config(SPI0_SCK_PIN, SPI0_CLK_MASTER);
+ Pinmux_Config(SPI0_MOSI_PIN, SPI0_MO_MASTER);
+ Pinmux_Config(SPI0_MISO_PIN, SPI0_MI_MASTER);
+ Pinmux_Config(SPI0_CS_PIN, SPI0_SS_N_0_MASTER);
+}
+
+/**
+ * @brief Initialize spi peripheral.
+ * @param No parameter.
+ * @return void
+ */
+void driver_spi_init(void)
+{
+ RCC_PeriphClockCmd(APBPeriph_SPI0, APBPeriph_SPI0_CLOCK, ENABLE);
+
+ SPI_InitTypeDef SPI_InitStruct;
+ SPI_StructInit(&SPI_InitStruct);
+
+ SPI_InitStruct.SPI_Direction = SPI_Direction_EEPROM;
+ SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
+ SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
+ SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;
+ SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;
+ SPI_InitStruct.SPI_BaudRatePrescaler = 50;
+ /* SPI_Direction_EEPROM mode read data length. */
+ SPI_InitStruct.SPI_RxThresholdLevel = 1 - 1;/* Flash id length = 3*/
+ SPI_InitStruct.SPI_NDF = 1 - 1;/* Flash id length = 3*/
+ /* cause SPI_INT_RXF interrupt if data length in receive FIFO >= SPI_RxThresholdLevel + 1*/
+ SPI_InitStruct.SPI_FrameFormat = SPI_Frame_Motorola;
+
+ SPI_Init(SPI0, &SPI_InitStruct);
+ SPI_Cmd(SPI0, ENABLE);
+
+ /* detect receive data */
+ SPI_INTConfig(SPI0, SPI_INT_RXF, ENABLE);
+ /* Config SPI interrupt */
+ NVIC_InitTypeDef NVIC_InitStruct;
+ NVIC_InitStruct.NVIC_IRQChannel = SPI0_IRQn;
+ NVIC_InitStruct.NVIC_IRQChannelPriority = 3;
+ NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
+ NVIC_Init(&NVIC_InitStruct);
+}
+
+/**
+ * @brief Demo code of operation about spi.
+ * @param No parameter.
+ * @return void
+*/
+void spi_demo(void)
+{
+ uint8_t id[10];
+ APP_PRINT_INFO0("[io_spi] spi_demo: Read flash id.");
+ spi_flash_read_id(DEVICE_ID, id);
+ flash_id_type = 0;
+}
+
+/**
+ * @brief Handle i2c data function.
+ * @param No parameter.
+ * @return void
+ */
+void io_spi_handle_msg(T_IO_MSG *io_spi_msg)
+{
+ uint8_t *p_buf = io_spi_msg->u.buf;
+ uint8_t data_Length = p_buf[0];
+ APP_PRINT_INFO2("[io_spi] io_spi_handle_msg: data_Length = %d, data = %b ", data_Length,
+ TRACE_BINARY(data_Length, &p_buf[1]));
+ uint8_t id[1];
+ flash_id_type++;
+ if (flash_id_type < 3)
+ {
+ spi_flash_read_id((Flash_ID_Type)flash_id_type, id);
+ }
+}
+
+/**
+ * @brief Handle i2c data function.
+ * @param No parameter.
+ * @return void
+ */
+void io_handle_spi_msg(T_IO_MSG *io_spi_msg)
+{
+ io_spi_handle_msg(io_spi_msg);
+}
+
+
+/**
+ * @brief SPI0 interrupt handle function.
+ * @param None.
+ * @return None.
+ */
+void SPI0_Handler(void)
+{
+ volatile uint8_t data_len = 0;
+ volatile uint8_t SPI_ReadINTBuf[70] = {0};
+
+ if (SPI_GetINTStatus(SPI0, SPI_INT_RXF) == SET)
+ {
+ SPI_ClearINTPendingBit(SPI0, SPI_INT_RXF);
+
+ while (SPI_GetRxFIFOLen(SPI0) < Flash_ID_Length);
+ data_len = SPI_GetRxFIFOLen(SPI0);
+ Flash_Data[0] = data_len;
+
+ for (uint8_t i = 0; i < data_len; i++)
+ {
+ /* Must read all data in receive FIFO , otherwise cause SPI_INT_RXF interrupt again. */
+ Flash_Data[1 + i] = SPI_ReceiveData(SPI0);
+ }
+
+ T_IO_MSG int_spi_msg;
+ int_spi_msg.type = IO_MSG_TYPE_SPI;
+ int_spi_msg.subtype = 0;
+ int_spi_msg.u.buf = (void *)(Flash_Data);
+ if (false == app_send_msg_to_apptask(&int_spi_msg))
+ {
+ APP_PRINT_ERROR0("[io_spi] SPI0_Handler: Send int_spi_msg failed!");
+ SPI_ClearINTPendingBit(SPI0, SPI_INT_RXF);
+ //Add user code here!
+ return;
+ }
+ }
+}