From 8ef5f9aef5d5a9b5934c829714ab9d210e538f06 Mon Sep 17 00:00:00 2001 From: fypeng_bj Date: Wed, 7 Jun 2023 17:26:06 +0800 Subject: [PATCH] [Add] Add spi_slave hardware library and spi vscode file. --- cpu/soc-x2600/include/ssi_slave.h | 329 +++++ cpu/soc-x2600/include/x2600.h | 4 + .../include/x2600_hal_ssi_slave.h | 583 +++++++++ drivers/drivers-x2600/src/x2600_hal_pdma.c | 2 +- .../drivers-x2600/src/x2600_hal_ssi_slave.c | 1070 +++++++++++++++++ .../.vscode/cmake-kits.json | 18 + .../spi_fullduplex_dma/.vscode/launch.json | 55 + .../spi_fullduplex_dma/.vscode/settings.json | 8 + .../spi/spi_fullduplex_dma/.vscode/tasks.json | 12 + .../include/x2600_hal_conf.h | 43 +- .../spi_fullduplex_it/.vscode/cmake-kits.json | 18 + .../spi/spi_fullduplex_it/.vscode/launch.json | 55 + .../spi_fullduplex_it/.vscode/settings.json | 8 + .../spi/spi_fullduplex_it/.vscode/tasks.json | 12 + .../include/x2600_hal_conf.h | 43 +- .../.vscode/cmake-kits.json | 18 + .../.vscode/launch.json | 55 + .../.vscode/settings.json | 8 + .../spi_fullduplex_polling/.vscode/tasks.json | 12 + .../include/x2600_hal_conf.h | 43 +- .../spi_slave_dma/.vscode/cmake-kits.json | 18 + .../spi_slave_dma/.vscode/launch.json | 55 + .../spi_slave_dma/.vscode/settings.json | 8 + .../spi_slave_dma/.vscode/tasks.json | 12 + .../spi_slave/spi_slave_dma/CMakeLists.txt | 111 ++ .../Examples/spi_slave/spi_slave_dma/Makefile | 176 +++ .../include/board_eth_phy_conf.h | 75 ++ .../spi_slave_dma/include/x2600_hal_conf.h | 147 +++ .../spi_slave_dma/include/x2600_sysclk_conf.h | 68 ++ .../Examples/spi_slave/spi_slave_dma/main.c | 170 +++ .../spi_slave/spi_slave_dma/riscv32-gcc.cmake | 18 + .../spi_slave_it/.vscode/cmake-kits.json | 18 + .../spi_slave_it/.vscode/launch.json | 55 + .../spi_slave_it/.vscode/settings.json | 8 + .../spi_slave/spi_slave_it/.vscode/tasks.json | 12 + .../spi_slave/spi_slave_it/CMakeLists.txt | 111 ++ .../Examples/spi_slave/spi_slave_it/Makefile | 176 +++ .../spi_slave_it/include/board_eth_phy_conf.h | 75 ++ .../spi_slave_it/include/x2600_hal_conf.h | 147 +++ .../spi_slave_it/include/x2600_sysclk_conf.h | 68 ++ .../Examples/spi_slave/spi_slave_it/main.c | 105 ++ .../spi_slave/spi_slave_it/riscv32-gcc.cmake | 18 + 42 files changed, 4028 insertions(+), 19 deletions(-) create mode 100644 cpu/soc-x2600/include/ssi_slave.h create mode 100644 drivers/drivers-x2600/include/x2600_hal_ssi_slave.h create mode 100644 drivers/drivers-x2600/src/x2600_hal_ssi_slave.c create mode 100644 projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/cmake-kits.json create mode 100644 projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/launch.json create mode 100644 projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/settings.json create mode 100644 projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/tasks.json create mode 100644 projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/cmake-kits.json create mode 100644 projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/launch.json create mode 100644 projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/settings.json create mode 100644 projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/tasks.json create mode 100644 projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/cmake-kits.json create mode 100644 projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/launch.json create mode 100644 projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/settings.json create mode 100644 projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/tasks.json create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/cmake-kits.json create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/launch.json create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/settings.json create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/tasks.json create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_dma/CMakeLists.txt create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_dma/Makefile create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_dma/include/board_eth_phy_conf.h create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_dma/include/x2600_hal_conf.h create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_dma/include/x2600_sysclk_conf.h create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_dma/main.c create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_dma/riscv32-gcc.cmake create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/cmake-kits.json create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/launch.json create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/settings.json create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/tasks.json create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_it/CMakeLists.txt create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_it/Makefile create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_it/include/board_eth_phy_conf.h create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_it/include/x2600_hal_conf.h create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_it/include/x2600_sysclk_conf.h create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_it/main.c create mode 100644 projects/x2660-halley/Examples/spi_slave/spi_slave_it/riscv32-gcc.cmake diff --git a/cpu/soc-x2600/include/ssi_slave.h b/cpu/soc-x2600/include/ssi_slave.h new file mode 100644 index 00000000..c1ee244c --- /dev/null +++ b/cpu/soc-x2600/include/ssi_slave.h @@ -0,0 +1,329 @@ +#ifndef __REG_SSI_SLAVE_H__ +#define __REG_SSI_SLAVE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * @defgroup group_SSI_SLAVE SSI_SLAVE控制器 + * @{ + */ + +/** + * @addtogroup g_SSI_SLAVE_reg SSI_SLAVE 寄存器定义 + * @{ + */ +/** +* @brief Registers for ssi_slave +*/ +typedef struct { + ////TODO, 添加寄存器Reserved,填充地址空间 + __IO unsigned long CTRLR; /*!< Control register ,RW, 0x00 */ + unsigned long RESERVED_0x4[1]; /*!< Reserved Memory Area start from 0x4 to 0x8*/ + __IO unsigned long SSIENR; /*!< Enable register ,RW, 0x08 */ + __IO unsigned long MWCR; /*!< Microwire Control register ,RW, 0x0C */ + unsigned long RESERVED_0x10[2]; /*!< Reserved Memory Area start from 0x10 to 0x18*/ + __IO unsigned long TXFTLR; /*!< Transmit FIFO Threshold Level register,RW, 0x18 */ + __IO unsigned long RXFTLR; /*!< Receive FIFO Threshold Level register,RW, 0x1C */ + __I unsigned long TXFLR; /*!< Transmit FIFO Level Register , R, 0x20 */ + __I unsigned long RXFLR; /*!< Receive FIFO Level Register , R, 0x24 */ + __I unsigned long SR; /*!< Status Register , R, 0x28 */ + __IO unsigned long IMR; /*!< Interrupt Mask Register ,RW, 0x2C */ + __I unsigned long ISR; /*!< Interrupt Status Register , R, 0x30 */ + __I unsigned long RISR; /*!< Raw Interrupt Status Register , R, 0x34 */ + __I unsigned long TXOICR; /*!< Transmit FIFO Overflow Interrupt Clear Register, R, 0x38 */ + __I unsigned long RXOICR; /*!< Receive FIFO Overflow Interrupt Clear Register, R, 0x3c */ + __I unsigned long RXUICR; /*!< Receive FIFO Underflow Interrupt Clear Register, R, 0x40 */ + unsigned long RESERVED_0x44[1]; /*!< Reserved Memory Area start from 0x44 to 0x48*/ + __I unsigned long ICR; /*!< Interrupt Clear Register , R, 0x48 */ + __IO unsigned long DMACR; /*!< DMA Control Register ,RW, 0x4c */ + __IO unsigned long DMATDLR; /*!< DMA Transmit Data Level ,RW, 0x50 */ + __IO unsigned long DMARDLR; /*!< DMA Receive Data Level ,RW, 0x54 */ + __I unsigned long IDR; /*!< Identification Register , R, 0x58 */ + unsigned long RESERVED_0x5c[1]; /*!< Reserved Memory Area start from 0x5c to 0x60*/ + __IO unsigned long DR; /*!< Data Register ,RW, 0x60 */ +} SPI_SLAVE_TypeDef; + +/********* Register BitField Details: CTRLR BASE+0x00 *********/ +#define CTRLR_SPI_FRF_Pos (21U) +#define CTRLR_SPI_FRF_Msk (0x3UL << CTRLR_SPI_FRF_Pos) /*!< 0x00600000 */ +#define CTRLR_SPI_FRF CTRLR_SPI_FRF_Msk +#define CTRLR_SPI_FRF_0 (0x1UL << CTRLR_SPI_FRF_Pos) /*!< 0x00200000 */ +#define CTRLR_SPI_FRF_1 (0x2UL << CTRLR_SPI_FRF_Pos) /*!< 0x00400000 */ +#define CTRLR_DFS_32_Pos (16U) +#define CTRLR_DFS_32_Msk (0x1fUL << CTRLR_DFS_32_Pos) /*!< 0x001f0000 */ +#define CTRLR_DFS_32 CTRLR_DFS_32_Msk +#define CTRLR_DFS_32_0 (0x1UL << CTRLR_DFS_32_Pos) /*!< 0x00010000 */ +#define CTRLR_DFS_32_1 (0x2UL << CTRLR_DFS_32_Pos) /*!< 0x00020000 */ +#define CTRLR_DFS_32_2 (0x4UL << CTRLR_DFS_32_Pos) /*!< 0x00040000 */ +#define CTRLR_DFS_32_3 (0x8UL << CTRLR_DFS_32_Pos) /*!< 0x00080000 */ +#define CTRLR_DFS_32_4 (0x10UL << CTRLR_DFS_32_Pos) /*!< 0x00100000 */ +#define CTRLR_CFS_Pos (12U) +#define CTRLR_CFS_Msk (0xfUL << CTRLR_CFS_Pos) /*!< 0x0000f000 */ +#define CTRLR_CFS CTRLR_CFS_Msk +#define CTRLR_CFS_0 (0x1UL << CTRLR_CFS_Pos) /*!< 0x00001000 */ +#define CTRLR_CFS_1 (0x2UL << CTRLR_CFS_Pos) /*!< 0x00002000 */ +#define CTRLR_CFS_2 (0x4UL << CTRLR_CFS_Pos) /*!< 0x00004000 */ +#define CTRLR_CFS_3 (0x8UL << CTRLR_CFS_Pos) /*!< 0x00008000 */ +#define CTRLR_SRL_Pos (11U) +#define CTRLR_SRL_Msk (0x1UL << CTRLR_SRL_Pos) /*!< 0x00000800 */ +#define CTRLR_SRL CTRLR_SRL_Msk +#define CTRLR_SRL_0 (0x1UL << CTRLR_SRL_Pos) /*!< 0x00000800 */ +#define CTRLR_SLV_OE_Pos (10U) +#define CTRLR_SLV_OE_Msk (0x1UL << CTRLR_SLV_OE_Pos) /*!< 0x00000400 */ +#define CTRLR_SLV_OE CTRLR_SLV_OE_Msk +#define CTRLR_SLV_OE_0 (0x1UL << CTRLR_SLV_OE_Pos) /*!< 0x00000400 */ +#define CTRLR_TMOD_Pos (8U) +#define CTRLR_TMOD_Msk (0x3UL << CTRLR_TMOD_Pos) /*!< 0x00000300 */ +#define CTRLR_TMOD CTRLR_TMOD_Msk +#define CTRLR_TMOD_0 (0x1UL << CTRLR_TMOD_Pos) /*!< 0x00000100 */ +#define CTRLR_TMOD_1 (0x2UL << CTRLR_TMOD_Pos) /*!< 0x00000200 */ +#define CTRLR_SCPOL_Pos (7U) +#define CTRLR_SCPOL_Msk (0x1UL << CTRLR_SCPOL_Pos) /*!< 0x00000080 */ +#define CTRLR_SCPOL CTRLR_SCPOL_Msk +#define CTRLR_SCPOL_0 (0x1UL << CTRLR_SCPOL_Pos) /*!< 0x00000080 */ +#define CTRLR_SCPH_Pos (6U) +#define CTRLR_SCPH_Msk (0x1UL << CTRLR_SCPH_Pos) /*!< 0x00000040 */ +#define CTRLR_SCPH CTRLR_SCPH_Msk +#define CTRLR_SCPH_0 (0x1UL << CTRLR_SCPH_Pos) /*!< 0x00000040 */ +#define CTRLR_FRF_Pos (4U) +#define CTRLR_FRF_Msk (0x3UL << CTRLR_FRF_Pos) /*!< 0x00000030 */ +#define CTRLR_FRF CTRLR_FRF_Msk +#define CTRLR_FRF_0 (0x1UL << CTRLR_FRF_Pos) /*!< 0x00000010 */ +#define CTRLR_FRF_1 (0x2UL << CTRLR_FRF_Pos) /*!< 0x00000020 */ + +/********* Register BitField Details: SSIENR BASE+0x08 *********/ +#define SSIENR_SSI_SLV_EN_Pos (0U) +#define SSIENR_SSI_SLV_EN_Msk (0x1UL << SSIENR_SSI_SLV_EN_Pos) /*!< 0x00000001 */ +#define SSIENR_SSI_SLV_EN SSIENR_SSI_SLV_EN_Msk +#define SSIENR_SSI_SLV_EN_0 (0x1UL << SSIENR_SSI_SLV_EN_Pos) /*!< 0x00000001 */ + +/********* Register BitField Details: MWCR BASE+0x0C *********/ +#define MWCR_MDD_Pos (1U) +#define MWCR_MDD_Msk (0x1UL << MWCR_MDD_Pos) /*!< 0x00000002 */ +#define MWCR_MDD MWCR_MDD_Msk +#define MWCR_MDD_0 (0x1UL << MWCR_MDD_Pos) /*!< 0x00000002 */ +#define MWCR_MWMOD_Pos (0U) +#define MWCR_MWMOD_Msk (0x1UL << MWCR_MWMOD_Pos) /*!< 0x00000001 */ +#define MWCR_MWMOD MWCR_MWMOD_Msk +#define MWCR_MWMOD_0 (0x1UL << MWCR_MWMOD_Pos) /*!< 0x00000001 */ + +/********* Register BitField Details: TXFTLR BASE+0x18 *********/ +#define TXFTLR_TFT_Pos (0U) +#define TXFTLR_TFT_Msk (0x3fUL << TXFTLR_TFT_Pos) /*!< 0x0000003f */ +#define TXFTLR_TFT TXFTLR_TFT_Msk +#define TXFTLR_TFT_0 (0x1UL << TXFTLR_TFT_Pos) /*!< 0x00000001 */ +#define TXFTLR_TFT_1 (0x2UL << TXFTLR_TFT_Pos) /*!< 0x00000002 */ +#define TXFTLR_TFT_2 (0x4UL << TXFTLR_TFT_Pos) /*!< 0x00000004 */ +#define TXFTLR_TFT_3 (0x8UL << TXFTLR_TFT_Pos) /*!< 0x00000008 */ +#define TXFTLR_TFT_4 (0x10UL << TXFTLR_TFT_Pos) /*!< 0x00000010 */ +#define TXFTLR_TFT_5 (0x20UL << TXFTLR_TFT_Pos) /*!< 0x00000020 */ + +/********* Register BitField Details: RXFTLR BASE+0x1C *********/ +#define RXFTLR_RFT_Pos (0U) +#define RXFTLR_RFT_Msk (0x3fUL << RXFTLR_RFT_Pos) /*!< 0x0000003f */ +#define RXFTLR_RFT RXFTLR_RFT_Msk +#define RXFTLR_RFT_0 (0x1UL << RXFTLR_RFT_Pos) /*!< 0x00000001 */ +#define RXFTLR_RFT_1 (0x2UL << RXFTLR_RFT_Pos) /*!< 0x00000002 */ +#define RXFTLR_RFT_2 (0x4UL << RXFTLR_RFT_Pos) /*!< 0x00000004 */ +#define RXFTLR_RFT_3 (0x8UL << RXFTLR_RFT_Pos) /*!< 0x00000008 */ +#define RXFTLR_RFT_4 (0x10UL << RXFTLR_RFT_Pos) /*!< 0x00000010 */ +#define RXFTLR_RFT_5 (0x20UL << RXFTLR_RFT_Pos) /*!< 0x00000020 */ + +/********* Register BitField Details: TXFLR BASE+0x20 *********/ +#define TXFLR_TXTFL_Pos (0U) +#define TXFLR_TXTFL_Msk (0x7fUL << TXFLR_TXTFL_Pos) /*!< 0x0000007f */ +#define TXFLR_TXTFL TXFLR_TXTFL_Msk +#define TXFLR_TXTFL_0 (0x1UL << TXFLR_TXTFL_Pos) /*!< 0x00000001 */ +#define TXFLR_TXTFL_1 (0x2UL << TXFLR_TXTFL_Pos) /*!< 0x00000002 */ +#define TXFLR_TXTFL_2 (0x4UL << TXFLR_TXTFL_Pos) /*!< 0x00000004 */ +#define TXFLR_TXTFL_3 (0x8UL << TXFLR_TXTFL_Pos) /*!< 0x00000008 */ +#define TXFLR_TXTFL_4 (0x10UL << TXFLR_TXTFL_Pos) /*!< 0x00000010 */ +#define TXFLR_TXTFL_5 (0x20UL << TXFLR_TXTFL_Pos) /*!< 0x00000020 */ +#define TXFLR_TXTFL_6 (0x40UL << TXFLR_TXTFL_Pos) /*!< 0x00000040 */ + +/********* Register BitField Details: RXFLR BASE+0x24 *********/ +#define RXFLR_RXTFL_Pos (0U) +#define RXFLR_RXTFL_Msk (0x7fUL << RXFLR_RXTFL_Pos) /*!< 0x0000007f */ +#define RXFLR_RXTFL RXFLR_RXTFL_Msk +#define RXFLR_RXTFL_0 (0x1UL << RXFLR_RXTFL_Pos) /*!< 0x00000001 */ +#define RXFLR_RXTFL_1 (0x2UL << RXFLR_RXTFL_Pos) /*!< 0x00000002 */ +#define RXFLR_RXTFL_2 (0x4UL << RXFLR_RXTFL_Pos) /*!< 0x00000004 */ +#define RXFLR_RXTFL_3 (0x8UL << RXFLR_RXTFL_Pos) /*!< 0x00000008 */ +#define RXFLR_RXTFL_4 (0x10UL << RXFLR_RXTFL_Pos) /*!< 0x00000010 */ +#define RXFLR_RXTFL_5 (0x20UL << RXFLR_RXTFL_Pos) /*!< 0x00000020 */ +#define RXFLR_RXTFL_6 (0x40UL << RXFLR_RXTFL_Pos) /*!< 0x00000040 */ + +/********* Register BitField Details: SR BASE+0x28 *********/ +#define SR_TXE_Pos (5U) +#define SR_TXE_Msk (0x1UL << SR_TXE_Pos) /*!< 0x00000020 */ +#define SR_TXE SR_TXE_Msk +#define SR_TXE_0 (0x1UL << SR_TXE_Pos) /*!< 0x00000020 */ +#define SR_RFF_Pos (4U) +#define SR_RFF_Msk (0x1UL << SR_RFF_Pos) /*!< 0x00000010 */ +#define SR_RFF SR_RFF_Msk +#define SR_RFF_0 (0x1UL << SR_RFF_Pos) /*!< 0x00000010 */ +#define SR_RFNE_Pos (3U) +#define SR_RFNE_Msk (0x1UL << SR_RFNE_Pos) /*!< 0x00000008 */ +#define SR_RFNE SR_RFNE_Msk +#define SR_RFNE_0 (0x1UL << SR_RFNE_Pos) /*!< 0x00000008 */ +#define SR_TFE_Pos (2U) +#define SR_TFE_Msk (0x1UL << SR_TFE_Pos) /*!< 0x00000004 */ +#define SR_TFE SR_TFE_Msk +#define SR_TFE_0 (0x1UL << SR_TFE_Pos) /*!< 0x00000004 */ +#define SR_TFNF_Pos (1U) +#define SR_TFNF_Msk (0x1UL << SR_TFNF_Pos) /*!< 0x00000002 */ +#define SR_TFNF SR_TFNF_Msk +#define SR_TFNF_0 (0x1UL << SR_TFNF_Pos) /*!< 0x00000002 */ +#define SR_BUSY_Pos (0U) +#define SR_BUSY_Msk (0x1UL << SR_BUSY_Pos) /*!< 0x00000001 */ +#define SR_BUSY SR_BUSY_Msk +#define SR_BUSY_0 (0x1UL << SR_BUSY_Pos) /*!< 0x00000001 */ + +/********* Register BitField Details: IMR BASE+0x2C *********/ +#define IMR_RXFIM_Pos (4U) +#define IMR_RXFIM_Msk (0x1UL << IMR_RXFIM_Pos) /*!< 0x00000010 */ +#define IMR_RXFIM IMR_RXFIM_Msk +#define IMR_RXFIM_0 (0x1UL << IMR_RXFIM_Pos) /*!< 0x00000010 */ +#define IMR_RXOIM_Pos (3U) +#define IMR_RXOIM_Msk (0x1UL << IMR_RXOIM_Pos) /*!< 0x00000008 */ +#define IMR_RXOIM IMR_RXOIM_Msk +#define IMR_RXOIM_0 (0x1UL << IMR_RXOIM_Pos) /*!< 0x00000008 */ +#define IMR_RXUIM_Pos (2U) +#define IMR_RXUIM_Msk (0x1UL << IMR_RXUIM_Pos) /*!< 0x00000004 */ +#define IMR_RXUIM IMR_RXUIM_Msk +#define IMR_RXUIM_0 (0x1UL << IMR_RXUIM_Pos) /*!< 0x00000004 */ +#define IMR_TXOIM_Pos (1U) +#define IMR_TXOIM_Msk (0x1UL << IMR_TXOIM_Pos) /*!< 0x00000002 */ +#define IMR_TXOIM IMR_TXOIM_Msk +#define IMR_TXOIM_0 (0x1UL << IMR_TXOIM_Pos) /*!< 0x00000002 */ +#define IMR_TXEIM_Pos (0U) +#define IMR_TXEIM_Msk (0x1UL << IMR_TXEIM_Pos) /*!< 0x00000001 */ +#define IMR_TXEIM IMR_TXEIM_Msk +#define IMR_TXEIM_0 (0x1UL << IMR_TXEIM_Pos) /*!< 0x00000001 */ + +/********* Register BitField Details: ISR BASE+0x30 *********/ +#define ISR_MSTIS_Pos (5U) +#define ISR_MSTIS_Msk (0x1UL << ISR_MSTIS_Pos) /*!< 0x00000020 */ +#define ISR_MSTIS ISR_MSTIS_Msk +#define ISR_MSTIS_0 (0x1UL << ISR_MSTIS_Pos) /*!< 0x00000020 */ +#define ISR_RXFIS_Pos (4U) +#define ISR_RXFIS_Msk (0x1UL << ISR_RXFIS_Pos) /*!< 0x00000010 */ +#define ISR_RXFIS ISR_RXFIS_Msk +#define ISR_RXFIS_0 (0x1UL << ISR_RXFIS_Pos) /*!< 0x00000010 */ +#define ISR_RXOIS_Pos (3U) +#define ISR_RXOIS_Msk (0x1UL << ISR_RXOIS_Pos) /*!< 0x00000008 */ +#define ISR_RXOIS ISR_RXOIS_Msk +#define ISR_RXOIS_0 (0x1UL << ISR_RXOIS_Pos) /*!< 0x00000008 */ +#define ISR_RXUIS_Pos (2U) +#define ISR_RXUIS_Msk (0x1UL << ISR_RXUIS_Pos) /*!< 0x00000004 */ +#define ISR_RXUIS ISR_RXUIS_Msk +#define ISR_RXUIS_0 (0x1UL << ISR_RXUIS_Pos) /*!< 0x00000004 */ +#define ISR_TXOIS_Pos (1U) +#define ISR_TXOIS_Msk (0x1UL << ISR_TXOIS_Pos) /*!< 0x00000002 */ +#define ISR_TXOIS ISR_TXOIS_Msk +#define ISR_TXOIS_0 (0x1UL << ISR_TXOIS_Pos) /*!< 0x00000002 */ +#define ISR_TXEIS_Pos (0U) +#define ISR_TXEIS_Msk (0x1UL << ISR_TXEIS_Pos) /*!< 0x00000001 */ +#define ISR_TXEIS ISR_TXEIS_Msk +#define ISR_TXEIS_0 (0x1UL << ISR_TXEIS_Pos) /*!< 0x00000001 */ + +/********* Register BitField Details: RISR BASE+0x34 *********/ +#define RISR_RXFIR_Pos (4U) +#define RISR_RXFIR_Msk (0x1UL << RISR_RXFIR_Pos) /*!< 0x00000010 */ +#define RISR_RXFIR RISR_RXFIR_Msk +#define RISR_RXFIR_0 (0x1UL << RISR_RXFIR_Pos) /*!< 0x00000010 */ +#define RISR_RXOIR_Pos (3U) +#define RISR_RXOIR_Msk (0x1UL << RISR_RXOIR_Pos) /*!< 0x00000008 */ +#define RISR_RXOIR RISR_RXOIR_Msk +#define RISR_RXOIR_0 (0x1UL << RISR_RXOIR_Pos) /*!< 0x00000008 */ +#define RISR_RXUIR_Pos (2U) +#define RISR_RXUIR_Msk (0x1UL << RISR_RXUIR_Pos) /*!< 0x00000004 */ +#define RISR_RXUIR RISR_RXUIR_Msk +#define RISR_RXUIR_0 (0x1UL << RISR_RXUIR_Pos) /*!< 0x00000004 */ +#define RISR_TXOIR_Pos (1U) +#define RISR_TXOIR_Msk (0x1UL << RISR_TXOIR_Pos) /*!< 0x00000002 */ +#define RISR_TXOIR RISR_TXOIR_Msk +#define RISR_TXOIR_0 (0x1UL << RISR_TXOIR_Pos) /*!< 0x00000002 */ +#define RISR_TXEIR_Pos (0U) +#define RISR_TXEIR_Msk (0x1UL << RISR_TXEIR_Pos) /*!< 0x00000001 */ +#define RISR_TXEIR RISR_TXEIR_Msk +#define RISR_TXEIR_0 (0x1UL << RISR_TXEIR_Pos) /*!< 0x00000001 */ + +/********* Register BitField Details: TXOICR BASE+0x38 *********/ +#define TXOICR_TXOICR_Pos (0U) +#define TXOICR_TXOICR_Msk (0x1UL << TXOICR_TXOICR_Pos) /*!< 0x00000001 */ +#define TXOICR_TXOICR TXOICR_TXOICR_Msk +#define TXOICR_TXOICR_0 (0x1UL << TXOICR_TXOICR_Pos) /*!< 0x00000001 */ + +/********* Register BitField Details: RXOICR BASE+0x3C *********/ +#define RXOICR_RXOICR_Pos (0U) +#define RXOICR_RXOICR_Msk (0x1UL << RXOICR_RXOICR_Pos) /*!< 0x00000001 */ +#define RXOICR_RXOICR RXOICR_RXOICR_Msk +#define RXOICR_RXOICR_0 (0x1UL << RXOICR_RXOICR_Pos) /*!< 0x00000001 */ + +/********* Register BitField Details: RXUICR BASE+0x40 *********/ +#define RXUICR_RXOICR_Pos (0U) +#define RXUICR_RXOICR_Msk (0x1UL << RXUICR_RXOICR_Pos) /*!< 0x00000001 */ +#define RXUICR_RXOICR RXUICR_RXOICR_Msk +#define RXUICR_RXOICR_0 (0x1UL << RXUICR_RXOICR_Pos) /*!< 0x00000001 */ + +/********* Register BitField Details: ICR BASE+0x48 *********/ +#define ICR_MSTICR_Pos (0U) +#define ICR_MSTICR_Msk (0x1UL << ICR_MSTICR_Pos) /*!< 0x00000001 */ +#define ICR_MSTICR ICR_MSTICR_Msk +#define ICR_MSTICR_0 (0x1UL << ICR_MSTICR_Pos) /*!< 0x00000001 */ + +/********* Register BitField Details: DMACR BASE+0x4C *********/ +#define DMACR_TDMAE_Pos (1U) +#define DMACR_TDMAE_Msk (0x1UL << DMACR_TDMAE_Pos) /*!< 0x00000002 */ +#define DMACR_TDMAE DMACR_TDMAE_Msk +#define DMACR_TDMAE_0 (0x1UL << DMACR_TDMAE_Pos) /*!< 0x00000002 */ +#define DMACR_RDMAE_Pos (0U) +#define DMACR_RDMAE_Msk (0x1UL << DMACR_RDMAE_Pos) /*!< 0x00000001 */ +#define DMACR_RDMAE DMACR_RDMAE_Msk +#define DMACR_RDMAE_0 (0x1UL << DMACR_RDMAE_Pos) /*!< 0x00000001 */ + +/********* Register BitField Details: DMATDLR BASE+0x50 *********/ +#define DMATDLR_DMATDL_Pos (0U) +#define DMATDLR_DMATDL_Msk (0x3fUL << DMATDLR_DMATDL_Pos) /*!< 0x0000003f */ +#define DMATDLR_DMATDL DMATDLR_DMATDL_Msk +#define DMATDLR_DMATDL_0 (0x1UL << DMATDLR_DMATDL_Pos) /*!< 0x00000001 */ +#define DMATDLR_DMATDL_1 (0x2UL << DMATDLR_DMATDL_Pos) /*!< 0x00000002 */ +#define DMATDLR_DMATDL_2 (0x4UL << DMATDLR_DMATDL_Pos) /*!< 0x00000004 */ +#define DMATDLR_DMATDL_3 (0x8UL << DMATDLR_DMATDL_Pos) /*!< 0x00000008 */ +#define DMATDLR_DMATDL_4 (0x10UL << DMATDLR_DMATDL_Pos) /*!< 0x00000010 */ +#define DMATDLR_DMATDL_5 (0x20UL << DMATDLR_DMATDL_Pos) /*!< 0x00000020 */ + +/********* Register BitField Details: DMARDLR BASE+0x54 *********/ +#define DMARDLR_DMARDL_Pos (0U) +#define DMARDLR_DMARDL_Msk (0x3fUL << DMARDLR_DMARDL_Pos) /*!< 0x0000003f */ +#define DMARDLR_DMARDL DMARDLR_DMARDL_Msk +#define DMARDLR_DMARDL_0 (0x1UL << DMARDLR_DMARDL_Pos) /*!< 0x00000001 */ +#define DMARDLR_DMARDL_1 (0x2UL << DMARDLR_DMARDL_Pos) /*!< 0x00000002 */ +#define DMARDLR_DMARDL_2 (0x4UL << DMARDLR_DMARDL_Pos) /*!< 0x00000004 */ +#define DMARDLR_DMARDL_3 (0x8UL << DMARDLR_DMARDL_Pos) /*!< 0x00000008 */ +#define DMARDLR_DMARDL_4 (0x10UL << DMARDLR_DMARDL_Pos) /*!< 0x00000010 */ +#define DMARDLR_DMARDL_5 (0x20UL << DMARDLR_DMARDL_Pos) /*!< 0x00000020 */ + +/********* Register BitField Details: IDR BASE+0x58 *********/ +/* There is no BitField Details for ID */ + +/********* Register BitField Details: DR BASE+0x60 *********/ +/* There is no BitField Details for DR */ + + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif /* __cplusplus*/ +#endif /* __REG_SPI_SLAVE_H__ */ diff --git a/cpu/soc-x2600/include/x2600.h b/cpu/soc-x2600/include/x2600.h index 6e539f8c..7e7a4b25 100755 --- a/cpu/soc-x2600/include/x2600.h +++ b/cpu/soc-x2600/include/x2600.h @@ -35,6 +35,7 @@ #include "sadc.h" #include "sfc.h" #include "ssi.h" +#include "ssi_slave.h" #include "uart.h" #include "interrupt.h" #include "pwm.h" @@ -77,6 +78,7 @@ extern "C" { #define SFC_BASE 0x13440000 /*!< SPI Flash Controller */ #define SSI0_BASE 0x10043000 /*!< The SSI0's registers map base address */ #define SSI1_BASE 0x10044000 /*!< The SSI1's registers map base address */ +#define SSI_SLAVE_BASE 0x10045000 /*!< The SSI_SLAVE's registers map base address */ #define UART0_BASE 0x10030000 /*!< Address base of UART 0 */ #define UART1_BASE 0x10031000 /*!< Address base of UART 1 */ #define UART2_BASE 0x10032000 /*!< Address base of UART 2 */ @@ -123,6 +125,7 @@ extern "C" { #define SFC_Instance ((SFC_TypeDef *) (SFC_BASE )) #define SSI0_Instance ((SPI_TypeDef *) (SSI0_BASE )) #define SSI1_Instance ((SPI_TypeDef *) (SSI1_BASE )) +#define SSI_SLAVE_Instance ((SPI_SLAVE_TypeDef *) (SSI_SLAVE_BASE )) #define UART0_Instance ((UART_TypeDef *) (UART0_BASE )) #define UART1_Instance ((UART_TypeDef *) (UART1_BASE )) #define UART2_Instance ((UART_TypeDef *) (UART2_BASE )) @@ -166,6 +169,7 @@ extern "C" { #define SFC_Instance ((SFC_TypeDef *) (SFC_BASE | 0xa0000000)) #define SSI0_Instance ((SPI_TypeDef *) (SSI0_BASE | 0xa0000000)) #define SSI1_Instance ((SPI_TypeDef *) (SSI1_BASE | 0xa0000000)) +#define SSI_SLAVE_Instance ((SPI_SLAVE_TypeDef *) (SSI_SLAVE_BASE | 0xa0000000)) #define UART0_Instance ((UART_TypeDef *) (UART0_BASE | 0xa0000000)) #define UART1_Instance ((UART_TypeDef *) (UART1_BASE | 0xa0000000)) #define UART2_Instance ((UART_TypeDef *) (UART2_BASE | 0xa0000000)) diff --git a/drivers/drivers-x2600/include/x2600_hal_ssi_slave.h b/drivers/drivers-x2600/include/x2600_hal_ssi_slave.h new file mode 100644 index 00000000..d11e7671 --- /dev/null +++ b/drivers/drivers-x2600/include/x2600_hal_ssi_slave.h @@ -0,0 +1,583 @@ +/** + * @file x2600_hal_ssi_slave.h + * @author MPU系统软件部团队 + * @brief [!!!!删除此内容,添加文件简介!!!!] + * + * @copyright 版权所有 (北京君正集成电路股份有限公司) {2022} + * @copyright Copyright© 2022 Ingenic Semiconductor Co.,Ltd + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#ifndef __X2600_HAL_SSI_SLAVE_H__ +#define __X2600_HAL_SSI_SLAVE_H__ + +/** + * @addtogroup group_SSI_SLAVE + * @{ + */ + +/** + * @addtogroup g_X2600_SSI_SLAVE_HAL_Driver SSI_SLAVE HAL 驱动 + * @{ + */ + +/* 1. 头文件 (Includes)----------------------------------------------- */ +#include "x2600_hal_def.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/* 2. 导出的类型 (Exported Types)--------------------------------------- */ +/** + * @defgroup SSI_SLAVE_exported_types SSI_SLAVE 导出的类型 (Exported Types) + * @{ + */ +typedef enum { + HAL_SPI_SLAVE_STATE_READY = 0x00U, /*!< 外围设备已经初始化并准备就绪 */ + HAL_SPI_SLAVE_STATE_BUSY = 0x01U, /*!< 内部程序正在进行中 */ + HAL_SPI_SLAVE_STATE_BUSY_TX = 0x02U, /*!< 数据传输过程正在进行 */ + HAL_SPI_SLAVE_STATE_BUSY_RX = 0x04U, /*!< 数据接收过程正在进行 */ + HAL_SPI_SLAVE_STATE_BUSY_TX_RX = 0x06U, /*!< 数据传输和接收正在进行 */ + HAL_SPI_SLAVE_STATE_ERROR = 0x08U, /*!< SPI_SLAVE 错误状态 */ + HAL_SPI_SLAVE_STATE_ABORT = 0x10U /*!< SPI_SLAVE 终止进行中 */ +} HAL_SPI_SLAVE_StateTypeDef; + +/** @defgroup SPI_SLAVE_exported_types_group2 SPI_SLAVE 句柄结构体定义 + * @{ + */ +/** + * @brief SPI_SLAVE 初始化参数 + */ +typedef struct { + uint32_t DataSize; /*!< SPI_SLAVE 字长度 */ + uint32_t CLKPolarity; /*!< SPI_SLAVE 时钟极性 */ + uint32_t CLKPhase; /*!< SPI_SLAVE 时钟相位 */ + uint32_t LoopMode; /*!< SPI_SLAVE Loopback 模式 */ +} SPI_SLAVE_InitTypeDef; + +/** + * @brief SPI_SLAVE 句柄结构体定义 + */ +typedef struct __SPI_SLAVE_HandleTypeDef { + SPI_SLAVE_TypeDef *Instance; /*!< SPI_SLAVE 寄存器基地址 */ + SPI_SLAVE_InitTypeDef Init; /*!< SPI_SLAVE 初始化参数 */ + + void *pTxBuffPtr; /*!< 指向SPI_SLAVE Tx缓冲区的指针 */ + uint16_t TxXferSize; /*!< SPI_SLAVE Tx传输大小 */ + __IO uint16_t TxXferCount; /*!< SPI_SLAVE Tx传输计数器 */ + void *pRxBuffPtr; /*!< 指向SPI_SLAVE Rx缓冲区的指针 */ + uint16_t RxXferSize; /*!< SPI_SLAVE Rx 传输大小 */ + __IO uint16_t RxXferCount; /*!< SPI_SLAVE Rx 传输计数器 */ + + void (*RxISR)(struct __SPI_SLAVE_HandleTypeDef *hslv); /*!< Rx函数指针 */ + void (*TxISR)(struct __SPI_SLAVE_HandleTypeDef *hslv); /*!< Tx函数指针 */ + + HAL_LockTypeDef Lock; /*!< 锁资源 */ + __IO HAL_SPI_SLAVE_StateTypeDef State; /*!< SPI_SLAVE 状态 */ + + DMA_HandleTypeDef *DMA_Handle; + DMA_InitChannelConfTypeDef *SPI_SLAVE_DMA_Tx_Config; + DMA_InitChannelConfTypeDef *SPI_SLAVE_DMA_Rx_Config; + int dma_tx_ch; + int dma_rx_ch; +}SPI_SLAVE_HandleTypeDef; + +/** + * @} + */ + +/** + * @} + */ + +/* 3. 导出常量定义 Exported Constants ----------------------------------- */ +/** + * @defgroup SSI_SLAVE_exported_constants SSI_SLAVE 导出的常量 Exported Constants + * @{ + */ + +#define HAL_SPI_SLAVE_ERROR_NONE (0x00000000U) /*!< 没有错误 */ +#define HAL_SPI_SLAVE_ERROR_DMA (0x00000001U) /*!< DMA传输错误 */ +#if (USE_HAL_SPI_SLAVE_REGISTER_CALLBACKS == 1U) +#define HAL_SPI_SLAVE_ERROR_INVALID_CALLBACK (0x00000002U) /*!< 无效的回调 */ +#endif +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_constants_group2 SPI_SLAVE 传输字节位宽 + * @{ + */ +#define SPI_SLAVE_DATASIZE_8BIT (CTRLR_DFS_32_0 | CTRLR_DFS_32_1 | CTRLR_DFS_32_2) +#define SPI_SLAVE_DATASIZE_16BIT (CTRLR_DFS_32_0 | CTRLR_DFS_32_1 | CTRLR_DFS_32_2 | CTRLR_DFS_32_3) +#define SPI_SLAVE_DATASIZE_32BIT (CTRLR_DFS_32_0 | CTRLR_DFS_32_1 | CTRLR_DFS_32_2 | CTRLR_DFS_32_3 | CTRLR_DFS_32_4) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_constants_group3 SPI_SLAVE SPI 时钟极性 + * @{ + */ +#define SPI_SLAVE_POLARITY_LOW (0x00000000U) +#define SPI_SLAVE_POLARITY_HIGH (CTRLR_SCPOL_0) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_constants_group4 SPI_SLAVE SPI 相位 + * @{ + */ +#define SPI_SLAVE_PHASE_1EDGE (0x00000000U) +#define SPI_SLAVE_PHASE_2EDGE (CTRLR_SCPH_0) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_constants_group5 SPI_SLAVE Loopback模式 + * @{ + */ +#define SPI_SLAVE_LOOP_DISABLE (0x00000000U) +#define SPI_SLAVE_LOOP_ENABLE (CTRLR_SRL_0) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_constants_group6 SPI_SLAVE 工作模式 + * @{ + */ +#define SPI_SLAVE_MODE_TRANSMIT_AND_RECEIVE (0x00000000U) +#define SPI_SLAVE_MODE_ONLY_TRANSMIT (CTRLR_TMOD_0) +#define SPI_SLAVE_MODE_ONLY_RECEIVE (CTRLR_TMOD_1) +#define SPI_SLAVE_MODE_NONE (CTRLR_TMOD_0 | CTRLR_TMOD_1) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_constants_group7 SPI_SLAVE 中断使能 + */ +#define SPI_SLAVE_INTERRUPT_RXFIS (ISR_RXFIS_0) +#define SPI_SLAVE_INTERRUPT_RXOIS (ISR_RXOIS_0) +#define SPI_SLAVE_INTERRUPT_RXUIS (ISR_RXUIS_0) +#define SPI_SLAVE_INTERRUPT_TXOIS (ISR_TXOIS_0) +#define SPI_SLAVE_INTERRUPT_TXEIS (ISR_TXEIS_0) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_constants_group8 SPI_SLAVE FIFO深度 + * @{ + * */ +#define SPI_SLAVE_FIFO_MAX_DEPTH 64 + +/** + * @brief DR 寄存器,指向SPI_SLAVE FIFO + * @param __HANDLE__ 指向SPI_SLAVE句柄 + * @retval 无 + * + */ +#define SPI_SLAVE_FIFO(__HANDLE__) (&((__HANDLE__)->Instance->DR)) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_constants_group9 SPI_SLAVE 寄存器个数 + * @{ + */ +#define SPI_SLAVE_TOTAL_REG 20 +/** + * @} + */ + +/* 4. 导出宏定义 Exported Macros --------------------------------------- */ +/** + * @defgroup SSI_SLAVE_exported_macros SSI_SLAVE 导出宏 Exported Macros + * @{ + */ + +/** + * @defgroup SSI_SLAVE_exported_macros_group1 SPI_SLAVE 控制器使能 + * @{ + */ +#define __HAL_SPI_SLAVE_ENABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->SSIENR, SSIENR_SSI_SLV_EN_0) +#define __HAL_SPI_SLAVE_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->SSIENR, SSIENR_SSI_SLV_EN_0) +#define __HAL_SPI_SLAVE_IS_DEV_ENABLE(__HANDLE__) (READ_BIT((__HANDLE__)->Instance->SSIENR, SSIENR_SSI_SLV_EN_Msk)) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_macros_group2 屏蔽所有中断 + * @{ + */ +#define __HAL_SPI_SLAVE_MASK_ALL_IT(__HANDLE__) (WRITE_REG((__HANDLE__)->Instance->IMR, 0)) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_macros_group3 屏蔽中断 + * @{ + */ +#define __HAL_SPI_SLAVE_MASK_IT(__HANDLE__, __BIT__) (CLEAR_BIT((__HANDLE__)->Instance->IMR, __BIT__)) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_macros_group4 清除所有中断 + * @{ + */ +#define __HAL_SPI_SLAVE_CLEAR_ALL_IT(__HANDLE__) (READ_REG((__HANDLE__)->Instance->ICR)) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_macros_group5 读取中断 + * @{ + */ +#define __HAL_SPI_SLAVE_READ_INTERRUPT(__HANDLE__) (READ_REG((__HANDLE__)->Instance->ISR)) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_macros_group6 开启中断 + * @{ + */ +#define __HAL_SPI_SLAVE_SET_INTERRUPT(__HANDLE__, __INTERRUPT__) (MODIFY_REG((__HANDLE__)->Instance->IMR, __INTERRUPT__, __INTERRUPT__)) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_macros_group7 清除RXOIS中断 + * @{ + */ +#define __HAL_SPI_SLAVE_CLEAR_RXOIS(__HANDLE__) (READ_REG((__HANDLE__)->Instance->RXOICR)) +/** + * @} + */ + + +/** + * @defgroup SSI_SLAVE_exported_macros_group8 清除RXUIS中断 + * @{ + */ +#define __HAL_SPI_SLAVE_CLEAR_RXUIS(__HANDLE__) (READ_REG((__HANDLE__)->Instance->RXUICR)) +/** + * @} + */ + + +/** + * @defgroup SSI_SLAVE_exported_macros_group9 清除TXOIS中断 + * @{ + */ +#define __HAL_SPI_SLAVE_CLEAR_TXOIS(__HANDLE__) (READ_REG((__HANDLE__)->Instance->TXOICR)) +/** + * @} + */ + + + +/** + * @defgroup SSI_SLAVE_exported_macros_group10 使用spi协议 + * @{ + */ +#define __HAL_SPI_SLAVE_SEL_SPI_PROTOCOL(__HANDLE__) (CLEAR_BIT((__HANDLE__)->Instance->CTRLR, CTRLR_FRF_Msk)) +/** + * @} + */ + + +/** + * @defgroup SSI_SLAVE_exported_macros_group11 获取rfifo中可用数据个数 + * @{ + */ +#define __HAL_SPI_SLAVE_RFIFO_COUNT(__HANDLE__) (READ_REG((__HANDLE__)->Instance->RXFLR) & RXFLR_RXTFL_Msk) +/** + * @} + */ + + +/** + * @defgroup SSI_SLAVE_exported_macros_group12 获取tfifo中可用数据个数 + * @{ + */ +#define __HAL_SPI_SLAVE_TFIFO_COUNT(__HANDLE__) (READ_REG((__HANDLE__)->Instance->TXFLR) & TXFLR_TXTFL_Msk) +/** + * @} + */ + + +/** + * @defgroup SSI_SLAVE_exported_macros_group13 读取rfifo中的数据 + * @{ + */ +#define __HAL_SPI_SLAVE_READ_RFIFO(__HANDLE__) (READ_REG((__HANDLE__)->Instance->DR)) +/** + * @} + */ + + +/** + * @defgroup SSI_SLAVE_exported_macros_group14 向tfifo中写入数据 + * @{ + */ +#define __HAL_SPI_SLAVE_WRITE_TFIFO(__HANDLE__, __DATA__) (WRITE_REG((__HANDLE__)->Instance->DR, __DATA__)) +/** + * @} + */ + + +/** + * @defgroup SSI_SLAVE_exported_macros_group15 设置spi_slave的设备工作模式:只读、只写或读写 + * @{ + */ +#define __HAL_SPI_SLAVE_SET_MODE(__HANDLE__, MODE) (MODIFY_REG((__HANDLE__)->Instance->CTRLR, CTRLR_TMOD_Msk, MODE)) +/** + * @} + */ + + +/** + * @defgroup SSI_SLAVE_exported_macros_group16 设置接收阈值 + * @{ + */ +#define __HAL_SPI_SLAVE_RFIFO_THRESHOLD(__HANDLE__, __THRESHOLD__) (WRITE_REG((__HANDLE__)->Instance->RXFTLR, __THRESHOLD__)) +/** + * @} + */ + + + +/** + * @defgroup SSI_SLAVE_exported_macros_group17 设置发送阈值 + * @{ + */ +#define __HAL_SPI_SLAVE_TFIFO_THRESHOLD(__HANDLE__, __THRESHOLD__) (WRITE_REG((__HANDLE__)->Instance->TXFTLR, __THRESHOLD__)) +/** + * @} + */ + + +/** + * @defgroup SSI_SLAVE_exported_macros_group18 设置dma 发送阈值 + * @{ + */ +#define __HAL_SPI_SLAVE_TFIFO_DMA_THRESHOLD(__HANDLE__, __THRESHOLD__) (WRITE_REG((__HANDLE__)->Instance->DMATDLR, __THRESHOLD__)) +/** + * @} + */ + + +/** + * @defgroup SSI_SLAVE_exported_macros_group19 设置dma 接收阈值 + * @{ + * */ +#define __HAL_SPI_SLAVE_RFIFO_DMA_THRESHOLD(__HANDLE__, __THRESHOLD__) (WRITE_REG((__HANDLE__)->Instance->DMARDLR, __THRESHOLD__)) +/** + * @} + */ + + +/** + * @defgroup SSI_SLAVE_exported_macros_group20 使能dma传输 + * @{ + */ +#define __HAL_SPI_SLAVE_ENABLE_DMA(__HANDLE__, __BIT__) (MODIFY_REG((__HANDLE__)->Instance->DMACR, __BIT__, __BIT__)) +/** + * @} + */ + + +/** + * @} + * */ + +/* 5. 导出函数申明 Exported Funcs --------------------------------------- */ +/** + * @defgroup SSI_SLAVE_exported_funcs SSI_SLAVE 导出函数申明 Exported Funcs + * @{ + */ + +/** + * @defgroup SSI_SLAVE_exported_funcs_group1 初始化 逆初始化相关函数 + * @{ + * */ +HAL_StatusTypeDef HAL_SPI_SLAVE_Init(SPI_SLAVE_HandleTypeDef *hslv); +HAL_StatusTypeDef HAL_SPI_SLAVE_DeInit(SPI_SLAVE_HandleTypeDef *hslv); +/** + * @} + */ + + +/** @defgroup SPI_SLAVE_exported_funcs_group2 SPI_SLAVE IO操作相关函数 + * @{ + */ +HAL_StatusTypeDef HAL_SPI_SLAVE_DMA_Transmit(SPI_SLAVE_HandleTypeDef *hslv,uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_SPI_SLAVE_DMA_Receive(SPI_SLAVE_HandleTypeDef *hslv,uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_SPI_SLAVE_DMA_TransmitReceive(SPI_SLAVE_HandleTypeDef *hslv, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size); +HAL_StatusTypeDef HAL_SPI_SLAVE_Receive_IT(SPI_SLAVE_HandleTypeDef *hslv, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_SPI_SLAVE_Transmit_IT(SPI_SLAVE_HandleTypeDef *hslv, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_SPI_SLAVE_TransmitReceive_IT(SPI_SLAVE_HandleTypeDef *hslv, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size); +/** + * @} + */ + +/** @defgroup SPI_SLAVE_exported_funcs_group3 SPI_SLAVE 中断处理函数 + * @{ + */ +void HAL_SPI_SLAVE_IRQHandler(int irq, void *data); /*!< 中断处理函数 */ +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_exported_funcs_group4 SPI_SLAVE 等待数据传输完成相关函数 + * + * */ +int HAL_SPI_SLAVE_Transmit_OR_Reciver_End(SPI_SLAVE_HandleTypeDef *hslv); +int HAL_SPI_SLAVE_DMA_Transmit_OR_Reciver_End(SPI_SLAVE_HandleTypeDef *hslv); +/** + * + * */ + +/** + * @} + */ +/* 7. 私有类型定义 (Private Types) -------------------------------------- */ +/** + * @defgroup SSI_SLAVE_private_types SSI_SLAVE 私有类型定义 (Private Types) + * @{ + */ + + +/** + * @} + */ +/* 8. 私有常量定义Private Constants ------------------------------------- */ +/** + * @defgroup SSI_SLAVE_private_constants SSI_SLAVE 私有常量定义Private Constants + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 9. 私有宏定义 (Private Macros) -------------------------------------- */ +/** + * @defgroup SSI_SLAVE_private_macros SSI_SLAVE 私有宏定义 (Private Macros) + * @{ + */ + +/** + * @defgroup SSI_SLAVE_private_macros_group1 用于判断句柄中的基地址是否正确 + * @{ + */ +#define IS_SPI_SLAVE_ALL_INSTANCE(INSTANCE) ((INSTANCE) == SSI_SLAVE_Instance) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_private_macros_group2 用于判断数据格式是否为8bit、16bit或32bit + * @{ + */ +#define IS_SPI_SLAVE_DATASIZE(__BIT__) (((__BIT__) == SPI_SLAVE_DATASIZE_8BIT) || ((__BIT__) == SPI_SLAVE_DATASIZE_16BIT) || ((__BIT__) == SPI_SLAVE_DATASIZE_32BIT)) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_private_macros_group3 用于判断时钟的极性和相位是否正确 + * @{ + */ +#define IS_SPI_SLAVE_CPOL(__BIT__) (((__BIT__) == SPI_SLAVE_POLARITY_LOW) || ((__BIT__) == SPI_SLAVE_POLARITY_HIGH)) + +#define IS_SPI_SLAVE_CPHA(__BIT__) (((__BIT__) == SPI_SLAVE_PHASE_1EDGE) || (__BIT__) == (SPI_SLAVE_PHASE_2EDGE)) +/** + * @} + */ + +/** + * defgroup SSI_SLAVE_private_macros_group4 用于判断loop模式是否正确 + * @{ + */ +#define IS_SPI_SLAVE_LOOP(__BIT__) (((__BIT__) == SPI_SLAVE_LOOP_DISABLE) || ((__BIT__) == SPI_SLAVE_LOOP_ENABLE)) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_private_macros_group5 用于确认设备是否处于忙碌状态 + * @{ + */ +#define IS_SPI_SLAVE_DEV_BUSY(__HANDLE__) (READ_BIT((__HANDLE__)->Instance->SR, SR_BUSY_Msk)) +/** + * @} + */ + +/** + * @defgroup SSI_SLAVE_private_macros_group6 用于确认中断是否被屏蔽 + * + */ +#define IS_SPI_SLAVE_IT_MASKED(__HANDLE__, __Msk__) (READ_BIT((__HANDLE__)->Instance->IMR, __Msk__)) +/** + * @} + */ + +/** + * @} + */ +/* 10. 私有函数申明 (Private Funcs) ------------------------------------- */ +/** + * @defgroup SSI_SLAVE_private_funcs SSI_SLAVE 私有函数申明 (Private Funcs) + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 11. 私有变量申明 Private Variables ----------------------------------- */ +/** + * @defgroup SSI_SLAVE_private_var SSI_SLAVE 私有变量申明 (Private Variables) + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +#endif /* __X2600_HAL_SSI_SLAVE_H__ */ diff --git a/drivers/drivers-x2600/src/x2600_hal_pdma.c b/drivers/drivers-x2600/src/x2600_hal_pdma.c index cd8f72c1..c5f95556 100755 --- a/drivers/drivers-x2600/src/x2600_hal_pdma.c +++ b/drivers/drivers-x2600/src/x2600_hal_pdma.c @@ -198,7 +198,7 @@ static void HAL_DMA_Global_Disalbe(DMA_HandleTypeDef *hdma) */ static void HAL_PDMA_IntHandler(int irq, void *data) { - prom_printk("PDMA interrupt %d %s !\n", __LINE__, __func__); +// prom_printk("PDMA interrupt %d %s !\n", __LINE__, __func__); DMA_HandleTypeDef *hdma = (DMA_HandleTypeDef *)data; /* mask掉其他中断 */ uint32_t pending = READ_REG(hdma->Instance->GCR.DIRQP); diff --git a/drivers/drivers-x2600/src/x2600_hal_ssi_slave.c b/drivers/drivers-x2600/src/x2600_hal_ssi_slave.c new file mode 100644 index 00000000..fefd2a53 --- /dev/null +++ b/drivers/drivers-x2600/src/x2600_hal_ssi_slave.c @@ -0,0 +1,1070 @@ +/** + * @file x2600_hal_ssi_slave.c + * @author MPU系统软件部团队 + * @brief [!!!!删除此内容,添加文件简介!!!!] + * + * @copyright 版权所有 (北京君正集成电路股份有限公司) {2022} + * @copyright Copyright© 2022 Ingenic Semiconductor Co.,Ltd + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + @verbatim + ============================================================================== + ##### 使用说明 ##### + ============================================================================== + [特点] + (#) 支持全双工、只发送或只接收的操作. + (#) 支持64条深x32位宽的发送和接收数据FIFO. + (#) 支持串行数据格式的长度可从4到32位不等(目前驱动中只实现了8bit、16bit、32bit 3中位宽). + (#) 提供可编程的时钟相位和极性. + (#) 支持Polling、IT模式支持,PDMA模式暂不支持. + (#) 支持背对背的字符传输/接收模式 + (#) 支持用于测试的回环模式 + (#) 支持DMA数据传输 + + [IT模式,快速编程] + (#) 1.使能SPI clock gate. + (#) 2.配置GPIO. + (#) 3.定义全局SPI_SLAVE句柄,初始化SPI_SLAVE配置. + (#) 4.请求中断,注册中断处理函数. + (#) 5.发送或接收数据. + (#) 6.轮询等待数据传输完成(非必要步骤). + + [DMA模式,快速编程] + (#) 1.使能SPI clock gate和DMA gate. + (#) 2.配置GPIO. + (#) 3.定义全局SPI_SLAVE句柄和DMA等相关信息,初始化SPI_SLAVE配置. + (#) 4.请求中断,注册中断处理函数. + (#) 5.发送或接收数据. + (#) 6.轮询等待数据传输完成(非必要步骤). + + [注意事项] + (#) 1.测试代码需要外部提供片选信号和时钟信号,在此基础上可以短接mosi和miso, + 或者直接和spi master进行连接. + + @endverbatim + */ + +/* 1.头文件 (Includes)------------------------------------------------ */ +#include "x2600_hal.h" + +/** @addtogroup g_X2600_SSI_HAL_Driver + * @{ + */ +/* 2.私有常量定义Private Constants -------------------------------------- */ +/** + * @addtogroup SSI_private_constants + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 3. 私有类型定义 (Private Types) -------------------------------------- */ +/** + * @addtogroup SSI_private_types + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 4. 私有宏定义 (Private Macros) -------------------------------------- */ +/** + * @addtogroup SSI_private_macros + * @{ + */ +#define MIN_T(A,B) (((A)<(B))? (A):(B)) /*!< 取参数中较小值 */ +/** + * @} + */ +/* 5. 私有变量申明 Private Variables ------------------------------------ */ +/** + * @addtogroup SSI_private_var + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 6. 私有函数申明 (Private Funcs) -------------------------------------- */ +/** + * @addtogroup SSI_private_funcs + * @{ + */ +static void dma_rx_cb(struct __DMA_HandleTypeDef *hdma); /* dma 接收完成的回调函数,用于刷新缓存和清除state中的标志位*/ +static void dma_tx_cb(struct __DMA_HandleTypeDef *hdma); /* dma 发送完成的回调函数,用于刷新缓存和清除state中的标志位*/ +static void SPI_SLAVE_TxISR_8BIT(struct __SPI_SLAVE_HandleTypeDef *hslv); +static void SPI_SLAVE_TxISR_16BIT(struct __SPI_SLAVE_HandleTypeDef *hslv); +static void SPI_SLAVE_TxISR_32BIT(struct __SPI_SLAVE_HandleTypeDef *hslv); +__attribute__ ((unused)) static void SPI_SLAVE_TxISR_BIT(struct __SPI_SLAVE_HandleTypeDef *hslv); /*attribute中的unused为去除编译警告使用,后续可以去除*/ +static void SPI_SLAVE_RxISR_8BIT(struct __SPI_SLAVE_HandleTypeDef *hslv); +static void SPI_SLAVE_RxISR_16BIT(struct __SPI_SLAVE_HandleTypeDef *hslv); +static void SPI_SLAVE_RxISR_32BIT(struct __SPI_SLAVE_HandleTypeDef *hslv); +__attribute__ ((unused)) static void SPI_SLAVE_RxISR_BIT(struct __SPI_SLAVE_HandleTypeDef *hslv); /*attribute中的unused为去除编译警告使用,后续可以去除*/ +/** + * @} + */ +/* 7. 私有函数实现 (Private Funcs) -------------------------------------- */ +/** + * @defgroup SSI_private_funcs_impl SSI 私有函数实现 + * @{ + */ + +/** + * @brief dma接收数据完成回调函数 + * @param 指向spi_slave句柄的指针 + * @retval None + */ +static void dma_rx_cb(struct __DMA_HandleTypeDef *hdma) +{ + SPI_SLAVE_HandleTypeDef *hslv = (SPI_SLAVE_HandleTypeDef *)hdma; +// prom_printk("**-------------------dma rx end\n"); + Flush_Cache_AllAddr(); + hslv->State &= (~(HAL_SPI_SLAVE_STATE_BUSY_RX)); + + return; +} + +/** + * @brief dma发送数据完成回调函数 + * @param 指向spi_slave句柄的指针 + * @retval None + */ +static void dma_tx_cb(struct __DMA_HandleTypeDef *hdma) +{ + SPI_SLAVE_HandleTypeDef *hslv = (SPI_SLAVE_HandleTypeDef *)hdma; +// prom_printk("**-------------------dma tx end\n"); + Flush_Cache_AllAddr(); + hslv->State &= (~(HAL_SPI_SLAVE_STATE_BUSY_TX)); + + return; +} + +/** + * @brief 用于接收8bit位宽数据 + * @param 指向包含SPI模块配置信息的SPI_HandleTypeDef结构的hslv指针 + * @retval None + */ +static void SPI_SLAVE_RxISR_8BIT(struct __SPI_SLAVE_HandleTypeDef *hslv) +{ + int cnt = 0; + uint8_t *ptr = (uint8_t *)hslv->pRxBuffPtr; + int ret_cnt = 0; + + cnt = __HAL_SPI_SLAVE_RFIFO_COUNT(hslv); + ret_cnt = MIN_T(cnt, (hslv->RxXferSize - hslv->RxXferCount)); + + while (ret_cnt--) + { + *ptr = __HAL_SPI_SLAVE_READ_RFIFO(hslv); + ptr++; + hslv->RxXferCount++; + } + hslv->pRxBuffPtr = (void *)ptr; + + return; +} + +/** + * @brief 用于接收16bit位宽数据 + * @param 指向包含SPI_SLAVE模块配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @retval None + */ +static void SPI_SLAVE_RxISR_16BIT(struct __SPI_SLAVE_HandleTypeDef *hslv) +{ + int cnt = 0; + uint16_t *ptr = (uint16_t *)hslv->pRxBuffPtr; + int ret_cnt = 0; + + cnt = __HAL_SPI_SLAVE_RFIFO_COUNT(hslv); + ret_cnt = MIN_T(cnt, (hslv->RxXferSize - hslv->RxXferCount)); + + while (ret_cnt--) + { + *ptr = __HAL_SPI_SLAVE_READ_RFIFO(hslv); + ptr++; + hslv->RxXferCount++; + } + hslv->pRxBuffPtr = (void *)ptr; + + return; +} + +/** + * @brief 用于接收32bit位宽数据 + * @param 指向包含SPI_SLAVE模块配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @retval None + */ +static void SPI_SLAVE_RxISR_32BIT(struct __SPI_SLAVE_HandleTypeDef *hslv) +{ + int cnt = 0; + uint32_t *ptr = (uint32_t *)hslv->pRxBuffPtr; + int ret_cnt = 0; + + cnt = __HAL_SPI_SLAVE_RFIFO_COUNT(hslv); + ret_cnt = MIN_T(cnt, (hslv->RxXferSize - hslv->RxXferCount)); + + while (ret_cnt--) + { + *ptr = __HAL_SPI_SLAVE_READ_RFIFO(hslv); + ptr++; + hslv->RxXferCount++; + } + hslv->pRxBuffPtr = (void *)ptr; + + return; +} + +/** + * @brief 用于适配Alios,接收4-16bit位宽数据位宽数据 + * @param 指向包含SPI_SLAVE模块配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @retval Non2e + */ +static void SPI_SLAVE_RxISR_BIT(struct __SPI_SLAVE_HandleTypeDef *hslv) +{ + /* 防止未使用的参数编译警告 */ + UNUSED(hslv); +} + +/** + * @brief 用于发送8bit位宽数据 + * @param 指向包含SPI_SLAVE模块配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @retval None + */ +static void SPI_SLAVE_TxISR_8BIT(struct __SPI_SLAVE_HandleTypeDef *hslv) +{ + int cnt = 0; + uint8_t *ptr = (uint8_t *)hslv->pTxBuffPtr; + int ret_cnt = 0; + + cnt = __HAL_SPI_SLAVE_TFIFO_COUNT(hslv); + ret_cnt = MIN_T((SPI_SLAVE_FIFO_MAX_DEPTH - cnt), (hslv->TxXferSize - hslv->TxXferCount)); + + while (ret_cnt--) + { + __HAL_SPI_SLAVE_WRITE_TFIFO(hslv, *ptr); + ptr++; + hslv->TxXferCount++; + } + hslv->pTxBuffPtr = ptr; + + return; +} + +/** + * @brief 用于发送16bit位宽数据 + * @param 指向包含SPI_SLAVE模块配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @retval None + */ +static void SPI_SLAVE_TxISR_16BIT(struct __SPI_SLAVE_HandleTypeDef *hslv) +{ + int cnt = 0; + uint16_t *ptr = (uint16_t *)hslv->pTxBuffPtr; + int ret_cnt = 0; + + cnt = __HAL_SPI_SLAVE_TFIFO_COUNT(hslv); + ret_cnt = MIN_T((SPI_SLAVE_FIFO_MAX_DEPTH - cnt), (hslv->TxXferSize - hslv->TxXferCount)); + + while (ret_cnt--) + { + __HAL_SPI_SLAVE_WRITE_TFIFO(hslv, *ptr); + ptr++; + hslv->TxXferCount++; + } + hslv->pTxBuffPtr = ptr; + + return; +} + +/** + * @brief 用于发送32bit位宽数据 + * @param 指向包含SPI_SLAVE模块配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @retval None + */ +static void SPI_SLAVE_TxISR_32BIT(struct __SPI_SLAVE_HandleTypeDef *hslv) +{ + int cnt = 0; + uint32_t *ptr = (uint32_t *)hslv->pTxBuffPtr; + int ret_cnt = 0; + + cnt = __HAL_SPI_SLAVE_TFIFO_COUNT(hslv); + ret_cnt = MIN_T((SPI_SLAVE_FIFO_MAX_DEPTH - cnt), (hslv->TxXferSize - hslv->TxXferCount)); + + while (ret_cnt--) + { + __HAL_SPI_SLAVE_WRITE_TFIFO(hslv, *ptr); + ptr++; + hslv->TxXferCount++; + } + hslv->pTxBuffPtr = ptr; + + return; +} + +/** + * @brief 用于适配Alios,发送4-16bit位宽数据 + * @param 指向包含SPI_SLAVE模块配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @retval None + */ +static void SPI_SLAVE_TxISR_BIT(struct __SPI_SLAVE_HandleTypeDef *hslv) +{ +} + +/** + * @} + */ +/* 8. 导出函数实现------------------------------------------------------- */ +/** + * @defgroup SSI_exported_funcs_impl SSI 导出函数实现 + * @{ + */ +/** + * @brief 初始化 SPI_SLAVE外围设备 + * @param 指向包含SPI模块配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @retval HAL 状态 + */ +HAL_StatusTypeDef HAL_SPI_SLAVE_Init(SPI_SLAVE_HandleTypeDef *hslv) +{ + /* 检查分配的SPI_SLAVE句柄 */ + if (hslv == NULL) { + return HAL_ERROR; + } + + /* 检查参数 */ + assert_param(IS_SPI_SLAVE_ALL_INSTANCE(hslv->Instance)); + assert_param(IS_SPI_SLAVE_DATASIZE(hslv->Init.DataSize)); + assert_param(IS_SPI_SLAVE_CPOL(hslv->Init.CLKPolarity)); + assert_param(IS_SPI_SLAVE_CPHA(hslv->Init.CLKPhase)); + assert_param(IS_SPI_SLAVE_LOOP(hslv->Init.LoopMode)); + + hslv->State = HAL_SPI_SLAVE_STATE_BUSY; + + /* 根据数据大小的不同,指向不同的数据处理函数*/ + switch (hslv->Init.DataSize) + { + case SPI_SLAVE_DATASIZE_8BIT: + hslv->TxISR = SPI_SLAVE_TxISR_8BIT; + hslv->RxISR = SPI_SLAVE_RxISR_8BIT; + break; + case SPI_SLAVE_DATASIZE_16BIT: + hslv->TxISR = SPI_SLAVE_TxISR_16BIT; + hslv->RxISR = SPI_SLAVE_RxISR_16BIT; + break; + case SPI_SLAVE_DATASIZE_32BIT: + hslv->TxISR = SPI_SLAVE_TxISR_32BIT; + hslv->RxISR = SPI_SLAVE_RxISR_32BIT; + break; + } + + /* 初始化dma控制器*/ + if (hslv->DMA_Handle != NULL) + { + HAL_DMA_Init(hslv->DMA_Handle); + } + + /* 申请rx dma通道*/ + if (hslv->SPI_SLAVE_DMA_Rx_Config != NULL) + { + hslv->dma_rx_ch = HAL_DMA_requestChannel(hslv->DMA_Handle, hslv->SPI_SLAVE_DMA_Rx_Config); + /* 设置dma 接收完成的回调函数*/ + hslv->SPI_SLAVE_DMA_Rx_Config->XferCpltCallback = dma_rx_cb; +// prom_printk("hslv->dma_rx_ch request Channel is %d\n", hslv->dma_rx_ch); + } + + /* 申请tx dma通道*/ + if (hslv->SPI_SLAVE_DMA_Tx_Config != NULL) + { + hslv->dma_tx_ch = HAL_DMA_requestChannel(hslv->DMA_Handle, hslv->SPI_SLAVE_DMA_Tx_Config); + /* 设置dma 发送完成的回调函数*/ + hslv->SPI_SLAVE_DMA_Tx_Config->XferCpltCallback = dma_tx_cb; +// prom_printk("hslv->dma_tx_ch request Channel is %d\n", hslv->dma_tx_ch); + } + + /* 如果设备使能,需要先关闭*/ + if (__HAL_SPI_SLAVE_IS_DEV_ENABLE(hslv)) + { + __HAL_SPI_SLAVE_DISABLE(hslv); + } + + /* 屏蔽所有中断*/ + __HAL_SPI_SLAVE_MASK_ALL_IT(hslv); + + /* 清除所有中断*/ + __HAL_SPI_SLAVE_CLEAR_ALL_IT(hslv); + + /* 选择使用spi协议*/ + __HAL_SPI_SLAVE_SEL_SPI_PROTOCOL(hslv); + + /* 配置SPI协议相关内容*/ + CLEAR_BIT(hslv->Instance->CTRLR, (CTRLR_FRF_Msk | CTRLR_SCPOL_Msk | CTRLR_SCPH_Msk | CTRLR_SRL_Msk)); + SET_BIT(hslv->Instance->CTRLR, (hslv->Init.DataSize + | hslv->Init.CLKPolarity | hslv->Init.CLKPhase | hslv->Init.LoopMode)); + + /* 不建议在此处使能设备,在后面的发送或接收函数中会使能设备*/ + /* 使能设备*/ +// __HAL_SPI_SLAVE_ENABLE(hslv); + + + /* 初始化锁*/ + __HAL_Lock_Init(&hslv->Lock); + hslv->State = HAL_SPI_SLAVE_STATE_READY; + + return HAL_OK; +} + +/** + * @brief 取消初始化SPI_SLAVE外围设备 + * @param 指向包含SPI_SLAVE模块配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @retval HAL 状态 + */ +HAL_StatusTypeDef HAL_SPI_SLAVE_DeInit(SPI_SLAVE_HandleTypeDef *hslv) +{ + /* 检查分配的SPI_SLAVE句柄 */ + if (hslv == NULL) { + return HAL_ERROR; + } + + /* 检查参数 */ + assert_param(IS_SPI_SLAVE_ALL_INSTANCE(hslv->Instance)); + + hslv->State = HAL_SPI_SLAVE_STATE_BUSY; + + /* 如果设备关闭,需要先开启*/ + if (!__HAL_SPI_SLAVE_IS_DEV_ENABLE(hslv)) + { + __HAL_SPI_SLAVE_ENABLE(hslv); + } + + /* 释放dma 申请的Tx通道*/ + if (hslv->SPI_SLAVE_DMA_Tx_Config) + { + hslv->dma_tx_ch = HAL_DMA_releseChannel(hslv->DMA_Handle, hslv->dma_tx_ch); + } + + /* 释放dma 申请的Rx通道*/ + if (hslv->SPI_SLAVE_DMA_Rx_Config) + { + hslv->dma_rx_ch = HAL_DMA_releseChannel(hslv->DMA_Handle, hslv->dma_rx_ch); + } + + /* 释放DMA控制器*/ + HAL_DMA_DeInit(hslv->DMA_Handle); + + /* 确认设备是否关闭*/ + if (__HAL_SPI_SLAVE_IS_DEV_ENABLE(hslv)) + { + __HAL_SPI_SLAVE_DISABLE(hslv); + } + + hslv->State = HAL_SPI_STATE_RESET; + + return HAL_OK; +} + +/** + * @brief 中断模式传输批量数据(IT) + * @param 指向包含指定SPI_SLAVE配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @param 指向数据缓冲区的pData指针 + * @param 数据长度 + * @retval HAL 状态 + */ +HAL_StatusTypeDef HAL_SPI_SLAVE_Transmit_IT(SPI_SLAVE_HandleTypeDef *hslv, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + + if ( (hslv == NULL) || (pData == NULL) || (Size == 0U)) { + errorcode = HAL_ERROR; + goto error; + } + + if (hslv->State != HAL_SPI_SLAVE_STATE_READY) { + errorcode = HAL_BUSY; + goto error; + } + + /* 进程锁定*/ + __HAL_Lock(&hslv->Lock); + + hslv->pTxBuffPtr = (void *)pData; + hslv->TxXferSize = Size; + hslv->TxXferCount = 0; + + /* 如果设备使能,需要先关闭*/ + if (__HAL_SPI_SLAVE_IS_DEV_ENABLE(hslv)) + { + __HAL_SPI_SLAVE_DISABLE(hslv); + } + + /* 只发送模式配置 */ + __HAL_SPI_SLAVE_SET_MODE(hslv, SPI_SLAVE_MODE_ONLY_TRANSMIT); + + /* 当数据总量大于32个时设置发送阈值*/ + if (hslv->TxXferSize > 32) + { + /* 不建议修改此处的发送阈值*/ + __HAL_SPI_SLAVE_TFIFO_THRESHOLD(hslv, 32); + /* 打开发送错误状态中断*/ + __HAL_SPI_SLAVE_SET_INTERRUPT(hslv, (SPI_SLAVE_INTERRUPT_TXOIS | SPI_SLAVE_INTERRUPT_TXEIS)); + } + /* 如果需要发送的数据总量小于32个采用手动发送的方式,且不再设置发送阈值*/ + else + { + hslv->TxISR(hslv); + } + + hslv->State = HAL_SPI_SLAVE_STATE_BUSY_TX; + + /* 使能设备*/ + __HAL_SPI_SLAVE_ENABLE(hslv); + + /* 进程解锁 */ + __HAL_UnLock(&hslv->Lock); + +error: + return errorcode; +} + + +/** + * @brief 中断模式接收批量数据(IT) + * @param 指向包含指定SPI_SLAVE配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @param 指向数据缓冲区的pData指针 + * @param 数据长度 + * @retval HAL 状态 + */ +HAL_StatusTypeDef HAL_SPI_SLAVE_Receive_IT(SPI_SLAVE_HandleTypeDef *hslv, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + uint32_t rx_cnt = 0; + + if ((hslv == NULL) || (pData == NULL) || (Size == 0U)) { + errorcode = HAL_ERROR; + goto error; + } + + if (hslv->State != HAL_SPI_SLAVE_STATE_READY) { + errorcode = HAL_BUSY; + goto error; + } + + /* 进程锁定*/ + __HAL_Lock(&hslv->Lock); + + hslv->pRxBuffPtr = (void *)pData; + hslv->RxXferSize = Size; + hslv->RxXferCount = 0; + + /* 如果设备使能,需要先关闭*/ + if (__HAL_SPI_SLAVE_IS_DEV_ENABLE(hslv)) + { + __HAL_SPI_SLAVE_DISABLE(hslv); + } + + /* 清状态,清除rfifo中的残余数据 */ + if ((rx_cnt = __HAL_SPI_SLAVE_RFIFO_COUNT(hslv))) + { + for (int i = 0; i < rx_cnt; i++) + __HAL_SPI_SLAVE_READ_RFIFO(hslv); + } + + /* 只发送模式配置 */ + __HAL_SPI_SLAVE_SET_MODE(hslv, SPI_SLAVE_MODE_ONLY_RECEIVE); + + /* 设置接收阈值, 并打开接收和接收错误状态中断 */ + __HAL_SPI_SLAVE_RFIFO_THRESHOLD(hslv, 0); + __HAL_SPI_SLAVE_SET_INTERRUPT(hslv, (IMR_RXFIM_Msk | IMR_RXOIM_Msk | IMR_RXUIM_Msk)); + hslv->State = HAL_SPI_SLAVE_STATE_BUSY_RX; + + /* 使能设备*/ + __HAL_SPI_SLAVE_ENABLE(hslv); + + /* 进程解锁 */ + __HAL_UnLock(&hslv->Lock); + +error: + return errorcode; +} + +/** + * @brief 中断模式传输和接收批量数据(IT) + * @param 指向包含指定SPI_SLAVE配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @param 指向传输数据缓冲区的pTxData指针 + * @param 指向接收数据缓冲区的pRxData指针 + * @param 数据长度 + * @retval HAL 状态 + */ +HAL_StatusTypeDef HAL_SPI_SLAVE_TransmitReceive_IT(SPI_SLAVE_HandleTypeDef *hslv, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + + if ((hslv == NULL) || (pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) { + errorcode = HAL_ERROR; + goto error; + } + + if (!(hslv->State == HAL_SPI_SLAVE_STATE_READY)) { + errorcode = HAL_BUSY; + goto error; + } + + /* 进程锁定*/ + __HAL_Lock(&hslv->Lock); + + /* 配置发送buffer相关信息*/ + hslv->pTxBuffPtr = (void *)pTxData; + hslv->TxXferSize = Size; + hslv->TxXferCount = 0; + + /* 配置接受buffer相关信息*/ + hslv->pRxBuffPtr = (void *)pRxData; + hslv->RxXferSize = Size; + hslv->RxXferCount = 0; + + /* 如果设备使能,需要先关闭*/ + if (__HAL_SPI_SLAVE_IS_DEV_ENABLE(hslv)) + { + __HAL_SPI_SLAVE_DISABLE(hslv); + } + + /* 发送并接收模式配置 */ + __HAL_SPI_SLAVE_SET_MODE(hslv, SPI_SLAVE_MODE_TRANSMIT_AND_RECEIVE); + + /* 当发送数据总量大于32个时设置发送阈值*/ + if (hslv->TxXferSize > 32) + { + /*不建议修改此阈值*/ + __HAL_SPI_SLAVE_TFIFO_THRESHOLD(hslv, 32); + /* 打开发送错误状态中断*/ + __HAL_SPI_SLAVE_SET_INTERRUPT(hslv, (SPI_SLAVE_INTERRUPT_TXOIS | SPI_SLAVE_INTERRUPT_TXEIS)); + } + /* 如果需要发送的数据总量小于32个采用手动发送的方式,且不再设置发送阈值*/ + else + { + hslv->TxISR(hslv); + } + + /* 设置接收阈值, 并打开接收和接收错误状态中断,不建议修改此阈值*/ + __HAL_SPI_SLAVE_RFIFO_THRESHOLD(hslv, 0); + __HAL_SPI_SLAVE_SET_INTERRUPT(hslv, (IMR_RXFIM_Msk | IMR_RXOIM_Msk | IMR_RXUIM_Msk)); + + hslv->State = HAL_SPI_SLAVE_STATE_BUSY_TX_RX; + + /* 使能设备*/ + __HAL_SPI_SLAVE_ENABLE(hslv); + + /* 进程解锁 */ + __HAL_UnLock(&hslv->Lock); + +error: + return errorcode; +} + +/** + * @brief dma传输批量数据(DMA) + * @param 指向包含指定SPI_SLAVE配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @param 指向传输数据缓冲区的pData指针 + * @param 数据长度 + * @retval HAL 状态 + */ +HAL_StatusTypeDef HAL_SPI_SLAVE_DMA_Transmit(SPI_SLAVE_HandleTypeDef *hslv,uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + + if ((hslv == NULL) || (pData == NULL) || (Size == 0U)) { + errorcode = HAL_ERROR; + goto error; + } + + if (hslv->State != HAL_SPI_SLAVE_STATE_READY) { + errorcode = HAL_BUSY; + goto error; + } + + /* 进程锁定*/ + __HAL_Lock(&hslv->Lock); + + /* 配置发送buffer相关信息*/ + hslv->pTxBuffPtr = (void *)pData; + hslv->TxXferSize = Size; + hslv->TxXferCount = 0; + + /* 如果设备使能,需要先关闭*/ + if (__HAL_SPI_SLAVE_IS_DEV_ENABLE(hslv)) + { + __HAL_SPI_SLAVE_DISABLE(hslv); + } + + /* 只接收模式配置 */ + __HAL_SPI_SLAVE_SET_MODE(hslv, SPI_SLAVE_MODE_ONLY_TRANSMIT); + + /* 设置DMA发送阈值, 并使能Transmit DMA*/ + /* Note: 不建议修改此处的阈值*/ + __HAL_SPI_SLAVE_TFIFO_DMA_THRESHOLD(hslv, 32); + __HAL_SPI_SLAVE_ENABLE_DMA(hslv, DMACR_TDMAE_Msk); + + /* 屏蔽RXFIS和TXEIS中断*/ + __HAL_SPI_SLAVE_MASK_ALL_IT(hslv); + __HAL_SPI_SLAVE_SET_INTERRUPT(hslv, IMR_TXOIM_Msk); + + /* 开启dma传输*/ + HAL_DMA_Start(hslv->DMA_Handle, hslv->SPI_SLAVE_DMA_Tx_Config->Channel); + + /* 使能spi slave控制器*/ + __HAL_SPI_SLAVE_ENABLE(hslv); + + hslv->State = HAL_SPI_SLAVE_STATE_BUSY_TX; + + /* 进程解锁 */ + __HAL_UnLock(&hslv->Lock); + +error: + return errorcode; + +} + +/** + * @brief dma批量接收数据(DMA) + * @param 指向包含指定SPI_SLAVE配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @param 指向接收数据缓冲区的pData指针 + * @param 数据长度 + * @retval HAL 状态 + */ +HAL_StatusTypeDef HAL_SPI_SLAVE_DMA_Receive(SPI_SLAVE_HandleTypeDef *hslv,uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + int rx_cnt = 0; + + if ((hslv == NULL) || (pData == NULL) || (Size == 0U)) { + errorcode = HAL_ERROR; + goto error; + } + + if (hslv->State != HAL_SPI_SLAVE_STATE_READY) { + errorcode = HAL_BUSY; + goto error; + } + + /* 进程锁定*/ + __HAL_Lock(&hslv->Lock); + + /* 配置接受buffer相关信息*/ + hslv->pRxBuffPtr = (void *)pData; + hslv->RxXferSize = Size; + hslv->RxXferCount = 0; + + /* 如果设备使能,需要先关闭*/ + if (__HAL_SPI_SLAVE_IS_DEV_ENABLE(hslv)) + { + __HAL_SPI_SLAVE_DISABLE(hslv); + } + + /* 清状态,清除rfifo中的残余数据 */ + if ((rx_cnt = __HAL_SPI_SLAVE_RFIFO_COUNT(hslv))) + { + for (int i = 0; i < rx_cnt; i++) + __HAL_SPI_SLAVE_READ_RFIFO(hslv); + } + + /* 只接收模式配置 */ + __HAL_SPI_SLAVE_SET_MODE(hslv, SPI_SLAVE_MODE_ONLY_RECEIVE); + + /* 设置DMA接收阈值, 并使能Receive DMA*/ + /* Note: 不建议修改此处的阈值*/ + __HAL_SPI_SLAVE_RFIFO_DMA_THRESHOLD(hslv, 0); + __HAL_SPI_SLAVE_ENABLE_DMA(hslv, DMACR_RDMAE_Msk); + + /* 屏蔽RXFIS和TXEIS中断*/ + __HAL_SPI_SLAVE_MASK_ALL_IT(hslv); + __HAL_SPI_SLAVE_SET_INTERRUPT(hslv, (IMR_RXOIM_Msk | IMR_RXUIM_Msk)); + + /* 开启dma传输*/ + HAL_DMA_Start(hslv->DMA_Handle, hslv->SPI_SLAVE_DMA_Rx_Config->Channel); + + /* 使能spi slave控制器*/ + __HAL_SPI_SLAVE_ENABLE(hslv); + + hslv->State = HAL_SPI_SLAVE_STATE_BUSY_RX; + + /* 进程解锁 */ + __HAL_UnLock(&hslv->Lock); + +error: + return errorcode; + +} + +/** + * @brief dma批量传输和接收数据(DMA) + * @param 指向包含指定SPI_SLAVE配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @param 指向发送数据缓冲区的pTxData指针 + * @param 指向接收数据缓冲区的pRxData指针 + * @param 数据长度 + * @retval HAL 状态 + */ +HAL_StatusTypeDef HAL_SPI_SLAVE_DMA_TransmitReceive(SPI_SLAVE_HandleTypeDef *hslv, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + int rx_cnt = 0; + + if ((hslv == NULL) || (pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) { + errorcode = HAL_ERROR; + goto error; + } + + if (!(hslv->State == HAL_SPI_SLAVE_STATE_READY)) { + errorcode = HAL_BUSY; + goto error; + } + + /* 进程锁定*/ + __HAL_Lock(&hslv->Lock); + + /* 配置发送buffer相关信息*/ + hslv->pTxBuffPtr = (void *)pTxData; + hslv->TxXferSize = Size; + hslv->TxXferCount = 0; + + /* 配置接受buffer相关信息*/ + hslv->pRxBuffPtr = (void *)pRxData; + hslv->RxXferSize = Size; + hslv->RxXferCount = 0; + + + /* 如果设备使能,需要先关闭*/ + if (__HAL_SPI_SLAVE_IS_DEV_ENABLE(hslv)) + { + __HAL_SPI_SLAVE_DISABLE(hslv); + } + + /* 清状态,清除rfifo中的残余数据 */ + if ((rx_cnt = __HAL_SPI_SLAVE_RFIFO_COUNT(hslv))) + { + for (int i = 0; i < rx_cnt; i++) + __HAL_SPI_SLAVE_READ_RFIFO(hslv); + } + + /* 发送并接收模式配置 */ + __HAL_SPI_SLAVE_SET_MODE(hslv, SPI_SLAVE_MODE_TRANSMIT_AND_RECEIVE); + + + /* 设置DMA发送和接收阈值, 并使能Transmit DMA和Receive DMA*/ + /* Note: 不建议修改此处的阈值*/ + __HAL_SPI_SLAVE_TFIFO_DMA_THRESHOLD(hslv, 32); + __HAL_SPI_SLAVE_RFIFO_DMA_THRESHOLD(hslv, 0); + __HAL_SPI_SLAVE_ENABLE_DMA(hslv, (DMACR_TDMAE_Msk | DMACR_RDMAE_Msk)); + + /* 开启dma传输*/ + HAL_DMA_Start(hslv->DMA_Handle, hslv->SPI_SLAVE_DMA_Tx_Config->Channel); + HAL_DMA_Start(hslv->DMA_Handle, hslv->SPI_SLAVE_DMA_Rx_Config->Channel); + + /* 屏蔽RXFIS和TXEIS中断*/ + __HAL_SPI_SLAVE_MASK_ALL_IT(hslv); + __HAL_SPI_SLAVE_SET_INTERRUPT(hslv, (IMR_RXOIM_Msk | IMR_RXUIM_Msk | IMR_TXOIM_Msk)); + + /* 使能spi slave控制器*/ + __HAL_SPI_SLAVE_ENABLE(hslv); + + hslv->State = HAL_SPI_SLAVE_STATE_BUSY_TX_RX; + + /* 进程解锁 */ + __HAL_UnLock(&hslv->Lock); + +error: + return errorcode; +} + +/** + * @brief SPI_SLAVE中断处理函数 + * @param 中断号irq + * @param 外部参数data + * @retval None + */ +void HAL_SPI_SLAVE_IRQHandler(int irq, void *data) +{ + SPI_SLAVE_HandleTypeDef *hslv = (SPI_SLAVE_HandleTypeDef *)data; + uint32_t interrupt = 0; + interrupt = __HAL_SPI_SLAVE_READ_INTERRUPT(hslv); + + /* RFIFO可用数据超过阈值产生的中断*/ + if (interrupt & SPI_SLAVE_INTERRUPT_RXFIS) + { + hslv->RxISR(hslv); + if (hslv->RxXferSize == hslv->RxXferCount) + { + __HAL_SPI_SLAVE_MASK_IT(hslv, IMR_RXFIM_Msk); + } +// prom_printk("RXFIS interruption occurs\n"); + } + + /* RFIFO数据溢出中断*/ + if (interrupt & SPI_SLAVE_INTERRUPT_RXOIS) + { + __HAL_SPI_SLAVE_CLEAR_RXOIS(hslv); + prom_printk("RXOIS interruption occurs\n"); + + } + + /* RFIFO数据缺少中断*/ + if (interrupt & SPI_SLAVE_INTERRUPT_RXUIS) + { + __HAL_SPI_SLAVE_CLEAR_RXUIS(hslv); + prom_printk("RXUIS interruption occurs\n"); + + } + + /* TFIFO数据溢出中断*/ + if (interrupt & SPI_SLAVE_INTERRUPT_TXOIS) + { + __HAL_SPI_SLAVE_CLEAR_TXOIS(hslv); + prom_printk("TXOIS interruption occurs\n"); + } + + /* TFIFO可用空间超过阈值产生的中断*/ + if (interrupt & SPI_SLAVE_INTERRUPT_TXEIS) + { + hslv->TxISR(hslv); + if (hslv->TxXferSize == hslv->TxXferCount) + { + __HAL_SPI_SLAVE_MASK_IT(hslv, IMR_TXEIM_Msk); + } +// prom_printk("TXEIS interruption occurs\n"); + } + +} + +/** + * @brief SPI_SLAVE数据接收或发送完成后,关闭控制器函数 + * @param 指向包含SPI_SLAVE模块配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @retval 返回-1表示参数有误,返回1表示数据传输未结束,返回0表示数据传输完成 + */ +int HAL_SPI_SLAVE_Transmit_OR_Reciver_End(SPI_SLAVE_HandleTypeDef *hslv) +{ + if (hslv == NULL) + { + goto error; + } + + /* 只有当spi slave发送、接收或者发送且接收的状态时,才可以使用该函数*/ + if (hslv->State > HAL_SPI_SLAVE_STATE_BUSY_TX_RX || hslv->State < HAL_SPI_SLAVE_STATE_BUSY_TX) + { + goto error; + } + + /* 进程锁定*/ + __HAL_Lock(&hslv->Lock); + + if (hslv->State == HAL_SPI_SLAVE_STATE_BUSY_TX) + { + /* txfifo的阈值中断被屏蔽,表示数据发送结束*/ + if (!IS_SPI_SLAVE_IT_MASKED(hslv, IMR_TXEIM_Msk) && (!__HAL_SPI_SLAVE_TFIFO_COUNT(hslv))) + { + /* 关闭控制器*/ + __HAL_SPI_SLAVE_DISABLE(hslv); + hslv->State = HAL_SPI_SLAVE_STATE_READY; + + /* 进程解锁 */ + __HAL_UnLock(&hslv->Lock); + return 0; + } + } + else if (hslv->State == HAL_SPI_SLAVE_STATE_BUSY_RX) + { + /* rxfifo的阈值中断被屏蔽,表示数据接收结束*/ + if (!IS_SPI_SLAVE_IT_MASKED(hslv, IMR_RXFIM_Msk) && (!__HAL_SPI_SLAVE_RFIFO_COUNT(hslv))) + { + /* 关闭控制器*/ + __HAL_SPI_SLAVE_DISABLE(hslv); + hslv->State = HAL_SPI_SLAVE_STATE_READY; + + /* 进程解锁 */ + __HAL_UnLock(&hslv->Lock); + return 0; + } + + } + else if (hslv->State == HAL_SPI_SLAVE_STATE_BUSY_TX_RX) + { + /* 当txfifo的阈值中断和rxfifo阈值中断都被屏蔽,表示数据发送结束*/ + if (!IS_SPI_SLAVE_IT_MASKED(hslv, IMR_TXEIM_Msk) && !IS_SPI_SLAVE_IT_MASKED(hslv, IMR_RXFIM_Msk) && (!__HAL_SPI_SLAVE_TFIFO_COUNT(hslv) && (!__HAL_SPI_SLAVE_RFIFO_COUNT(hslv)))) + { + /* 关闭控制器*/ + __HAL_SPI_SLAVE_DISABLE(hslv); + hslv->State = HAL_SPI_SLAVE_STATE_READY; + + /* 进程解锁 */ + __HAL_UnLock(&hslv->Lock); + return 0; + } + + } + + /* 进程解锁 */ + __HAL_UnLock(&hslv->Lock); + + return 1; + +error: + return -1; +} + +/** + * @brief SPI_SLAVE数据通过dma接收或发送完成后,关闭控制器函数 + * @param 指向包含SPI_SLAVE模块配置信息的SPI_SLAVE_HandleTypeDef结构的hslv指针 + * @retval 返回-1表示参数有误,返回1表示数据传输未结束,返回0表示数据传输完成 + */ +int HAL_SPI_SLAVE_DMA_Transmit_OR_Reciver_End(SPI_SLAVE_HandleTypeDef *hslv) +{ + if (hslv == NULL) + { + goto error; + } + + if ((!hslv->SPI_SLAVE_DMA_Rx_Config) && (!hslv->SPI_SLAVE_DMA_Tx_Config)) + { + goto error; + } + + /* 进程锁定*/ + __HAL_Lock(&hslv->Lock); + + /* 只有当spi slave的发送状态为HAL_SPI_SLAVE_STATE_READY时才表示数据传输完成,其他状态都表示为未完成*/ + if (hslv->State == HAL_SPI_SLAVE_STATE_READY) + { + if (!IS_SPI_SLAVE_DEV_BUSY(hslv)) + { + /* 关闭控制器*/ + __HAL_SPI_SLAVE_DISABLE(hslv); + hslv->State = HAL_SPI_SLAVE_STATE_READY; + + /* 进程解锁 */ + __HAL_UnLock(&hslv->Lock); + + return 0; + } + } + + /* 进程解锁 */ + __HAL_UnLock(&hslv->Lock); + + return 1; + +error: + return -1; +} + + +/** + * @} + */ diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/cmake-kits.json b/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/cmake-kits.json new file mode 100644 index 00000000..7a6f85df --- /dev/null +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/cmake-kits.json @@ -0,0 +1,18 @@ +[ + { + "name": "RISCV GCC for ingenic cross compile on Windows", + + "toolchainFile": "riscv32-gcc.cmake", + "preferredGenerator": { + "name":"MinGW Makefiles" + } + }, + { + "name": "RISCV GCC for ingenic cross compile on Linux", + "toolchainFile": "riscv32-gcc.cmake", + "preferredGenerator": { + "name":"Unix Makefiles" + } + } +] + \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/launch.json b/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/launch.json new file mode 100644 index 00000000..fa33e35c --- /dev/null +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/launch.json @@ -0,0 +1,55 @@ +{ + "version": "0.2.0", + "configurations": [ + // GDB Debugging: + { + "program": "${command:cmake.launchTargetPath}", + "name": "Launch (gdb)", + "request": "launch", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "openOnSessionStart", + "type": "cppdbg", + "MIMode": "gdb", + "miDebuggerPath": "riscv32-ingenicv0-elf-gdb", + "miDebuggerArgs": "", + "miDebuggerServerAddress": "localhost:3333", + "targetArchitecture": "mips", + "preLaunchTask": "adb forward", + "customLaunchSetupCommands": [ + { + "description": "gdb 启用整齐打印", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "text":"cd ${workspaceFolder}", + "ignoreFailures": false + }, + { + "text":"file build/${command:cmake.buildType}/${command:cmake.launchTargetFilename}", + "ignoreFailures": false + }, + { + "text": "target remote localhost:3333", + "ignoreFailures": false + }, + { + "text": "monitor reset halt", + "ignoreFailures": false + }, + { + "text": "load", + "ignoreFailures": false + } + ], + "logging": { + "engineLogging": false, + "programOutput": true + } + } + ] + } + \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/settings.json b/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/settings.json new file mode 100644 index 00000000..3bf856fb --- /dev/null +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "cmake.buildDirectory": "${workspaceFolder}/build/${buildType}", + "files.associations": { + "*.build": "makefile", + "*.mk": "makefile", + "Makefile*": "makefile" + } +} diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/tasks.json b/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/tasks.json new file mode 100644 index 00000000..53b4731e --- /dev/null +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "adb forward", + "type": "shell", + "command": "adb forward tcp:3333 tcp:3333", + }, + ] +} \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/include/x2600_hal_conf.h b/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/include/x2600_hal_conf.h index a2f6791b..e663b463 100644 --- a/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/include/x2600_hal_conf.h +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_dma/include/x2600_hal_conf.h @@ -9,18 +9,24 @@ /* Hal Module selections. */ -#define HAL_MSC_ENABLED -#define HAL_I2C_ENABLED #define HAL_UART_ENABLED #define HAL_ADC_ENABLED +#define HAL_AIC_ENABLED #define HAL_SPI_ENABLED +#if 0 +#define HAL_MSC_ENABLED #define HAL_WDT_ENABLED -#define HAL_TCU_ENABLED #define HAL_RTC_ENABLED #define HAL_EFUSE_ENABLED -#define HAL_PWM_ENABLED #define HAL_GMAC_ENABLED #define HAL_USB_ENABLED +#define HAL_I2C_ENABLED +#define HAL_PWM_ENABLED +#define HAL_TCU_ENABLED +#define HAL_DPU_ENABLED +#define HAL_DPU_MIPI_ENABLED +#define HAL_SPI_SLAVE_ENABLED +#endif /* 系统时钟配配置,通过工具生成,随开发板或者平台变化.*/ #include @@ -31,13 +37,26 @@ #include "x2600_ll_ost_global.h" #include "x2600_ll_cpm.h" #include "x2600_ll_gpio.h" +#ifdef CORE_RISCV +//#include "x2600_ll_risc_ccu.h" +#endif #include "x2600_hal_pdma.h" -//#include "x2600_hal_sfcnor.h" +#ifdef HAL_DPU_ENABLED +#include "x2600_hal_lcd.h" +#endif + +#ifdef HAL_DPU_MIPI_ENABLED +#include "x2600_ll_mipi_dsi.h" +#include "x2600_hal_mipi_dsi.h" +#endif #ifdef HAL_MSC_ENABLED +#endif +#ifdef HAL_NOR_FLASH_ENABLED +#include "x2600_hal_sfc.h" #endif #ifdef HAL_I2C_ENABLED @@ -49,13 +68,17 @@ #endif #ifdef HAL_ADC_ENABLED -#include "x2600_hal_adc.h" +#include "x2600_hal_sadc.h" #endif #ifdef HAL_SPI_ENABLED #include "x2600_hal_ssi.h" #endif +#ifdef HAL_SPI_SLAVE_ENABLED +#include "x2600_hal_ssi_slave.h" +#endif + #ifdef HAL_WDT_ENABLED #include "x2600_hal_wdt.h" #endif @@ -86,6 +109,14 @@ #include "x2600_hal_pcd_ex.h" #endif +#ifdef HAL_AIC_ENABLED +#include "x2600_hal_aic.h" +#endif + +#ifdef HAL_ICODEC_ENABLED +#include "x2600_hal_icodec.h" +#endif + #ifdef __cplusplus extern "C" { #endif diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/cmake-kits.json b/projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/cmake-kits.json new file mode 100644 index 00000000..7a6f85df --- /dev/null +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/cmake-kits.json @@ -0,0 +1,18 @@ +[ + { + "name": "RISCV GCC for ingenic cross compile on Windows", + + "toolchainFile": "riscv32-gcc.cmake", + "preferredGenerator": { + "name":"MinGW Makefiles" + } + }, + { + "name": "RISCV GCC for ingenic cross compile on Linux", + "toolchainFile": "riscv32-gcc.cmake", + "preferredGenerator": { + "name":"Unix Makefiles" + } + } +] + \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/launch.json b/projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/launch.json new file mode 100644 index 00000000..fa33e35c --- /dev/null +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/launch.json @@ -0,0 +1,55 @@ +{ + "version": "0.2.0", + "configurations": [ + // GDB Debugging: + { + "program": "${command:cmake.launchTargetPath}", + "name": "Launch (gdb)", + "request": "launch", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "openOnSessionStart", + "type": "cppdbg", + "MIMode": "gdb", + "miDebuggerPath": "riscv32-ingenicv0-elf-gdb", + "miDebuggerArgs": "", + "miDebuggerServerAddress": "localhost:3333", + "targetArchitecture": "mips", + "preLaunchTask": "adb forward", + "customLaunchSetupCommands": [ + { + "description": "gdb 启用整齐打印", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "text":"cd ${workspaceFolder}", + "ignoreFailures": false + }, + { + "text":"file build/${command:cmake.buildType}/${command:cmake.launchTargetFilename}", + "ignoreFailures": false + }, + { + "text": "target remote localhost:3333", + "ignoreFailures": false + }, + { + "text": "monitor reset halt", + "ignoreFailures": false + }, + { + "text": "load", + "ignoreFailures": false + } + ], + "logging": { + "engineLogging": false, + "programOutput": true + } + } + ] + } + \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/settings.json b/projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/settings.json new file mode 100644 index 00000000..3bf856fb --- /dev/null +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "cmake.buildDirectory": "${workspaceFolder}/build/${buildType}", + "files.associations": { + "*.build": "makefile", + "*.mk": "makefile", + "Makefile*": "makefile" + } +} diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/tasks.json b/projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/tasks.json new file mode 100644 index 00000000..53b4731e --- /dev/null +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_it/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "adb forward", + "type": "shell", + "command": "adb forward tcp:3333 tcp:3333", + }, + ] +} \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_it/include/x2600_hal_conf.h b/projects/x2660-halley/Examples/spi/spi_fullduplex_it/include/x2600_hal_conf.h index a2f6791b..e663b463 100644 --- a/projects/x2660-halley/Examples/spi/spi_fullduplex_it/include/x2600_hal_conf.h +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_it/include/x2600_hal_conf.h @@ -9,18 +9,24 @@ /* Hal Module selections. */ -#define HAL_MSC_ENABLED -#define HAL_I2C_ENABLED #define HAL_UART_ENABLED #define HAL_ADC_ENABLED +#define HAL_AIC_ENABLED #define HAL_SPI_ENABLED +#if 0 +#define HAL_MSC_ENABLED #define HAL_WDT_ENABLED -#define HAL_TCU_ENABLED #define HAL_RTC_ENABLED #define HAL_EFUSE_ENABLED -#define HAL_PWM_ENABLED #define HAL_GMAC_ENABLED #define HAL_USB_ENABLED +#define HAL_I2C_ENABLED +#define HAL_PWM_ENABLED +#define HAL_TCU_ENABLED +#define HAL_DPU_ENABLED +#define HAL_DPU_MIPI_ENABLED +#define HAL_SPI_SLAVE_ENABLED +#endif /* 系统时钟配配置,通过工具生成,随开发板或者平台变化.*/ #include @@ -31,13 +37,26 @@ #include "x2600_ll_ost_global.h" #include "x2600_ll_cpm.h" #include "x2600_ll_gpio.h" +#ifdef CORE_RISCV +//#include "x2600_ll_risc_ccu.h" +#endif #include "x2600_hal_pdma.h" -//#include "x2600_hal_sfcnor.h" +#ifdef HAL_DPU_ENABLED +#include "x2600_hal_lcd.h" +#endif + +#ifdef HAL_DPU_MIPI_ENABLED +#include "x2600_ll_mipi_dsi.h" +#include "x2600_hal_mipi_dsi.h" +#endif #ifdef HAL_MSC_ENABLED +#endif +#ifdef HAL_NOR_FLASH_ENABLED +#include "x2600_hal_sfc.h" #endif #ifdef HAL_I2C_ENABLED @@ -49,13 +68,17 @@ #endif #ifdef HAL_ADC_ENABLED -#include "x2600_hal_adc.h" +#include "x2600_hal_sadc.h" #endif #ifdef HAL_SPI_ENABLED #include "x2600_hal_ssi.h" #endif +#ifdef HAL_SPI_SLAVE_ENABLED +#include "x2600_hal_ssi_slave.h" +#endif + #ifdef HAL_WDT_ENABLED #include "x2600_hal_wdt.h" #endif @@ -86,6 +109,14 @@ #include "x2600_hal_pcd_ex.h" #endif +#ifdef HAL_AIC_ENABLED +#include "x2600_hal_aic.h" +#endif + +#ifdef HAL_ICODEC_ENABLED +#include "x2600_hal_icodec.h" +#endif + #ifdef __cplusplus extern "C" { #endif diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/cmake-kits.json b/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/cmake-kits.json new file mode 100644 index 00000000..7a6f85df --- /dev/null +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/cmake-kits.json @@ -0,0 +1,18 @@ +[ + { + "name": "RISCV GCC for ingenic cross compile on Windows", + + "toolchainFile": "riscv32-gcc.cmake", + "preferredGenerator": { + "name":"MinGW Makefiles" + } + }, + { + "name": "RISCV GCC for ingenic cross compile on Linux", + "toolchainFile": "riscv32-gcc.cmake", + "preferredGenerator": { + "name":"Unix Makefiles" + } + } +] + \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/launch.json b/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/launch.json new file mode 100644 index 00000000..fa33e35c --- /dev/null +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/launch.json @@ -0,0 +1,55 @@ +{ + "version": "0.2.0", + "configurations": [ + // GDB Debugging: + { + "program": "${command:cmake.launchTargetPath}", + "name": "Launch (gdb)", + "request": "launch", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "openOnSessionStart", + "type": "cppdbg", + "MIMode": "gdb", + "miDebuggerPath": "riscv32-ingenicv0-elf-gdb", + "miDebuggerArgs": "", + "miDebuggerServerAddress": "localhost:3333", + "targetArchitecture": "mips", + "preLaunchTask": "adb forward", + "customLaunchSetupCommands": [ + { + "description": "gdb 启用整齐打印", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "text":"cd ${workspaceFolder}", + "ignoreFailures": false + }, + { + "text":"file build/${command:cmake.buildType}/${command:cmake.launchTargetFilename}", + "ignoreFailures": false + }, + { + "text": "target remote localhost:3333", + "ignoreFailures": false + }, + { + "text": "monitor reset halt", + "ignoreFailures": false + }, + { + "text": "load", + "ignoreFailures": false + } + ], + "logging": { + "engineLogging": false, + "programOutput": true + } + } + ] + } + \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/settings.json b/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/settings.json new file mode 100644 index 00000000..3bf856fb --- /dev/null +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "cmake.buildDirectory": "${workspaceFolder}/build/${buildType}", + "files.associations": { + "*.build": "makefile", + "*.mk": "makefile", + "Makefile*": "makefile" + } +} diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/tasks.json b/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/tasks.json new file mode 100644 index 00000000..53b4731e --- /dev/null +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "adb forward", + "type": "shell", + "command": "adb forward tcp:3333 tcp:3333", + }, + ] +} \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/include/x2600_hal_conf.h b/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/include/x2600_hal_conf.h index a2f6791b..e663b463 100644 --- a/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/include/x2600_hal_conf.h +++ b/projects/x2660-halley/Examples/spi/spi_fullduplex_polling/include/x2600_hal_conf.h @@ -9,18 +9,24 @@ /* Hal Module selections. */ -#define HAL_MSC_ENABLED -#define HAL_I2C_ENABLED #define HAL_UART_ENABLED #define HAL_ADC_ENABLED +#define HAL_AIC_ENABLED #define HAL_SPI_ENABLED +#if 0 +#define HAL_MSC_ENABLED #define HAL_WDT_ENABLED -#define HAL_TCU_ENABLED #define HAL_RTC_ENABLED #define HAL_EFUSE_ENABLED -#define HAL_PWM_ENABLED #define HAL_GMAC_ENABLED #define HAL_USB_ENABLED +#define HAL_I2C_ENABLED +#define HAL_PWM_ENABLED +#define HAL_TCU_ENABLED +#define HAL_DPU_ENABLED +#define HAL_DPU_MIPI_ENABLED +#define HAL_SPI_SLAVE_ENABLED +#endif /* 系统时钟配配置,通过工具生成,随开发板或者平台变化.*/ #include @@ -31,13 +37,26 @@ #include "x2600_ll_ost_global.h" #include "x2600_ll_cpm.h" #include "x2600_ll_gpio.h" +#ifdef CORE_RISCV +//#include "x2600_ll_risc_ccu.h" +#endif #include "x2600_hal_pdma.h" -//#include "x2600_hal_sfcnor.h" +#ifdef HAL_DPU_ENABLED +#include "x2600_hal_lcd.h" +#endif + +#ifdef HAL_DPU_MIPI_ENABLED +#include "x2600_ll_mipi_dsi.h" +#include "x2600_hal_mipi_dsi.h" +#endif #ifdef HAL_MSC_ENABLED +#endif +#ifdef HAL_NOR_FLASH_ENABLED +#include "x2600_hal_sfc.h" #endif #ifdef HAL_I2C_ENABLED @@ -49,13 +68,17 @@ #endif #ifdef HAL_ADC_ENABLED -#include "x2600_hal_adc.h" +#include "x2600_hal_sadc.h" #endif #ifdef HAL_SPI_ENABLED #include "x2600_hal_ssi.h" #endif +#ifdef HAL_SPI_SLAVE_ENABLED +#include "x2600_hal_ssi_slave.h" +#endif + #ifdef HAL_WDT_ENABLED #include "x2600_hal_wdt.h" #endif @@ -86,6 +109,14 @@ #include "x2600_hal_pcd_ex.h" #endif +#ifdef HAL_AIC_ENABLED +#include "x2600_hal_aic.h" +#endif + +#ifdef HAL_ICODEC_ENABLED +#include "x2600_hal_icodec.h" +#endif + #ifdef __cplusplus extern "C" { #endif diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/cmake-kits.json b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/cmake-kits.json new file mode 100644 index 00000000..7a6f85df --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/cmake-kits.json @@ -0,0 +1,18 @@ +[ + { + "name": "RISCV GCC for ingenic cross compile on Windows", + + "toolchainFile": "riscv32-gcc.cmake", + "preferredGenerator": { + "name":"MinGW Makefiles" + } + }, + { + "name": "RISCV GCC for ingenic cross compile on Linux", + "toolchainFile": "riscv32-gcc.cmake", + "preferredGenerator": { + "name":"Unix Makefiles" + } + } +] + \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/launch.json b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/launch.json new file mode 100644 index 00000000..fa33e35c --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/launch.json @@ -0,0 +1,55 @@ +{ + "version": "0.2.0", + "configurations": [ + // GDB Debugging: + { + "program": "${command:cmake.launchTargetPath}", + "name": "Launch (gdb)", + "request": "launch", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "openOnSessionStart", + "type": "cppdbg", + "MIMode": "gdb", + "miDebuggerPath": "riscv32-ingenicv0-elf-gdb", + "miDebuggerArgs": "", + "miDebuggerServerAddress": "localhost:3333", + "targetArchitecture": "mips", + "preLaunchTask": "adb forward", + "customLaunchSetupCommands": [ + { + "description": "gdb 启用整齐打印", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "text":"cd ${workspaceFolder}", + "ignoreFailures": false + }, + { + "text":"file build/${command:cmake.buildType}/${command:cmake.launchTargetFilename}", + "ignoreFailures": false + }, + { + "text": "target remote localhost:3333", + "ignoreFailures": false + }, + { + "text": "monitor reset halt", + "ignoreFailures": false + }, + { + "text": "load", + "ignoreFailures": false + } + ], + "logging": { + "engineLogging": false, + "programOutput": true + } + } + ] + } + \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/settings.json b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/settings.json new file mode 100644 index 00000000..3bf856fb --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "cmake.buildDirectory": "${workspaceFolder}/build/${buildType}", + "files.associations": { + "*.build": "makefile", + "*.mk": "makefile", + "Makefile*": "makefile" + } +} diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/tasks.json b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/tasks.json new file mode 100644 index 00000000..53b4731e --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "adb forward", + "type": "shell", + "command": "adb forward tcp:3333 tcp:3333", + }, + ] +} \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/CMakeLists.txt b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/CMakeLists.txt new file mode 100644 index 00000000..d049504f --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/CMakeLists.txt @@ -0,0 +1,111 @@ +cmake_minimum_required(VERSION 3.8) +# +# Core project settings +# +Project(ssi_slave_dma) # Modified +enable_language(C CXX ASM) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +# Setup compiler settings +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_C_EXTENSIONS ON) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS ON) +set(PROJ_PATH ${CMAKE_CURRENT_SOURCE_DIR}) +set(SDK_PATH ${PROJ_PATH}/../../../../../) +message("Build type: " ${CMAKE_BUILD_TYPE}) + +# Set linker script +set(linker_script_SRC ${SDK_PATH}/cpu/core-riscv/ld.lds) # Modified +set(EXECUTABLE ${CMAKE_PROJECT_NAME}) +set(CPU_PARAMETERS "-march=rv32imc -mabi=ilp32 -Wno-abi") + +set(CMAKE_ASM_FLAGS "${CPU_PARAMETERS} -D_ASSEMBLER_ -D__ASSEMBLY__") + +set(CMAKE_C_FLAGS "${CPU_PARAMETERS} -fno-pic -fno-builtin -fomit-frame-pointer -Wall -nostdlib -Wall -fdata-sections -ffunction-sections") + +# Compiler options + +if(CMAKE_BUILD_TYPE STREQUAL Debug) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g -ggdb -DDEBUG") +else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") +endif() + +set(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS}) + +set(CMAKE_LD_FLAGS "${CPU_PARAMETERS}") + + +set(sources_SRCS # Modified + ${SDK_PATH}/cpu/core-riscv/spinlock.c + ${SDK_PATH}/cpu/core-riscv/start.S + ${SDK_PATH}/cpu/core-riscv/genex.S + ${SDK_PATH}/cpu/core-riscv/traps.c + ${SDK_PATH}/cpu/soc-x2600/src/interrupt.c + ${SDK_PATH}/cpu/soc-x2600/src/serial.c + ${SDK_PATH}/cpu/soc-x2600/src/startup.c + ${SDK_PATH}/drivers/drivers-x2600/src/x2600_hal_def.c + ${SDK_PATH}/drivers/drivers-x2600/src/x2600_hal_pdma.c + ${SDK_PATH}/drivers/drivers-x2600/src/x2600_hal_ssi_slave.c + ${SDK_PATH}/drivers/drivers-x2600/src/x2600_hal_tick_risc_ccu.c + ${SDK_PATH}/drivers/drivers-x2600/src/x2600_ll_cpm.c + ${SDK_PATH}/lib/libc/minimal/ctype.c + ${SDK_PATH}/lib/libc/minimal/div64.c + ${SDK_PATH}/lib/libc/minimal/string.c + ${SDK_PATH}/lib/libc/minimal/vsprintf.c + main.c + +) + +if(CMAKE_EXPORT_COMPILE_COMMANDS) + set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}) + set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) +endif() + +# +# Include directories +# +#set(include_path_DIRS +# Modified + +include_directories( + ${PROJ_PATH}/include + ${SDK_PATH}/lib/libc/minimal/include + ${SDK_PATH}/drivers/drivers-x2600/include + ${SDK_PATH}/cpu/core-riscv/include + ${SDK_PATH}/cpu/soc-x2600/include + +) + +# +# -L libdirs. +# +link_directories( +#path/to/lib +) + +# Executable files +add_executable(${EXECUTABLE} ${sources_SRCS}) + +# Linker options +target_link_libraries(${EXECUTABLE} PRIVATE + -T${linker_script_SRC} + ${CMAKE_LD_FLAGS} + -Wl,-Map=${CMAKE_PROJECT_NAME}.map,--cref + -Wl,--gc-sections + -Wl,--start-group + -Wl,--end-group + -Wl,--print-memory-usage +) + +# Execute post-build to print size +add_custom_command(TARGET ${EXECUTABLE} POST_BUILD + COMMAND ${CMAKE_SIZE} $ +) + +# Convert output to hex and binary +add_custom_command(TARGET ${EXECUTABLE} POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -O binary $ ${EXECUTABLE}.bin + ) diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/Makefile b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/Makefile new file mode 100644 index 00000000..409ce329 --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/Makefile @@ -0,0 +1,176 @@ +###################################### +# target +###################################### +TARGET = ssi_slave_dma + +SDK_PATH = ../../../../../ + + +###################################### +# building variables +###################################### +# debug build? +DEBUG = 1 +# optimization +OPT = -Og -fno-pic -fno-builtin -fomit-frame-pointer -Wall -nostdlib -Werror-implicit-function-declaration + + +####################################### +# paths +####################################### +# Build path +BUILD_DIR = build + +###################################### +# source +###################################### +# C sources +C_SOURCES = \ +$(SDK_PATH)/cpu/core-riscv/traps.c \ +$(SDK_PATH)/cpu/core-riscv/spinlock.c \ +$(SDK_PATH)/cpu/soc-x2600/src/startup.c \ +$(SDK_PATH)/cpu/soc-x2600/src/serial.c \ +$(SDK_PATH)/cpu/soc-x2600/src/interrupt.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_hal_def.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_hal_pdma.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_hal_ssi_slave.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_hal_tick_risc_ccu.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_ll_cpm.c \ +$(SDK_PATH)/lib/libc/minimal/vsprintf.c \ +$(SDK_PATH)/lib/libc/minimal/string.c \ +$(SDK_PATH)/lib/libc/minimal/ctype.c \ +$(SDK_PATH)/lib/libc/minimal/div64.c \ +main.c + +# ASM sources +ASM_SOURCES = \ +$(SDK_PATH)/cpu/core-riscv/start.S \ +$(SDK_PATH)/cpu/core-riscv/genex.S + + +####################################### +# binaries +####################################### +PREFIX = riscv32-ingenicv0-elf- +# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx) +# either it can be added to the PATH environment variable. +ifdef GCC_PATH +CC = $(GCC_PATH)/$(PREFIX)gcc +AS = $(GCC_PATH)/$(PREFIX)as +LD = $(GCC_PATH)/$(PREFIX)ld +CP = $(GCC_PATH)/$(PREFIX)objcopy +SZ = $(GCC_PATH)/$(PREFIX)size +else +CC = $(PREFIX)gcc +AS = $(PREFIX)as +LD = $(PREFIX)ld +CP = $(PREFIX)objcopy +SZ = $(PREFIX)size +endif +BIN = $(CP) -O binary -S + +####################################### +# CFLAGS +####################################### +# cpu +CPU = -march=rv32imc -mabi=ilp32 -Wno-abi + +# fpu +FPU = + +# float-abi +FLOAT-ABI = + +# mcu +#MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) +MCU = $(CPU) $(FPU) $(FLOAT-ABI) + +# macros for gcc +# AS defines +AS_DEFS = -D_ASSEMBLER_ -D__ASSEMBLY__ + +# C defines +C_DEFS = + + +# AS includes +AS_INCLUDES = \ +-I$(SDK_PATH)/cpu/core-riscv/include \ +-I$(SDK_PATH)/lib/libc/minimal/include \ + +# C includes +C_INCLUDES = \ +-Iinclude \ +-I$(SDK_PATH)/cpu/core-riscv/include \ +-I$(SDK_PATH)/cpu/soc-x2600/include \ +-I$(SDK_PATH)/lib/libc/minimal/include \ +-I$(SDK_PATH)/drivers/drivers-x2600/include + + +# compile gcc flags +ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +ifeq ($(DEBUG), 1) +CFLAGS += -g -gdwarf-2 -O0 +endif + + +# Generate dependency information +CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" + + +####################################### +# LDFLAGS +####################################### +# link script +LDSCRIPT = $(SDK_PATH)/cpu/core-riscv/ld.lds + +# libraries +#LIBS = -lc -lm -lnosys +LIBDIR = +LDFLAGS = $(MCU) -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections -nostdlib + +# default action: build all +all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).bin + + +####################################### +# build the application +####################################### +# list of objects +OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) +vpath %.c $(sort $(dir $(C_SOURCES))) +# list of ASM program objects +OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.S=.o))) +vpath %.S $(sort $(dir $(ASM_SOURCES))) + +$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) + $(CC) -c $(CFLAGS) $< -o $@ + +$(BUILD_DIR)/%.o: %.S Makefile | $(BUILD_DIR) + $(CC) -c $(ASFLAGS) -o $@ $< + +$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile + $(CC) $(OBJECTS) $(LDFLAGS) -o $@ + $(SZ) $@ + +$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(BIN) $< $@ + +$(BUILD_DIR): + mkdir $@ + +####################################### +# clean up +####################################### +clean: + -rm -fR $(BUILD_DIR) + +####################################### +# dependencies +####################################### +-include $(wildcard $(BUILD_DIR)/*.d) + +# *** EOF *** diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/include/board_eth_phy_conf.h b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/include/board_eth_phy_conf.h new file mode 100644 index 00000000..c907ead4 --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/include/board_eth_phy_conf.h @@ -0,0 +1,75 @@ +#ifndef __ETH_PHY_CONF_H +#define __ETH_PHY_CONF_H + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 0x00U +#define MAC_ADDR1 0x11U +#define MAC_ADDR2 0x22U +#define MAC_ADDR3 0x33U +#define MAC_ADDR4 0x44U +#define MAC_ADDR5 0x55U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848 PHY Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x00U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x01U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2600U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ + +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ +#define PHY_MICR ((uint16_t)0x11U) /*!< MII Interrupt Control Register */ +#define PHY_MISR ((uint16_t)0x12U) /*!< MII Interrupt Status and Misc. Control Register */ + +#define PHY_LINK_STATUS ((uint16_t)0x0001U) /*!< PHY Link mask */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +#define PHY_MICR_INT_EN ((uint16_t)0x0002U) /*!< PHY Enable interrupts */ +#define PHY_MICR_INT_OE ((uint16_t)0x0001U) /*!< PHY Enable output interrupt events */ + +#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020U) /*!< Enable Interrupt on change of link status */ +#define PHY_LINK_INTERRUPT ((uint16_t)0x2600U) /*!< PHY link status interrupt mask */ + +/* ################## Ethernet peripheral configuration ##################### */ + + + +#endif // __ETH_PHY_CONF_H + diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/include/x2600_hal_conf.h b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/include/x2600_hal_conf.h new file mode 100644 index 00000000..1c53b2fa --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/include/x2600_hal_conf.h @@ -0,0 +1,147 @@ +#ifndef __X2600_HAL_CONF_H__ +#define __X2600_HAL_CONF_H__ +/* TODO: 本文件应该通过工具生成,在配置工程中选择不同的组件时,在此处包含不同的头文件 + 暂时包含全部头文件. +*/ + + +/* 1. Includes ---------------------------------------------------- */ + + +/* Hal Module selections. */ +#define HAL_UART_ENABLED +#define HAL_ADC_ENABLED +#define HAL_AIC_ENABLED +#define HAL_SPI_ENABLED +#define HAL_SPI_SLAVE_ENABLED +#if 0 +#define HAL_MSC_ENABLED +#define HAL_WDT_ENABLED +#define HAL_RTC_ENABLED +#define HAL_EFUSE_ENABLED +#define HAL_GMAC_ENABLED +#define HAL_USB_ENABLED +#define HAL_I2C_ENABLED +#define HAL_PWM_ENABLED +#define HAL_TCU_ENABLED +#define HAL_DPU_ENABLED +#define HAL_DPU_MIPI_ENABLED +#endif + +/* 系统时钟配配置,通过工具生成,随开发板或者平台变化.*/ +#include +#include + +#include "x2600_hal_tick.h" +#include "x2600_ll_ost_core.h" +#include "x2600_ll_ost_global.h" +#include "x2600_ll_cpm.h" +#include "x2600_ll_gpio.h" +#ifdef CORE_RISCV +//#include "x2600_ll_risc_ccu.h" +#endif + +#include "x2600_hal_pdma.h" + +#ifdef HAL_DPU_ENABLED +#include "x2600_hal_lcd.h" +#endif + +#ifdef HAL_DPU_MIPI_ENABLED +#include "x2600_ll_mipi_dsi.h" +#include "x2600_hal_mipi_dsi.h" +#endif + +#ifdef HAL_MSC_ENABLED +#endif + +#ifdef HAL_NOR_FLASH_ENABLED +#include "x2600_hal_sfc.h" +#endif + +#ifdef HAL_I2C_ENABLED +#include "x2600_hal_i2c.h" +#endif + +#ifdef HAL_UART_ENABLED +#include "x2600_hal_uart.h" +#endif + +#ifdef HAL_ADC_ENABLED +#include "x2600_hal_sadc.h" +#endif + +#ifdef HAL_SPI_ENABLED +#include "x2600_hal_ssi.h" +#endif + +#ifdef HAL_SPI_SLAVE_ENABLED +#include "x2600_hal_ssi_slave.h" +#endif + +#ifdef HAL_WDT_ENABLED +#include "x2600_hal_wdt.h" +#endif + +#ifdef HAL_TCU_ENABLED +#include "x2600_hal_tcu.h" +#endif + +#ifdef HAL_RTC_ENABLED +#include "x2600_hal_rtc.h" +#endif + +#ifdef HAL_EFUSE_ENABLED +#include "x2600_ll_efuse.h" +#include "x2600_hal_efuse.h" +#endif + +#ifdef HAL_PWM_ENABLED +#include "x2600_hal_pwm.h" +#endif + +#ifdef HAL_GMAC_ENABLED +#include "x2600_hal_gmac.h" +#endif + +#ifdef HAL_USB_ENABLED +#include "x2600_hal_pcd.h" +#include "x2600_hal_pcd_ex.h" +#endif + +#ifdef HAL_AIC_ENABLED +#include "x2600_hal_aic.h" +#endif + +#ifdef HAL_ICODEC_ENABLED +#include "x2600_hal_icodec.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* 2. Exported Types ---------------------------------------------- */ + +/* 3. Exported Constants ------------------------------------------ */ + +/* 4. Exported Macros --------------------------------------------- */ + +/* 5. Exported Funcs ---------------------------------------------- */ + +/* 6. Exported Variables ------------------------------------------ */ + +/* 7. Private Types ----------------------------------------------- */ + +/* 8. Private Constants ------------------------------------------- */ + +/* 9. Private Macros ---------------------------------------------- */ + +/* 10. Private Funcs ---------------------------------------------- */ + +/* 11. Private Variables ------------------------------------------ */ + +#ifdef __cplusplus +} +#endif +#endif /* __X2600_HAL_H__ */ diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/include/x2600_sysclk_conf.h b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/include/x2600_sysclk_conf.h new file mode 100644 index 00000000..3c4888de --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/include/x2600_sysclk_conf.h @@ -0,0 +1,68 @@ +/** + * @file x2600_sysclk_conf.h + * @author MPU系统软件部团队 + * @brief + * + * @copyright 版权所有 (北京君正集成电路股份有限公司) {2022} + * @copyright Copyright© 2022 Ingenic Semiconductor Co.,Ltd + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#ifndef __X2600_SYSCLK_CONF_H__ +#define __X2600_SYSCLK_CONF_H__ + +#ifdef __cplusplus +extern "C" { +#endif +/* 1. Includes ---------------------------------------------------- */ + +/* 2. Exported Types ---------------------------------------------- */ + + +/* 3. Exported Constants ------------------------------------------ */ + +/* 4. Exported Macros --------------------------------------------- */ +#define SYSCLK_EXTAL (24000000) +#define SYSCLK_APLL (1200000000) +#define SYSCLK_MPLL (1200000000) + +#define SystemCoreClock SYSCLK_APLL + +#define CGU_CONFIG_MSC_APLL_24M { \ + .PLLMux = MSC1CDR_SCLK_A, \ + .Div = 24, \ + .Config = 0 } + +#define CGU_CONFIG_MSC_APLL_48M { \ + .PLLMux = MSC1CDR_SCLK_A, \ + .Div = 11, \ + .Config = 0 } + + +#define CGU_CONFIG_SSI_MPLL_500K { \ + .PLLMux = SSICDR_MPLL, \ + .Div = 15, \ + .Config = 0 } + +/* 5. Exported Funcs ---------------------------------------------- */ + +/* 6. Exported Variables ------------------------------------------ */ + +/* 7. Private Types ----------------------------------------------- */ + +/* 8. Private Constants ------------------------------------------- */ + +/* 9. Private Macros ---------------------------------------------- */ + +/* 10. Private Funcs ---------------------------------------------- */ + +/* 11. Private Variables ------------------------------------------ */ + +#ifdef __cplusplus +} +#endif +#endif /* __X2600_HAL_ADC_H__ */ diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/main.c b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/main.c new file mode 100644 index 00000000..fcc663d9 --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/main.c @@ -0,0 +1,170 @@ +#include +#include + +#define COUNTOF(__BUFFER__) (sizeof(__BUFFER__) / sizeof(*(__BUFFER__))) +#define BUFFERSIZE (COUNTOF(aTxBuffer)) +#define SSI_CDR_DIVISION(__VALUE__) ((__VALUE__) - 1) + +SPI_SLAVE_HandleTypeDef Spi_SlaveHandle; +__IO ITStatus SpiReady = RESET; + +uint8_t aTxBuffer[] = "Hello this message send from x2600!!!!"; +uint8_t aRxBuffer[BUFFERSIZE]; + +static void Error_Handler(void); +__attribute__((unused)) static void dump_spi_slave_reg(void); + +DMA_HandleTypeDef DMA_Handle; +DMA_InitChannelConfTypeDef SPI_SLAVE_DMA_Tx_Config; +DMA_InitChannelConfTypeDef SPI_SLAVE_DMA_Rx_Config; + +__align(32) DMA_DescriptorDef SPI_SLAVE_Tx_desc; +DMA_InitDescConfTypeDef SPI_SLAVE_Tx_descConfig; +__align(32) DMA_DescriptorDef SPI_SLAVE_Rx_desc; +DMA_InitDescConfTypeDef SPI_SLAVE_Rx_descConfig; + +void SPI_SLAVE_DMA_Init(void) +{ + /* 实例化SPI_SLAVE句柄,并初始化SPI_SLAVE外围设备 */ + Spi_SlaveHandle.Instance = SSI_SLAVE_Instance; + Spi_SlaveHandle.Init.DataSize = SPI_SLAVE_DATASIZE_8BIT; + Spi_SlaveHandle.Init.CLKPolarity = SPI_SLAVE_POLARITY_LOW; + Spi_SlaveHandle.Init.CLKPhase = SPI_SLAVE_PHASE_2EDGE; + Spi_SlaveHandle.Init.LoopMode = SPI_SLAVE_LOOP_DISABLE; + Spi_SlaveHandle.DMA_Handle = &DMA_Handle; + Spi_SlaveHandle.SPI_SLAVE_DMA_Rx_Config = &SPI_SLAVE_DMA_Rx_Config; + Spi_SlaveHandle.SPI_SLAVE_DMA_Tx_Config = &SPI_SLAVE_DMA_Tx_Config; + + /* Rx Config */ +// SPI_SLAVE_DMA_Rx_Config.XferCpltCallback = dma_rx_cb; + SPI_SLAVE_DMA_Rx_Config.data = (DMA_HandleTypeDef *)&Spi_SlaveHandle; + SPI_SLAVE_DMA_Rx_Config.DescMode = DESCRIPTOR; + SPI_SLAVE_DMA_Rx_Config.desc = &SPI_SLAVE_Rx_desc; + SPI_SLAVE_DMA_Rx_Config.descConfig = &SPI_SLAVE_Rx_descConfig; + SPI_SLAVE_DMA_Rx_Config.desc_count = sizeof(SPI_SLAVE_Rx_desc) / sizeof(DMA_DescriptorDef); + + SPI_SLAVE_Rx_descConfig.Desc_Interrupt = DMA_INTERRUPT; + SPI_SLAVE_Rx_descConfig.Desc_Link = NO_LINK; + SPI_SLAVE_Rx_descConfig.DescDMATransferType = DMA_RQ_SSI_SLV_RX; + + SPI_SLAVE_Rx_descConfig.DescSrcAddress =(void *)SPI_SLAVE_FIFO(&Spi_SlaveHandle); + SPI_SLAVE_Rx_descConfig.DescSrcAddrIncrement = DISABLE; + SPI_SLAVE_Rx_descConfig.DescSrcPortWidth = DMA_PORT_8BIT; + + SPI_SLAVE_Rx_descConfig.DescDstAddress = aRxBuffer; + SPI_SLAVE_Rx_descConfig.DescDstAddrIncrement = ENABLE; + SPI_SLAVE_Rx_descConfig.DescDstPortWidth = DMA_PORT_8BIT; + + SPI_SLAVE_Rx_descConfig.DescTransferNumByte = 1; + SPI_SLAVE_Rx_descConfig.DataLength = BUFFERSIZE; + + /* Tx Config */ +// SPI_SLAVE_DMA_Tx_Config.XferCpltCallback = dma_tx_cb; + SPI_SLAVE_DMA_Tx_Config.data = (DMA_HandleTypeDef *)&Spi_SlaveHandle; + SPI_SLAVE_DMA_Tx_Config.DescMode = DESCRIPTOR; + SPI_SLAVE_DMA_Tx_Config.desc = &SPI_SLAVE_Tx_desc; + SPI_SLAVE_DMA_Tx_Config.descConfig = &SPI_SLAVE_Tx_descConfig; + SPI_SLAVE_DMA_Tx_Config.desc_count = sizeof(SPI_SLAVE_Tx_desc) / sizeof(DMA_DescriptorDef); + + SPI_SLAVE_Tx_descConfig.Desc_Interrupt = DMA_INTERRUPT; + SPI_SLAVE_Tx_descConfig.Desc_Link = NO_LINK; + SPI_SLAVE_Tx_descConfig.DescDMATransferType = DMA_RQ_SSI_SLV_TX; + + SPI_SLAVE_Tx_descConfig.DescSrcAddress = aTxBuffer; + SPI_SLAVE_Tx_descConfig.DescSrcAddrIncrement = ENABLE; + SPI_SLAVE_Tx_descConfig.DescSrcPortWidth = DMA_PORT_8BIT; + + SPI_SLAVE_Tx_descConfig.DescDstAddress = (void *)SPI_SLAVE_FIFO(&Spi_SlaveHandle); + SPI_SLAVE_Tx_descConfig.DescDstAddrIncrement =DISABLE; + SPI_SLAVE_Tx_descConfig.DescDstPortWidth = DMA_PORT_8BIT; + + SPI_SLAVE_Tx_descConfig.DescTransferNumByte = 1; + SPI_SLAVE_Tx_descConfig.DataLength = BUFFERSIZE; + + DMA_Handle.Instance = DMA_Instance ; +} + +int main(void) +{ + prom_printk("hello world %s, %d\n", __func__, __LINE__); + + /* + * + * ssi_slave的设备时钟和apb总线时钟一致,目前aph时钟为150M + * + */ + + /* 使能clock gate */ + CPM_GATE_Enable(CPM_Instance, CPM_CLKID_SSI_SLV); + CPM_GATE_Enable(CPM_Instance, CPM_CLKID_DMAC); + + /* gpio 初始化 (SSI_SLAVE: PB28 ~ PB31) */ + LL_GPIO_setPinMode(PB_Instance, 28, GPIO_MODE_FUNCTION2); + LL_GPIO_setPinMode(PB_Instance, 29, GPIO_MODE_FUNCTION2); + LL_GPIO_setPinMode(PB_Instance, 30, GPIO_MODE_FUNCTION2); + LL_GPIO_setPinMode(PB_Instance, 31, GPIO_MODE_FUNCTION2); + + SPI_SLAVE_DMA_Init(); + + if (HAL_SPI_SLAVE_Init(&Spi_SlaveHandle) != HAL_OK) { + prom_printk("DBEBUG: SPI Init error !, %s, %d\n", __func__, __LINE__); + Error_Handler(); + } + + /* 请求中断 */ + ll_request_irq(IRQ_INTC0_SSI_SLAVE, HAL_SPI_SLAVE_IRQHandler, (void *)&Spi_SlaveHandle); + + + /* 测试1: 全双工发送和接收测试 */ + HAL_SPI_SLAVE_DMA_TransmitReceive(&Spi_SlaveHandle, aTxBuffer, aRxBuffer, BUFFERSIZE); + while (HAL_SPI_SLAVE_DMA_Transmit_OR_Reciver_End(&Spi_SlaveHandle)); + prom_printk("%s-%d: aRxBuffer = %s\n", __func__, __LINE__, aRxBuffer); + + + /* 测试2: 只接收测试 */ + memset(aRxBuffer, 0, BUFFERSIZE); + Flush_Cache_AllAddr(); + HAL_SPI_SLAVE_DMA_Receive(&Spi_SlaveHandle, aRxBuffer, BUFFERSIZE); + while (HAL_SPI_SLAVE_DMA_Transmit_OR_Reciver_End(&Spi_SlaveHandle)); + prom_printk("%s-%d: aRxBuffer = %s\n", __func__, __LINE__, aRxBuffer); + + /* 测试3: 只发送测试 */ + HAL_SPI_SLAVE_DMA_Transmit(&Spi_SlaveHandle, aTxBuffer, BUFFERSIZE); + while (HAL_SPI_SLAVE_DMA_Transmit_OR_Reciver_End(&Spi_SlaveHandle)); + prom_printk("Only Transmit test is over, please check waveform\n"); + + HAL_SPI_SLAVE_DeInit(&Spi_SlaveHandle); +// dump_spi_slave_reg(); + while (1); + return 0; +} + + +static void Error_Handler(void) +{ + prom_printk("Error Handler\n"); +} + +__attribute__((unused)) static void dump_spi_slave_reg(void) +{ + prom_printk("CTRLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->CTRLR)); + prom_printk("SSIENR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->SSIENR)); + prom_printk("MWCR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->MWCR)); + prom_printk("TXFTLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->TXFTLR)); + prom_printk("RXFTLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->RXFTLR)); + prom_printk("TXFLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->TXFLR)); + prom_printk("RXFLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->RXFLR)); + prom_printk("SR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->SR)); + prom_printk("IMR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->IMR)); + prom_printk("ISR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->ISR)); + prom_printk("RISR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->RISR)); + prom_printk("TXOICR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->TXOICR)); + prom_printk("RXOICR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->RXOICR)); + prom_printk("RXUICR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->RXOICR)); + prom_printk("ICR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->ICR)); + prom_printk("DMACR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->DMACR)); + prom_printk("DMATDLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->DMATDLR)); + prom_printk("DMARDLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->DMARDLR)); + prom_printk("IDR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->IDR)); +} + diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/riscv32-gcc.cmake b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/riscv32-gcc.cmake new file mode 100644 index 00000000..d09813df --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_dma/riscv32-gcc.cmake @@ -0,0 +1,18 @@ +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR riscv32) + +# Some default GCC settings +set(TOOLCHAIN_PREFIX "riscv32-ingenicv0-elf-") + +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) +set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++) + +set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) +set(CMAKE_SIZE ${TOOLCHAIN_PREFIX}size) + +set(CMAKE_EXECUTABLE_SUFFIX_ASM ".elf") +set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") +set(CMAKE_EXECUTABLE_SUFFIX_CXX ".elf") + +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/cmake-kits.json b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/cmake-kits.json new file mode 100644 index 00000000..7a6f85df --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/cmake-kits.json @@ -0,0 +1,18 @@ +[ + { + "name": "RISCV GCC for ingenic cross compile on Windows", + + "toolchainFile": "riscv32-gcc.cmake", + "preferredGenerator": { + "name":"MinGW Makefiles" + } + }, + { + "name": "RISCV GCC for ingenic cross compile on Linux", + "toolchainFile": "riscv32-gcc.cmake", + "preferredGenerator": { + "name":"Unix Makefiles" + } + } +] + \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/launch.json b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/launch.json new file mode 100644 index 00000000..fa33e35c --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/launch.json @@ -0,0 +1,55 @@ +{ + "version": "0.2.0", + "configurations": [ + // GDB Debugging: + { + "program": "${command:cmake.launchTargetPath}", + "name": "Launch (gdb)", + "request": "launch", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "openOnSessionStart", + "type": "cppdbg", + "MIMode": "gdb", + "miDebuggerPath": "riscv32-ingenicv0-elf-gdb", + "miDebuggerArgs": "", + "miDebuggerServerAddress": "localhost:3333", + "targetArchitecture": "mips", + "preLaunchTask": "adb forward", + "customLaunchSetupCommands": [ + { + "description": "gdb 启用整齐打印", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "text":"cd ${workspaceFolder}", + "ignoreFailures": false + }, + { + "text":"file build/${command:cmake.buildType}/${command:cmake.launchTargetFilename}", + "ignoreFailures": false + }, + { + "text": "target remote localhost:3333", + "ignoreFailures": false + }, + { + "text": "monitor reset halt", + "ignoreFailures": false + }, + { + "text": "load", + "ignoreFailures": false + } + ], + "logging": { + "engineLogging": false, + "programOutput": true + } + } + ] + } + \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/settings.json b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/settings.json new file mode 100644 index 00000000..3bf856fb --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "cmake.buildDirectory": "${workspaceFolder}/build/${buildType}", + "files.associations": { + "*.build": "makefile", + "*.mk": "makefile", + "Makefile*": "makefile" + } +} diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/tasks.json b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/tasks.json new file mode 100644 index 00000000..53b4731e --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "adb forward", + "type": "shell", + "command": "adb forward tcp:3333 tcp:3333", + }, + ] +} \ No newline at end of file diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_it/CMakeLists.txt b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/CMakeLists.txt new file mode 100644 index 00000000..3c442382 --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/CMakeLists.txt @@ -0,0 +1,111 @@ +cmake_minimum_required(VERSION 3.8) +# +# Core project settings +# +Project(ssi_slave_it) # Modified +enable_language(C CXX ASM) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +# Setup compiler settings +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_C_EXTENSIONS ON) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS ON) +set(PROJ_PATH ${CMAKE_CURRENT_SOURCE_DIR}) +set(SDK_PATH ${PROJ_PATH}/../../../../../) +message("Build type: " ${CMAKE_BUILD_TYPE}) + +# Set linker script +set(linker_script_SRC ${SDK_PATH}/cpu/core-riscv/ld.lds) # Modified +set(EXECUTABLE ${CMAKE_PROJECT_NAME}) +set(CPU_PARAMETERS "-march=rv32imc -mabi=ilp32 -Wno-abi") + +set(CMAKE_ASM_FLAGS "${CPU_PARAMETERS} -D_ASSEMBLER_ -D__ASSEMBLY__") + +set(CMAKE_C_FLAGS "${CPU_PARAMETERS} -fno-pic -fno-builtin -fomit-frame-pointer -Wall -nostdlib -Wall -fdata-sections -ffunction-sections") + +# Compiler options + +if(CMAKE_BUILD_TYPE STREQUAL Debug) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g -ggdb -DDEBUG") +else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") +endif() + +set(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS}) + +set(CMAKE_LD_FLAGS "${CPU_PARAMETERS}") + + +set(sources_SRCS # Modified + ${SDK_PATH}/cpu/core-riscv/spinlock.c + ${SDK_PATH}/cpu/core-riscv/start.S + ${SDK_PATH}/cpu/core-riscv/genex.S + ${SDK_PATH}/cpu/core-riscv/traps.c + ${SDK_PATH}/cpu/soc-x2600/src/interrupt.c + ${SDK_PATH}/cpu/soc-x2600/src/serial.c + ${SDK_PATH}/cpu/soc-x2600/src/startup.c + ${SDK_PATH}/drivers/drivers-x2600/src/x2600_hal_def.c + ${SDK_PATH}/drivers/drivers-x2600/src/x2600_hal_pdma.c + ${SDK_PATH}/drivers/drivers-x2600/src/x2600_hal_ssi_slave.c + ${SDK_PATH}/drivers/drivers-x2600/src/x2600_hal_tick_risc_ccu.c + ${SDK_PATH}/drivers/drivers-x2600/src/x2600_ll_cpm.c + ${SDK_PATH}/lib/libc/minimal/ctype.c + ${SDK_PATH}/lib/libc/minimal/div64.c + ${SDK_PATH}/lib/libc/minimal/string.c + ${SDK_PATH}/lib/libc/minimal/vsprintf.c + main.c + +) + +if(CMAKE_EXPORT_COMPILE_COMMANDS) + set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}) + set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) +endif() + +# +# Include directories +# +#set(include_path_DIRS +# Modified + +include_directories( + ${PROJ_PATH}/include + ${SDK_PATH}/lib/libc/minimal/include + ${SDK_PATH}/drivers/drivers-x2600/include + ${SDK_PATH}/cpu/core-riscv/include + ${SDK_PATH}/cpu/soc-x2600/include + +) + +# +# -L libdirs. +# +link_directories( +#path/to/lib +) + +# Executable files +add_executable(${EXECUTABLE} ${sources_SRCS}) + +# Linker options +target_link_libraries(${EXECUTABLE} PRIVATE + -T${linker_script_SRC} + ${CMAKE_LD_FLAGS} + -Wl,-Map=${CMAKE_PROJECT_NAME}.map,--cref + -Wl,--gc-sections + -Wl,--start-group + -Wl,--end-group + -Wl,--print-memory-usage +) + +# Execute post-build to print size +add_custom_command(TARGET ${EXECUTABLE} POST_BUILD + COMMAND ${CMAKE_SIZE} $ +) + +# Convert output to hex and binary +add_custom_command(TARGET ${EXECUTABLE} POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -O binary $ ${EXECUTABLE}.bin + ) diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_it/Makefile b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/Makefile new file mode 100644 index 00000000..97a7e2cf --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/Makefile @@ -0,0 +1,176 @@ +###################################### +# target +###################################### +TARGET = ssi_slave_it + +SDK_PATH = ../../../../../ + + +###################################### +# building variables +###################################### +# debug build? +DEBUG = 1 +# optimization +OPT = -Og -fno-pic -fno-builtin -fomit-frame-pointer -Wall -nostdlib -Werror-implicit-function-declaration + + +####################################### +# paths +####################################### +# Build path +BUILD_DIR = build + +###################################### +# source +###################################### +# C sources +C_SOURCES = \ +$(SDK_PATH)/cpu/core-riscv/traps.c \ +$(SDK_PATH)/cpu/core-riscv/spinlock.c \ +$(SDK_PATH)/cpu/soc-x2600/src/startup.c \ +$(SDK_PATH)/cpu/soc-x2600/src/serial.c \ +$(SDK_PATH)/cpu/soc-x2600/src/interrupt.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_hal_def.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_hal_pdma.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_hal_ssi_slave.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_hal_tick_risc_ccu.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_ll_cpm.c \ +$(SDK_PATH)/lib/libc/minimal/vsprintf.c \ +$(SDK_PATH)/lib/libc/minimal/string.c \ +$(SDK_PATH)/lib/libc/minimal/ctype.c \ +$(SDK_PATH)/lib/libc/minimal/div64.c \ +main.c + +# ASM sources +ASM_SOURCES = \ +$(SDK_PATH)/cpu/core-riscv/start.S \ +$(SDK_PATH)/cpu/core-riscv/genex.S + + +####################################### +# binaries +####################################### +PREFIX = riscv32-ingenicv0-elf- +# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx) +# either it can be added to the PATH environment variable. +ifdef GCC_PATH +CC = $(GCC_PATH)/$(PREFIX)gcc +AS = $(GCC_PATH)/$(PREFIX)as +LD = $(GCC_PATH)/$(PREFIX)ld +CP = $(GCC_PATH)/$(PREFIX)objcopy +SZ = $(GCC_PATH)/$(PREFIX)size +else +CC = $(PREFIX)gcc +AS = $(PREFIX)as +LD = $(PREFIX)ld +CP = $(PREFIX)objcopy +SZ = $(PREFIX)size +endif +BIN = $(CP) -O binary -S + +####################################### +# CFLAGS +####################################### +# cpu +CPU = -march=rv32imc -mabi=ilp32 -Wno-abi + +# fpu +FPU = + +# float-abi +FLOAT-ABI = + +# mcu +#MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) +MCU = $(CPU) $(FPU) $(FLOAT-ABI) + +# macros for gcc +# AS defines +AS_DEFS = -D_ASSEMBLER_ -D__ASSEMBLY__ + +# C defines +C_DEFS = + + +# AS includes +AS_INCLUDES = \ +-I$(SDK_PATH)/cpu/core-riscv/include \ +-I$(SDK_PATH)/lib/libc/minimal/include \ + +# C includes +C_INCLUDES = \ +-Iinclude \ +-I$(SDK_PATH)/cpu/core-riscv/include \ +-I$(SDK_PATH)/cpu/soc-x2600/include \ +-I$(SDK_PATH)/lib/libc/minimal/include \ +-I$(SDK_PATH)/drivers/drivers-x2600/include + + +# compile gcc flags +ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +ifeq ($(DEBUG), 1) +CFLAGS += -g -gdwarf-2 -O0 +endif + + +# Generate dependency information +CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" + + +####################################### +# LDFLAGS +####################################### +# link script +LDSCRIPT = $(SDK_PATH)/cpu/core-riscv/ld.lds + +# libraries +#LIBS = -lc -lm -lnosys +LIBDIR = +LDFLAGS = $(MCU) -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections -nostdlib + +# default action: build all +all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).bin + + +####################################### +# build the application +####################################### +# list of objects +OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) +vpath %.c $(sort $(dir $(C_SOURCES))) +# list of ASM program objects +OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.S=.o))) +vpath %.S $(sort $(dir $(ASM_SOURCES))) + +$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) + $(CC) -c $(CFLAGS) $< -o $@ + +$(BUILD_DIR)/%.o: %.S Makefile | $(BUILD_DIR) + $(CC) -c $(ASFLAGS) -o $@ $< + +$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile + $(CC) $(OBJECTS) $(LDFLAGS) -o $@ + $(SZ) $@ + +$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(BIN) $< $@ + +$(BUILD_DIR): + mkdir $@ + +####################################### +# clean up +####################################### +clean: + -rm -fR $(BUILD_DIR) + +####################################### +# dependencies +####################################### +-include $(wildcard $(BUILD_DIR)/*.d) + +# *** EOF *** diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_it/include/board_eth_phy_conf.h b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/include/board_eth_phy_conf.h new file mode 100644 index 00000000..c907ead4 --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/include/board_eth_phy_conf.h @@ -0,0 +1,75 @@ +#ifndef __ETH_PHY_CONF_H +#define __ETH_PHY_CONF_H + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 0x00U +#define MAC_ADDR1 0x11U +#define MAC_ADDR2 0x22U +#define MAC_ADDR3 0x33U +#define MAC_ADDR4 0x44U +#define MAC_ADDR5 0x55U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848 PHY Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x00U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x01U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2600U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ + +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ +#define PHY_MICR ((uint16_t)0x11U) /*!< MII Interrupt Control Register */ +#define PHY_MISR ((uint16_t)0x12U) /*!< MII Interrupt Status and Misc. Control Register */ + +#define PHY_LINK_STATUS ((uint16_t)0x0001U) /*!< PHY Link mask */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +#define PHY_MICR_INT_EN ((uint16_t)0x0002U) /*!< PHY Enable interrupts */ +#define PHY_MICR_INT_OE ((uint16_t)0x0001U) /*!< PHY Enable output interrupt events */ + +#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020U) /*!< Enable Interrupt on change of link status */ +#define PHY_LINK_INTERRUPT ((uint16_t)0x2600U) /*!< PHY link status interrupt mask */ + +/* ################## Ethernet peripheral configuration ##################### */ + + + +#endif // __ETH_PHY_CONF_H + diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_it/include/x2600_hal_conf.h b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/include/x2600_hal_conf.h new file mode 100644 index 00000000..1c53b2fa --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/include/x2600_hal_conf.h @@ -0,0 +1,147 @@ +#ifndef __X2600_HAL_CONF_H__ +#define __X2600_HAL_CONF_H__ +/* TODO: 本文件应该通过工具生成,在配置工程中选择不同的组件时,在此处包含不同的头文件 + 暂时包含全部头文件. +*/ + + +/* 1. Includes ---------------------------------------------------- */ + + +/* Hal Module selections. */ +#define HAL_UART_ENABLED +#define HAL_ADC_ENABLED +#define HAL_AIC_ENABLED +#define HAL_SPI_ENABLED +#define HAL_SPI_SLAVE_ENABLED +#if 0 +#define HAL_MSC_ENABLED +#define HAL_WDT_ENABLED +#define HAL_RTC_ENABLED +#define HAL_EFUSE_ENABLED +#define HAL_GMAC_ENABLED +#define HAL_USB_ENABLED +#define HAL_I2C_ENABLED +#define HAL_PWM_ENABLED +#define HAL_TCU_ENABLED +#define HAL_DPU_ENABLED +#define HAL_DPU_MIPI_ENABLED +#endif + +/* 系统时钟配配置,通过工具生成,随开发板或者平台变化.*/ +#include +#include + +#include "x2600_hal_tick.h" +#include "x2600_ll_ost_core.h" +#include "x2600_ll_ost_global.h" +#include "x2600_ll_cpm.h" +#include "x2600_ll_gpio.h" +#ifdef CORE_RISCV +//#include "x2600_ll_risc_ccu.h" +#endif + +#include "x2600_hal_pdma.h" + +#ifdef HAL_DPU_ENABLED +#include "x2600_hal_lcd.h" +#endif + +#ifdef HAL_DPU_MIPI_ENABLED +#include "x2600_ll_mipi_dsi.h" +#include "x2600_hal_mipi_dsi.h" +#endif + +#ifdef HAL_MSC_ENABLED +#endif + +#ifdef HAL_NOR_FLASH_ENABLED +#include "x2600_hal_sfc.h" +#endif + +#ifdef HAL_I2C_ENABLED +#include "x2600_hal_i2c.h" +#endif + +#ifdef HAL_UART_ENABLED +#include "x2600_hal_uart.h" +#endif + +#ifdef HAL_ADC_ENABLED +#include "x2600_hal_sadc.h" +#endif + +#ifdef HAL_SPI_ENABLED +#include "x2600_hal_ssi.h" +#endif + +#ifdef HAL_SPI_SLAVE_ENABLED +#include "x2600_hal_ssi_slave.h" +#endif + +#ifdef HAL_WDT_ENABLED +#include "x2600_hal_wdt.h" +#endif + +#ifdef HAL_TCU_ENABLED +#include "x2600_hal_tcu.h" +#endif + +#ifdef HAL_RTC_ENABLED +#include "x2600_hal_rtc.h" +#endif + +#ifdef HAL_EFUSE_ENABLED +#include "x2600_ll_efuse.h" +#include "x2600_hal_efuse.h" +#endif + +#ifdef HAL_PWM_ENABLED +#include "x2600_hal_pwm.h" +#endif + +#ifdef HAL_GMAC_ENABLED +#include "x2600_hal_gmac.h" +#endif + +#ifdef HAL_USB_ENABLED +#include "x2600_hal_pcd.h" +#include "x2600_hal_pcd_ex.h" +#endif + +#ifdef HAL_AIC_ENABLED +#include "x2600_hal_aic.h" +#endif + +#ifdef HAL_ICODEC_ENABLED +#include "x2600_hal_icodec.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* 2. Exported Types ---------------------------------------------- */ + +/* 3. Exported Constants ------------------------------------------ */ + +/* 4. Exported Macros --------------------------------------------- */ + +/* 5. Exported Funcs ---------------------------------------------- */ + +/* 6. Exported Variables ------------------------------------------ */ + +/* 7. Private Types ----------------------------------------------- */ + +/* 8. Private Constants ------------------------------------------- */ + +/* 9. Private Macros ---------------------------------------------- */ + +/* 10. Private Funcs ---------------------------------------------- */ + +/* 11. Private Variables ------------------------------------------ */ + +#ifdef __cplusplus +} +#endif +#endif /* __X2600_HAL_H__ */ diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_it/include/x2600_sysclk_conf.h b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/include/x2600_sysclk_conf.h new file mode 100644 index 00000000..3c4888de --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/include/x2600_sysclk_conf.h @@ -0,0 +1,68 @@ +/** + * @file x2600_sysclk_conf.h + * @author MPU系统软件部团队 + * @brief + * + * @copyright 版权所有 (北京君正集成电路股份有限公司) {2022} + * @copyright Copyright© 2022 Ingenic Semiconductor Co.,Ltd + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#ifndef __X2600_SYSCLK_CONF_H__ +#define __X2600_SYSCLK_CONF_H__ + +#ifdef __cplusplus +extern "C" { +#endif +/* 1. Includes ---------------------------------------------------- */ + +/* 2. Exported Types ---------------------------------------------- */ + + +/* 3. Exported Constants ------------------------------------------ */ + +/* 4. Exported Macros --------------------------------------------- */ +#define SYSCLK_EXTAL (24000000) +#define SYSCLK_APLL (1200000000) +#define SYSCLK_MPLL (1200000000) + +#define SystemCoreClock SYSCLK_APLL + +#define CGU_CONFIG_MSC_APLL_24M { \ + .PLLMux = MSC1CDR_SCLK_A, \ + .Div = 24, \ + .Config = 0 } + +#define CGU_CONFIG_MSC_APLL_48M { \ + .PLLMux = MSC1CDR_SCLK_A, \ + .Div = 11, \ + .Config = 0 } + + +#define CGU_CONFIG_SSI_MPLL_500K { \ + .PLLMux = SSICDR_MPLL, \ + .Div = 15, \ + .Config = 0 } + +/* 5. Exported Funcs ---------------------------------------------- */ + +/* 6. Exported Variables ------------------------------------------ */ + +/* 7. Private Types ----------------------------------------------- */ + +/* 8. Private Constants ------------------------------------------- */ + +/* 9. Private Macros ---------------------------------------------- */ + +/* 10. Private Funcs ---------------------------------------------- */ + +/* 11. Private Variables ------------------------------------------ */ + +#ifdef __cplusplus +} +#endif +#endif /* __X2600_HAL_ADC_H__ */ diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_it/main.c b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/main.c new file mode 100644 index 00000000..9e8e84b0 --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/main.c @@ -0,0 +1,105 @@ +#include +#include + +#define COUNTOF(__BUFFER__) (sizeof(__BUFFER__) / sizeof(*(__BUFFER__))) +#define BUFFERSIZE (COUNTOF(aTxBuffer)) +#define SSI_CDR_DIVISION(__VALUE__) ((__VALUE__) - 1) + +SPI_SLAVE_HandleTypeDef Spi_SlaveHandle; +__IO ITStatus SpiReady = RESET; + +uint8_t aTxBuffer[] = "Hello this message send from x2600!!!!"; + +uint8_t aRxBuffer[BUFFERSIZE]; + +static void Error_Handler(void); +__attribute__((unused)) static void dump_spi_slave_reg(void); + + +int main(void) +{ + prom_printk("hello world %s, %d\n", __func__, __LINE__); + + + /* + * + * ssi_slave的设备时钟和apb总线时钟一致,目前aph时钟为150M + * + */ + + /* 使能clock gate */ + CPM_GATE_Enable(CPM_Instance, CPM_CLKID_SSI_SLV); + + /* gpio 初始化 (SSI_SLAVE: PB28 ~ PB31) */ + LL_GPIO_setPinMode(PB_Instance, 28, GPIO_MODE_FUNCTION2); + LL_GPIO_setPinMode(PB_Instance, 29, GPIO_MODE_FUNCTION2); + LL_GPIO_setPinMode(PB_Instance, 30, GPIO_MODE_FUNCTION2); + LL_GPIO_setPinMode(PB_Instance, 31, GPIO_MODE_FUNCTION2); + + /* 实例化SPI_SLAVE句柄,并初始化SPI_SLAVE外围设备 */ + Spi_SlaveHandle.Instance = SSI_SLAVE_Instance; + Spi_SlaveHandle.Init.DataSize = SPI_SLAVE_DATASIZE_8BIT; + Spi_SlaveHandle.Init.CLKPolarity = SPI_SLAVE_POLARITY_LOW; + Spi_SlaveHandle.Init.CLKPhase = SPI_SLAVE_PHASE_2EDGE; + Spi_SlaveHandle.Init.LoopMode = SPI_SLAVE_LOOP_DISABLE; + + if (HAL_SPI_SLAVE_Init(&Spi_SlaveHandle) != HAL_OK) { + prom_printk("DBEBUG: SPI Init error !, %s, %d\n", __func__, __LINE__); + Error_Handler(); + } + + /* 请求中断 */ + ll_request_irq(IRQ_INTC0_SSI_SLAVE, HAL_SPI_SLAVE_IRQHandler, (void *)&Spi_SlaveHandle); + + + /* 测试1: 全双工发送和接收测试 */ + HAL_SPI_SLAVE_TransmitReceive_IT(&Spi_SlaveHandle, aTxBuffer, aRxBuffer, BUFFERSIZE); + while (HAL_SPI_SLAVE_Transmit_OR_Reciver_End(&Spi_SlaveHandle)); + prom_printk("aRxBuffer = %s\n", aRxBuffer); + + /* 测试2: 只接收测试 */ + memset(aRxBuffer, 0, BUFFERSIZE); + HAL_SPI_SLAVE_Receive_IT(&Spi_SlaveHandle, aRxBuffer, BUFFERSIZE); + while (HAL_SPI_SLAVE_Transmit_OR_Reciver_End(&Spi_SlaveHandle)); + prom_printk("aRxBuffer = %s\n", aRxBuffer); + + + /* 测试3: 只发送测试 */ + HAL_SPI_SLAVE_Transmit_IT(&Spi_SlaveHandle, aTxBuffer, BUFFERSIZE); + while (HAL_SPI_SLAVE_Transmit_OR_Reciver_End(&Spi_SlaveHandle)); + prom_printk("Only Transmit test is over, please check waveform\n"); + + HAL_SPI_SLAVE_DeInit(&Spi_SlaveHandle); +// dump_spi_slave_reg(); + while (1); + return 0; +} + +static void Error_Handler(void) +{ + prom_printk("Error Handler\n"); +} + +__attribute__((unused)) static void dump_spi_slave_reg(void) +{ + prom_printk("CTRLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->CTRLR)); + prom_printk("SSIENR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->SSIENR)); + prom_printk("MWCR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->MWCR)); + prom_printk("TXFTLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->TXFTLR)); + prom_printk("RXFTLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->RXFTLR)); + prom_printk("TXFLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->TXFLR)); + prom_printk("RXFLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->RXFLR)); + prom_printk("SR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->SR)); + prom_printk("IMR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->IMR)); + prom_printk("ISR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->ISR)); + prom_printk("RISR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->RISR)); + prom_printk("TXOICR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->TXOICR)); + prom_printk("RXOICR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->RXOICR)); + prom_printk("RXUICR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->RXOICR)); + prom_printk("ICR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->ICR)); + prom_printk("DMACR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->DMACR)); + prom_printk("DMATDLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->DMATDLR)); + prom_printk("DMARDLR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->DMARDLR)); + prom_printk("IDR :0x%08x\n", READ_REG(SSI_SLAVE_Instance->IDR)); +} + diff --git a/projects/x2660-halley/Examples/spi_slave/spi_slave_it/riscv32-gcc.cmake b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/riscv32-gcc.cmake new file mode 100644 index 00000000..d09813df --- /dev/null +++ b/projects/x2660-halley/Examples/spi_slave/spi_slave_it/riscv32-gcc.cmake @@ -0,0 +1,18 @@ +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR riscv32) + +# Some default GCC settings +set(TOOLCHAIN_PREFIX "riscv32-ingenicv0-elf-") + +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) +set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++) + +set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) +set(CMAKE_SIZE ${TOOLCHAIN_PREFIX}size) + +set(CMAKE_EXECUTABLE_SUFFIX_ASM ".elf") +set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") +set(CMAKE_EXECUTABLE_SUFFIX_CXX ".elf") + +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) -- Gitee