dw_spi.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*
  2. * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /******************************************************************************
  17. * @file dw_spi.h
  18. * @brief header file for spi driver
  19. * @version V1.0
  20. * @date 02. June 2017
  21. ******************************************************************************/
  22. #ifndef __DW_SPI_H
  23. #define __DW_SPI_H
  24. #include <stdio.h>
  25. #include "soc.h"
  26. /*
  27. * SPI register bit definitions
  28. */
  29. #define DW_SPI_ENABLE 0x01
  30. #define DW_SPI_DISABLE 0x00
  31. #define DW_SPI_TMOD_BIT8 0x0100
  32. #define DW_SPI_TMOD_BIT9 0x0200
  33. #define DW_SPI_POLARITY 0x80
  34. #define DW_SPI_PHASE 0x40
  35. #define DW_SPI_BUSY 0x01
  36. #define DW_SPI_TFE 0x04
  37. #define DW_SPI_RFNE 0x08
  38. #define DW_SPI_INT_EN 0x19
  39. #define DW_SPI_RINT_EN 0x3e
  40. #define DW_SPI_TINT_EN 0x3f
  41. #define DW_SPI_INT_DISABLE 0x00
  42. #define DW_SPI_INT_MASK_RX 0x27
  43. #define DW_SPI_INT_MASKTX 0x3e
  44. #define DW_SPI_RDMAE 0x1
  45. #define DW_SPI_TDMAE 0x2
  46. #define DW_SPI_TXFIFO_LV 0x0
  47. #define DW_SPI_RXFIFO_LV 0x1d
  48. #define DW_SPI_RXFIFO_NOT_EMPTY 0x08
  49. #define DW_SPI_START_RX 0x0
  50. #define DW_SPI_FIFO_MAX_LV 0x20
  51. #define DW_SPI_FIFO_OVER_LV 0x18
  52. #define DW_SPI_RXFIFO_OVERFLOW 0x08
  53. #define DW_SPI_RXFIFO_FULL 0x10
  54. #define DW_SPI_TXFIFO_EMPTY 0x01
  55. #define SPI_CS_SELECTED 0x0
  56. #define DW_SPI_IMR_TXEIM 0x01 /* Transmit FIFO Empty Interrupt Mask */
  57. #define DW_SPI_IMR_RXFIM 0x10 /* Receive FIFO Full Interrupt Mask */
  58. /* some infoermationgs of SPI for special MCU */
  59. #define DW_SPI_DEFAULT_BAUDR 10000000 /* 10M */
  60. #define DW_SPI_MAXID 0x1
  61. #define SPI_INITIALIZED ((uint8_t)(1U)) // SPI initalized
  62. #define SPI_POWERED ((uint8_t)(1U<< 1)) // SPI powered on
  63. #define SPI_CONFIGURED ((uint8_t)(1U << 2)) // SPI configured
  64. #define SPI_DATA_LOST ((uint8_t)(1U << 3)) // SPI data lost occurred
  65. #define SPI_MODE_FAULT ((uint8_t)(1U << 4)) // SPI mode fault occurred
  66. typedef enum {
  67. DWENUM_SPI_DMACR_RXE = 0,
  68. DWENUM_SPI_DMACR_TXE = 1,
  69. } DWENUM_SPI_DMACR;
  70. typedef enum {
  71. DWENUM_SPI_TXRX = 0,
  72. DWENUM_SPI_TX = 1,
  73. DWENUM_SPI_RX = 2,
  74. DWENUM_SPI_EERX = 3
  75. } DWENUM_SPI_MODE;
  76. typedef enum {
  77. DWENUM_SPI_CLOCK_POLARITY_LOW = 0,
  78. DWENUM_SPI_CLOCK_POLARITY_HIGH = 1
  79. } DWENUM_SPI_POLARITY;
  80. typedef enum {
  81. DWENUM_SPI_CLOCK_PHASE_MIDDLE = 0,
  82. DWENUM_SPI_CLOCK_PHASE_START = 1
  83. } DWENUM_SPI_PHASE;
  84. typedef enum {
  85. DWENUM_SPI_DATASIZE_4 = 3,
  86. DWENUM_SPI_DATASIZE_5 = 4,
  87. DWENUM_SPI_DATASIZE_6 = 5,
  88. DWENUM_SPI_DATASIZE_7 = 6,
  89. DWENUM_SPI_DATASIZE_8 = 7,
  90. DWENUM_SPI_DATASIZE_9 = 8,
  91. DWENUM_SPI_DATASIZE_10 = 9,
  92. DWENUM_SPI_DATASIZE_11 = 10,
  93. DWENUM_SPI_DATASIZE_12 = 11,
  94. DWENUM_SPI_DATASIZE_13 = 12,
  95. DWENUM_SPI_DATASIZE_14 = 13,
  96. DWENUM_SPI_DATASIZE_15 = 14,
  97. DWENUM_SPI_DATASIZE_16 = 15
  98. } DWENUM_SPI_DATAWIDTH;
  99. typedef enum {
  100. DWENUM_SPI_CS0 = 1,
  101. DWENUM_SPI_CS1 = 2
  102. } DWENUM_SPI_SLAVE;
  103. typedef struct {
  104. __IOM uint16_t CTRLR0; /* Offset: 0x000 (R/W) Control register 0 */
  105. uint16_t RESERVED0;
  106. __IOM uint16_t CTRLR1; /* Offset: 0x004 (R/W) Control register 1 */
  107. uint16_t RESERVED1;
  108. __IOM uint8_t SPIENR; /* Offset: 0x008 (R/W) SSI enable regiseter */
  109. uint8_t RESERVED2[7];
  110. __IOM uint32_t SER; /* Offset: 0x010 (R/W) Slave enable register */
  111. __IOM uint16_t BAUDR; /* Offset: 0x014 (R/W) Baud rate select */
  112. uint16_t RESERVED3;
  113. __IOM uint32_t TXFTLR; /* Offset: 0x018 (R/W) Transmit FIFO Threshold Level */
  114. __IOM uint32_t RXFTLR; /* Offset: 0x01c (R/W) Receive FIFO Threshold Level */
  115. __IOM uint32_t TXFLR; /* Offset: 0x020 (R/W) Transmit FIFO Level register */
  116. __IOM uint32_t RXFLR; /* Offset: 0x024 (R/W) Receive FIFO Level Register */
  117. __IOM uint8_t SR; /* Offset: 0x028 (R/W) status register */
  118. uint8_t RESERVED4[3];
  119. __IOM uint32_t IMR; /* Offset: 0x02C (R/W) Interrupt Mask Register */
  120. __IM uint32_t ISR; /* Offset: 0x030 (R/W) interrupt status register */
  121. __IM uint32_t RISR; /* Offset: 0x034 (R/W) Raw Interrupt Status Register */
  122. __IM uint8_t TXOICR; /* Offset: 0x038 (R/W) Transmit FIFO Overflow Interrupt Clear Register */
  123. uint8_t RESERVED5[3];
  124. __IM uint8_t RXOICR; /* Offset: 0x03C (R/W) Receive FIFO Overflow Interrupt Clear Register*/
  125. uint8_t RESERVED6[3];
  126. __IM uint8_t RXUICR; /* Offset: 0x040 (R/W) Receive FIFO Underflow Interrupt Clear Register */
  127. uint8_t RESERVED7[3];
  128. __IM uint8_t MSTICR; /* Offset: 0x044 (R/W) Multi-Master Interrupt Clear Register */
  129. uint8_t RESERVED8[3];
  130. __IM uint8_t ICR; /* Offset: 0x048 (R/W) Interrupt Clear Register */
  131. uint8_t RESERVED9[3];
  132. __IOM uint8_t DMACR; /* Offset: 0x04C (R/W) DMA Control Register */
  133. uint8_t RESERVED10[3];
  134. __IOM uint8_t DMATDLR; /* Offset: 0x050 (R/W) DMA Transmoit Data Level */
  135. uint8_t RESERVED11[3];
  136. __IOM uint8_t DMARDLR; /* Offset: 0x054 (R/W) DMA Receive Data Level */
  137. uint8_t RESERVED12[3];
  138. __IM uint32_t IDR; /* Offset: 0x058 (R/W) identification register */
  139. uint32_t RESERVED13;
  140. __IOM uint16_t DR; /* Offset: 0x060 (R/W) Data Register */
  141. uint16_t RESERVED14[17];
  142. __IOM uint8_t WR; /* Offset: 0x0A0 (R/W) SPI is Master or Slave Select Register */
  143. } dw_spi_reg_t;
  144. #endif /* __DW_SPI_H */