1 /* 2 * Copyright (c) 2006-2021, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2018-02-08 RT-Thread the first version 9 */ 10 11 #ifndef __DRV_SPI_H__ 12 #define __DRV_SPI_H__ 13 14 #ifdef __cplusplus 15 extern "C" { 16 #endif 17 /********************** private ************************************/ 18 19 #define SPI0_BASE_ADDR (0x01C05000) 20 #define SPI1_BASE_ADDR (0x01C06000) 21 22 /** 23 * @brief Serial Peripheral Interface 24 */ 25 typedef struct 26 { 27 volatile rt_uint32_t VER; /* SPI Version number Register, Address offset: 0x00 */ 28 volatile rt_uint32_t CTRL; /* SPI Global Control Register, Address offset: 0x04 */ 29 volatile rt_uint32_t TCTRL; /* SPI Transfer Control Register, Address offset: 0x08 */ 30 volatile rt_uint32_t RESERVED1[1]; /* Reserved, 0x0C */ 31 volatile rt_uint32_t IER; /* SPI Interrupt Control Register, Address offset: 0x10 */ 32 volatile rt_uint32_t STA; /* SPI Interrupt Status Register, Address offset: 0x14 */ 33 volatile rt_uint32_t FCTL; /* SPI FIFO Control Register, Address offset: 0x18 */ 34 volatile rt_uint32_t FST; /* SPI FIFO Status Register, Address offset: 0x1C */ 35 volatile rt_uint32_t WAIT; /* SPI Wait Clock Counter Register, Address offset: 0x20 */ 36 volatile rt_uint32_t CCTR; /* SPI Clock Rate Control Register, Address offset: 0x24 */ 37 volatile rt_uint32_t RESERVED2[2]; /* Reserved, 0x28-0x2C */ 38 volatile rt_uint32_t BC; /* SPI Master mode Burst Control Register, Address offset: 0x30 */ 39 volatile rt_uint32_t TC; /* SPI Master mode Transmit Counter Register, Address offset: 0x34 */ 40 volatile rt_uint32_t BCC; /* SPI Burst Control Register, Address offset: 0x38 */ 41 volatile rt_uint32_t RESERVED3[19]; /* Reserved, 0x3C-0x84 */ 42 volatile rt_uint32_t NDMA_MODE_CTRL; /* SPI Nomal DMA Mode Control Regist Address offset: 0x88 */ 43 volatile rt_uint32_t RESERVED4[93]; /* Reserved, 0x8C-0x1FC */ 44 volatile rt_uint32_t TXD; /* SPI TX Date Register, Address offset: 0x200 */ 45 volatile rt_uint32_t RESERVED5[63]; /* Reserved, 0x204-0x2FC */ 46 volatile rt_uint32_t RXD; /* SPI RX Date Register, Address offset: 0x300 */ 47 } SPI_T; 48 49 /* 50 * @brief SPI Global Control Register 51 */ 52 #define SPI_CTRL_RST_SHIFT (31) 53 #define SPI_CTRL_RST_MASK (0x1U << SPI_CTRL_RST_SHIFT) 54 55 #define SPI_CTRL_TP_EN_SHIFT (7) 56 #define SPI_CTRL_TP_EN_MASK (0x1U << SPI_CTRL_TP_EN_SHIFT) 57 58 #define SPI_CTRL_MODE_SHIFT (1) 59 #define SPI_CTRL_MODE_MASK (0x1U << SPI_CTRL_MODE_SHIFT) 60 typedef enum 61 { 62 SPI_CTRL_MODE_SLAVE = 0 << SPI_CTRL_MODE_SHIFT, 63 SPI_CTRL_MODE_MASTER = 1 << SPI_CTRL_MODE_SHIFT 64 } SPI_CTRL_Mode; 65 66 #define SPI_CTRL_EN_SHIFT (0) 67 #define SPI_CTRL_EN_MASK (0x1U << SPI_CTRL_EN_SHIFT) 68 typedef enum 69 { 70 SPI_CTRL_EN_DISABLE = 0 << SPI_CTRL_EN_SHIFT, 71 SPI_CTRL_EN_ENABLE = 1 << SPI_CTRL_EN_SHIFT 72 } SPI_CTRL_En; 73 74 /* 75 * @brief SPI Transfer Control Register 76 */ 77 #define SPI_TCTRL_XCH_SHIFT (31) 78 #define SPI_TCTRL_XCH_MASK (0x1U << SPI_TCTRL_XCH_SHIFT) 79 typedef enum 80 { 81 SPI_TCTRL_XCH_IDLE = 0 << SPI_TCTRL_XCH_SHIFT, 82 SPI_TCTRL_XCH_START = 1 << SPI_TCTRL_XCH_SHIFT 83 } SPI_TCTRL_Xch; 84 85 #define SPI_TCTRL_SDDM_SHIFT (14) 86 #define SPI_TCTRL_SDDM_MASK (0x0U << SPI_TCTRL_SDDM_SHIFT) 87 typedef enum 88 { 89 SPI_TCTRL_SDDM_SEND_NODELAY = 0 << SPI_TCTRL_SDDM_SHIFT, 90 SPI_TCTRL_SDDM_SEND_DELAY = 1 << SPI_TCTRL_SDDM_SHIFT 91 } SPI_TCTRL_Sddm; 92 93 #define SPI_TCTRL_SDM_SHIFT (13) 94 #define SPI_TCTRL_SDM_MASK (0x1U << SPI_TCTRL_SDM_SHIFT) 95 typedef enum 96 { 97 SPI_TCTRL_SDM_SAMPLE_NODELAY = 1 << SPI_TCTRL_SDM_SHIFT, 98 SPI_TCTRL_SDM_SAMPLE_DELAY = 0 << SPI_TCTRL_SDM_SHIFT 99 } SPI_TCTRL_Sdm; 100 101 #define SPI_TCTRL_FBS_SHIFT (12) 102 #define SPI_TCTRL_FBS_MASK (0x1U << SPI_TCTRL_FBS_SHIFT) 103 typedef enum 104 { 105 SPI_TCTRL_FBS_MSB = 0 << SPI_TCTRL_FBS_SHIFT, 106 SPI_TCTRL_FBS_LSB = 1 << SPI_TCTRL_FBS_SHIFT 107 } SPI_TCTRL_Fbs; 108 109 #define SPI_TCTRL_SDC_SHIFT (11) 110 #define SPI_TCTRL_SDC_MASK (0x1U << SPI_TCTRL_SDC_SHIFT) 111 112 #define SPI_TCTRL_RPSM_SHIFT (10) 113 #define SPI_TCTRL_RPSM_MASK (0x1U << SPI_TCTRL_RPSM_SHIFT) 114 115 #define SPI_TCTRL_DDB_SHIFT (9) 116 #define SPI_TCTRL_DDB_MASK (0x1U << SPI_TCTRL_DDB_SHIFT) 117 118 #define SPI_TCTRL_DHB_SHIFT (8) 119 #define SPI_TCTRL_DHB_MASK (0x1U << SPI_TCTRL_DHB_SHIFT) 120 typedef enum 121 { 122 SPI_TCTRL_DHB_FULL_DUPLEX = 0 << SPI_TCTRL_DHB_SHIFT, 123 SPI_TCTRL_DHB_HALF_DUPLEX = 1 << SPI_TCTRL_DHB_SHIFT 124 } SPI_TCTRL_DHB_Duplex; 125 126 #define SPI_TCTRL_SS_LEVEL_SHIFT (7) 127 #define SPI_TCTRL_SS_LEVEL_MASK (0x1U << SPI_TCTRL_SS_LEVEL_SHIFT) 128 129 #define SPI_TCTRL_SS_OWNER_SHIFT (6) 130 #define SPI_TCTRL_SS_OWNER_MASK (0x1U << SPI_TCTRL_SS_OWNER_SHIFT) 131 typedef enum 132 { 133 SPI_TCTRL_SS_OWNER_CONTROLLER = 0 << SPI_TCTRL_SS_OWNER_SHIFT, 134 SPI_TCTRL_SS_OWNER_SOFTWARE = 1 << SPI_TCTRL_SS_OWNER_SHIFT 135 } SPI_TCTRL_SS_OWNER; 136 137 #define SPI_TCTRL_SS_SEL_SHIFT (4) 138 #define SPI_TCTRL_SS_SEL_MASK (0x3U << SPI_TCTRL_SS_SEL_SHIFT) 139 typedef enum 140 { 141 SPI_TCTRL_SS_SEL_SS0 = 0 << SPI_TCTRL_SS_SEL_SHIFT, 142 SPI_TCTRL_SS_SEL_SS1 = 1 << SPI_TCTRL_SS_SEL_SHIFT, 143 SPI_TCTRL_SS_SEL_SS2 = 2 << SPI_TCTRL_SS_SEL_SHIFT, 144 SPI_TCTRL_SS_SEL_SS3 = 3 << SPI_TCTRL_SS_SEL_SHIFT 145 } SPI_TCTRL_SS_Sel; 146 147 #define SPI_TCTRL_SS_CTL_SHIFT (3) 148 #define SPI_TCTRL_SS_CTL_MASK (0x1U << SPI_TCTRL_SS_CTL_SHIFT) 149 150 #define SPI_TCTRL_SPOL_SHIFT (2) 151 #define SPI_TCTRL_SPOL_MASK (0x1U << SPI_TCTRL_SPOL_SHIFT) 152 153 #define SPI_TCTRL_CPOL_SHIFT (1) 154 #define SPI_TCTRL_CPOL_MASK (0x1U << SPI_TCTRL_CPOL_SHIFT) 155 typedef enum 156 { 157 SPI_TCTRL_CPOL_HIGH = 0 << SPI_TCTRL_CPOL_SHIFT, 158 SPI_TCTRL_CPOL_LOW = 1 << SPI_TCTRL_CPOL_SHIFT 159 } SPI_TCTRL_Cpol; 160 161 #define SPI_TCTRL_CPHA_SHIFT (0) 162 #define SPI_TCTRL_CPHA_MASK (0x1U << SPI_TCTRL_CPHA_SHIFT) 163 typedef enum 164 { 165 SPI_TCTRL_CPHA_PHASE0 = 0 << SPI_TCTRL_CPHA_SHIFT, 166 SPI_TCTRL_CPHA_PHASE1 = 1 << SPI_TCTRL_CPHA_SHIFT 167 } SPI_TCTRL_Cpha; 168 169 typedef enum 170 { 171 SPI_SCLK_Mode0 = 0 << SPI_TCTRL_CPHA_SHIFT, 172 SPI_SCLK_Mode1 = 1 << SPI_TCTRL_CPHA_SHIFT, 173 SPI_SCLK_Mode2 = 2 << SPI_TCTRL_CPHA_SHIFT, 174 SPI_SCLK_Mode3 = 3 << SPI_TCTRL_CPHA_SHIFT 175 } SPI_SCLK_Mode; 176 177 /* 178 * @brief SPI Interrupt Control Register 179 */ 180 #define SPI_IER_SS_INT_EN_SHIFT (13) 181 #define SPI_IER_SS_INT_EN_MASK (0x1U << SPI_IER_SS_INT_EN_SHIFT) 182 183 #define SPI_IER_TC_INT_EN_SHIFT (12) 184 #define SPI_IER_TC_INT_EN_MASK (0x1U << SPI_IER_TC_INT_EN_SHIFT) 185 186 #define SPI_IER_TF_UDR_INT_EN_SHIFT (11) 187 #define SPI_IER_TF_UDR_INT_EN_MASK (0x1U << SPI_IER_TF_UDR_INT_EN_SHIFT) 188 189 #define SPI_IER_TF_OVF_INT_EN_SHIFT (10) 190 #define SPI_IER_TF_OVF_INT_EN_MASK (0x1U << SPI_IER_TF_OVF_INT_EN_SHIFT) 191 192 #define SPI_IER_RF_UDR_INT_EN_SHIFT (9) 193 #define SPI_IER_RF_UDR_INT_EN_MASK (0x1U << SPI_IER_RF_UDR_INT_EN_SHIFT) 194 195 #define SPI_IER_RF_OVF_INT_EN_SHIFT (8) 196 #define SPI_IER_RF_OVF_INT_EN_MASK (0x1U << SPI_IER_RF_OVF_INT_EN_SHIFT) 197 198 #define SPI_IER_TF_FUL_INT_EN_SHIFT (6) 199 #define SPI_IER_TF_FUL_INT_EN_MASK (0x1U << SPI_IER_TF_FUL_INT_EN_SHIFT) 200 201 #define SPI_IER_TX_EMP_INT_EN_SHIFT (5) 202 #define SPI_IER_TX_EMP_INT_EN_MASK (0x1U << SPI_IER_TX_EMP_INT_EN_SHIFT) 203 204 #define SPI_IER_TX_ERQ_INT_EN_SHIFT (4) 205 #define SPI_IER_TX_ERQ_INT_EN_MASK (0x1U << SPI_IER_TX_ERQ_INT_EN_SHIFT) 206 207 #define SPI_IER_RF_FUL_INT_EN_SHIFT (2) 208 #define SPI_IER_RF_FUL_INT_EN_MASK (0x1U << SPI_IER_RF_FUL_INT_EN_SHIFT) 209 210 #define SPI_IER_RX_EMP_INT_EN_SHIFT (1) 211 #define SPI_IER_RX_EMP_INT_EN_MASK (0x1U << SPI_IER_RX_EMP_INT_EN_SHIFT) 212 213 #define SPI_IER_RF_RDY_INT_EN_SHIFT (0) 214 #define SPI_IER_RF_RDY_INT_EN_MASK (0x1U << SPI_IER_RF_RDY_INT_EN_SHIFT) 215 216 /* 217 * @brief SPI Interrupt Status Register 218 */ 219 #define SPI_STA_SSI_SHIFT (13) 220 #define SPI_STA_SSI_MASK (0x1U << SPI_STA_SSI_SHIFT) 221 222 #define SPI_STA_TC_SHIFT (12) 223 #define SPI_STA_TC_MASK (0x1U << SPI_STA_TC_SHIFT) 224 225 #define SPI_STA_TF_UDF_SHIFT (11) 226 #define SPI_STA_TF_UDF_MASK (0x1U << SPI_STA_TF_UDF_SHIFT) 227 228 #define SPI_STA_TF_OVF_SHIFT (10) 229 #define SPI_STA_TF_OVF_MASK (0x1U << SPI_STA_TF_OVF_SHIFT) 230 231 #define SPI_STA_RX_UDF_SHIFT (9) 232 #define SPI_STA_RX_UDF_MASK (0x1U << SPI_STA_RX_UDF_SHIFT) 233 234 #define SPI_STA_RX_OVF_SHIFT (8) 235 #define SPI_STA_RX_OVF_MASK (0x1U << SPI_STA_RX_OVF_SHIFT) 236 237 #define SPI_STA_TX_FULL_SHIFT (6) 238 #define SPI_STA_TX_FULL_MASK (0x1U << SPI_STA_TX_FULL_SHIFT) 239 240 #define SPI_STA_TX_EMP_SHIFT (5) 241 #define SPI_STA_TX_EMP_MASK (0x1U << SPI_STA_TX_EMP_SHIFT) 242 243 #define SPI_STA_TX_READY_SHIFT (4) 244 #define SPI_STA_TX_READY_MASK (0x1U << SPI_STA_TX_READY_SHIFT) 245 246 #define SPI_STA_RX_FULL_SHIFT (2) 247 #define SPI_STA_RX_FULL_MASK (0x1U << SPI_STA_RX_FULL_SHIFT) 248 249 #define SPI_STA_RX_EMP_SHIFT (1) 250 #define SPI_STA_RX_EMP_MASK (0x1U << SPI_STA_RX_EMP_SHIFT) 251 252 #define SPI_STA_RX_RDY_SHIFT (0) 253 #define SPI_STA_RX_RDY_MASK (0x1U << SPI_STA_RX_RDY_SHIFT) 254 255 /* 256 * @brief SPI FIFO Control Register 257 */ 258 #define SPI_FCTL_TF_RST_SHIFT (31) 259 #define SPI_FCTL_TF_RST_MASK (0x1U << SPI_FCTL_TF_RST_SHIFT) 260 261 #define SPI_FCTL_TF_TEST_EN_SHIFT (30) 262 #define SPI_FCTL_TF_TEST_EN_MASK (0x1U << SPI_FCTL_TF_TEST_EN_SHIFT) 263 264 #define SPI_FCTL_TF_DRQ_EN_SHIFT (24) 265 #define SPI_FCTL_TF_DRQ_EN_MASK (0x1U << SPI_FCTL_TF_DRQ_EN_SHIFT) 266 #define SPI_FCTL_TF_DRQ_EN_BIT HAL_BIT(24) 267 268 #define SPI_FCTL_TX_TRIG_LEVEL_SHIFT (16) 269 #define SPI_FCTL_TX_TRIG_LEVEL_MASK (0xFFU << SPI_FCTL_TX_TRIG_LEVEL_SHIFT) 270 271 #define SPI_FCTL_RF_RST_SHIFT (15) 272 #define SPI_FCTL_RF_RST_MASK (0x1U << SPI_FCTL_RF_RST_SHIFT) 273 274 #define SPI_FCTL_RF_TEST_SHIFT (14) 275 #define SPI_FCTL_RF_TEST_MASK (0x1U << SPI_FCTL_RF_TEST_SHIFT) 276 277 #define SPI_FCTL_RF_DRQ_EN_SHIFT (8) 278 #define SPI_FCTL_RF_DRQ_EN_MASK (0x1U << SPI_FCTL_RF_DRQ_EN_SHIFT) 279 280 #define SPI_FCTL_RX_TRIG_LEVEL_SHIFT (0) 281 #define SPI_FCTL_RX_TRIG_LEVEL_MASK (0xFFU << SPI_FCTL_RX_TRIG_LEVEL_SHIFT) 282 283 /* 284 * @brief SPI FIFO Status Registe 285 */ 286 #define SPI_FST_TB_WR_SHIFT (31) 287 #define SPI_FST_TB_WR_MASK (0x1U << SPI_FST_TB_WR_SHIFT) 288 289 #define SPI_FST_TB_CNT_SHIFT (28) 290 #define SPI_FST_TB_CNT_MASK (0x7U << SPI_FST_TB_CNT_SHIFT) 291 292 #define SPI_FST_TF_CNT_SHIFT (16) 293 #define SPI_FST_TF_CNT_MASK (0xFFU << SPI_FST_TF_CNT_SHIFT) 294 295 #define SPI_FST_RB_WR_SHIFT (15) 296 #define SPI_FST_RB_WR_MASK (0x1U << SPI_FST_RB_WR_SHIFT) 297 298 #define SPI_FST_RB_CNT_SHIFT (12) 299 #define SPI_FST_RB_CNT_MASK (0x7U << SPI_FST_RB_CNT_SHIFT) 300 301 #define SPI_FST_RF_CNT_SHIFT (0) 302 #define SPI_FST_RF_CNT_MASK (0xFFU << SPI_FST_RF_CNT_SHIFT) 303 304 /* 305 * @brief SPI Wait Clock Counter Register 306 */ 307 #define SPI_WAIT_SWC_SHIFT (16) 308 #define SPI_WAIT_SWC_MASK (0xFU << SPI_WAIT_SWC_SHIFT) 309 310 #define SPI_WAIT_WCC_SHIFT (0) 311 #define SPI_WAIT_WCC_MASK (0xFFFFU << SPI_WAIT_WCC_SHIFT) 312 313 /* 314 * @brief SPI Clock Rate Control Register 315 */ 316 #define SPI_CCTR_DRS_SHIFT (12) 317 #define SPI_CCTR_DRS_MASK (0x1U << SPI_CCTR_DRS_SHIFT) 318 typedef enum 319 { 320 SPI_CCTR_DRS_type_divRate1 = 0 << SPI_CCTR_DRS_SHIFT, 321 SPI_CCTR_DRS_type_divRate2 = 1 << SPI_CCTR_DRS_SHIFT 322 } SPI_CCTR_DRS_type; 323 324 #define SPI_CCTR_CDR1_SHIFT (8) 325 #define SPI_CCTR_CDR1_MASK (0xFU << SPI_CCTR_CDR1_SHIFT) 326 327 #define SPI_CCTR_CDR2_SHIFT (0) 328 #define SPI_CCTR_CDR2_MASK (0xFFU << SPI_CCTR_CDR2_SHIFT) 329 330 /* 331 * @brief SPI Master mode Burst Control Register 332 */ 333 #define SPI_BC_MBC_SHIFT (0) 334 #define SPI_BC_MBC_MASK (0xFFFFFFU << SPI_BC_MBC_SHIFT) 335 336 /* 337 * @brief SPI Master mode Transmit Counter Register 338 */ 339 #define SPI_TC_MWTC_SHIFT (0) 340 #define SPI_TC_MWTC_MASK (0xFFFFFFU << SPI_TC_MWTC_SHIFT) 341 342 /* 343 * @brief SPI Burst Control Register 344 */ 345 #define SPI_BCC_DRM_SHIFT (28) 346 #define SPI_BCC_DRM_MASK (0x1U << SPI_BCC_DRM_SHIFT) 347 348 #define SPI_BCC_DBC_SHIFT (24) 349 #define SPI_BCC_DBC_MASK (0xFU << SPI_BCC_DBC_SHIFT) 350 351 #define SPI_BCC_STC_SHIFT (0) 352 #define SPI_BCC_STC_MASK (0xFFFFFFU << SPI_BCC_STC_SHIFT) 353 354 /* 355 * @brief SPI Nomal DMA Mode Control Regist 356 */ 357 #define SPI_NDMA_MODE_CTRL_SHIFT (0) 358 #define SPI_NDMA_MODE_CTRL_MASK (0xFFU << SPI_NDMA_MODE_CTRL_SHIFT) 359 360 /* 361 * @brief SPI TX Date Register 362 */ 363 #define SPI_TXD_SHIFT (0) 364 #define SPI_TXD_MASK (0xFFFFFFFFU << SPI_TXD_SHIFT) 365 366 /* 367 * @brief SPI RX Date Register 368 */ 369 #define SPI_RXD_SHIFT (0) 370 #define SPI_RXD_MASK (0xFFFFFFFFU << SPI_RXD_SHIFT) 371 372 /* other */ 373 #define SPI_FIFO_SIZE (64) 374 #define SPI_MAX_WAIT_MS (2000) 375 #define SPI_SOURCE_CLK (24 * 1000 * 1000) 376 377 /* io ops */ 378 #define HAL_BIT(pos) (1U << (pos)) 379 380 #define HAL_SET_BIT(reg, mask) ((reg) |= (mask)) 381 #define HAL_CLR_BIT(reg, mask) ((reg) &= ~(mask)) 382 #define HAL_GET_BIT(reg, mask) ((reg) & (mask)) 383 #define HAL_GET_BIT_VAL(reg, shift, vmask) (((reg) >> (shift)) & (vmask)) 384 385 #define HAL_MODIFY_REG(reg, clr_mask, set_mask) \ 386 ((reg) = (((reg) & (~(clr_mask))) | (set_mask))) 387 388 /* access LSBs of a 32-bit register (little endian only) */ 389 #define HAL_REG_32BIT(reg_addr) (*((volatile rt_uint32_t *)(reg_addr))) 390 #define HAL_REG_16BIT(reg_addr) (*((volatile rt_uint16_t *)(reg_addr))) 391 #define HAL_REG_8BIT(reg_addr) (*((volatile rt_uint8_t *)(reg_addr))) 392 393 #define HAL_WAIT_FOREVER OS_WAIT_FOREVER 394 395 #define HAL_ARRAY_SIZE(a) (sizeof((a)) / sizeof((a)[0])) 396 397 struct tina_spi 398 { 399 SPI_T *spi; 400 unsigned int spi_gate; 401 struct rt_spi_bus *spi_bus; 402 }; 403 404 struct tina_spi_cs 405 { 406 SPI_TCTRL_SS_Sel cs; 407 }; 408 /* public function */ 409 rt_err_t r6_spi_bus_register(SPI_T *spi, const char *spi_bus_name); 410 411 #ifdef __cplusplus 412 } 413 #endif 414 #endif // 415