spi.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /**
  2. * @file spi.h
  3. * @author chipsea
  4. * @brief Contains all functions support for spi driver
  5. * @version 0.1
  6. * @date 2020-11-30
  7. * @copyright Copyright (c) 2020, CHIPSEA Co., Ltd.
  8. * @note
  9. */
  10. #ifndef _SPI_H_
  11. #define _SPI_H_
  12. #include "types.h"
  13. #include "gpio.h"
  14. #include "clock.h"
  15. #define SPI_DMAC_CH DMA_CH_0
  16. #define REG_PERIPHERAL_MASTER_SELECT (*((volatile unsigned int *) 0x4000302C))
  17. #define SPI_MASTER_SELECT(num) ((REG_PERIPHERAL_MASTER_SELECT) |= (BIT(num) | BIT(num + 4)))
  18. #define SPI_SLAVE_SELECT(num) ((REG_PERIPHERAL_MASTER_SELECT) &= ~(BIT(num)))
  19. #define ENABLE_SPI Ssix->SSIEN = 1
  20. #define DISABLE_SPI Ssix->SSIEN = 0
  21. #define NUMBER_DATA_RX_FIFO Ssix->RXFLR
  22. #define NUMBER_DATA_TX_FIFO Ssix->TXFLR
  23. #define SPI_BUSY 0x1
  24. #define TX_FIFO_NOT_FULL 0x2
  25. #define TX_FIFO_EMPTY 0x4
  26. #define RX_FIFO_NOT_EMPTY 0x8
  27. typedef enum
  28. {
  29. SPI_MODE0=0, //SCPOL=0,SCPH=0
  30. SPI_MODE1, //SCPOL=0,SCPH=1
  31. SPI_MODE2, //SCPOL=1,SCPH=0
  32. SPI_MODE3, //SCPOL=1,SCPH=1
  33. } SPI_SCMOD_e;
  34. typedef enum
  35. {
  36. SPI_MINBYTE=0x03,
  37. SPI_1BYTE=0x07, //1byte
  38. SPI_2BYTE=0x0f,SPI_MAXBYTE=0x0f, //2byte
  39. } SPI_DFS_e;
  40. typedef enum
  41. {
  42. SPI_TRXD=0, //Transmit & Receive
  43. SPI_TXD, //Transmit Only
  44. SPI_RXD, //Receive Only
  45. // SPI_EEPROM, //EEPROM Read
  46. } SPI_TMOD_e;
  47. typedef enum
  48. {
  49. SPI0=0, //use spi 0
  50. SPI1, //use spi 1
  51. } SPI_INDEX_e;
  52. typedef enum
  53. {
  54. SPI_TX_COMPLETED = 1,
  55. SPI_RX_COMPLETED,
  56. SPI_TX_REQ_S, //slave tx
  57. SPI_RX_DATA_S, //slave rx
  58. } SPI_EVT_e;
  59. typedef struct _spi_evt_t
  60. {
  61. uint8_t id;
  62. SPI_EVT_e evt;
  63. uint8_t* data;
  64. uint8_t len;
  65. } spi_evt_t;
  66. typedef void (*spi_hdl_t)(spi_evt_t* pevt);
  67. typedef struct _spi_Cfg_t
  68. {
  69. GpioPin_t sclk_pin;
  70. GpioPin_t ssn_pin;
  71. GpioPin_t MOSI;
  72. GpioPin_t MISO;
  73. uint32_t baudrate;
  74. SPI_TMOD_e spi_tmod;
  75. SPI_SCMOD_e spi_scmod;
  76. SPI_DFS_e spi_dfsmod;
  77. bool dma_tx_enable;
  78. bool dma_rx_enable;
  79. bool int_mode;
  80. bool force_cs;
  81. bool is_slave;
  82. spi_hdl_t evt_handler;
  83. } spi_Cfg_t;
  84. typedef enum
  85. {
  86. TRANSMIT_FIFO_EMPTY = 0x01,
  87. TRANSMIT_FIFO_OVERFLOW = 0x02,
  88. RECEIVE_FIFO_UNDERFLOW = 0x04,
  89. RECEIVE_FIFO_OVERFLOW = 0x08,
  90. RECEIVE_FIFO_FULL = 0x10,
  91. } SPI_INT_STATUS_e;
  92. void __attribute__((weak)) HalSpi0IRQHandler(void);
  93. void __attribute__((weak)) HalSpi1IRQHandler(void);
  94. ErrCode_t HalSpiInit(SPI_INDEX_e channel);
  95. void HalSpiDfsSet(SPI_INDEX_e index, SPI_DFS_e mod);
  96. ErrCode_t HalSpiMasterTransfer(AP_SSI_TypeDef* SPIx, SPI_TMOD_e mod, uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len);
  97. ErrCode_t HalSpiSlaveTxPrepare(AP_SSI_TypeDef* SPIx, uint8_t* tx_buf, uint16_t len);
  98. ErrCode_t HalSpiSetIntMode(SPI_INDEX_e index, bool en);
  99. bool HalSpiGetTransmitState(SPI_INDEX_e index);
  100. ErrCode_t HalSpiMasterConfig(AP_SSI_TypeDef* SPIx, spi_Cfg_t *cfg);
  101. ErrCode_t HalSpiSlaveConfig(AP_SSI_TypeDef* SPIx, spi_Cfg_t *cfg);
  102. ErrCode_t HalSpiDeinit(SPI_INDEX_e index);
  103. ErrCode_t HalSpiDmaSet(SPI_INDEX_e index, bool ten, bool ren);
  104. #endif