aboutsummaryrefslogtreecommitdiff
path: root/include/arch/stm32l4xxx/peripherals/spi.h
blob: eb9741edffa15d8b6e9aa63bba07cee83092fbb4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#ifndef CORE_SPI_H_
#define CORE_SPI_H_

#include "kern/common.h"
#include "arch.h"

#define SPI1 (*((spi_regs_t*)(SPI1_BASE)))
#define SPI3 (*((spi_regs_t*)(SPI3_BASE)))

typedef enum {
  SPI_BAUD_RATE_FPCLK_DIV_2   = 0,
  SPI_BAUD_RATE_FPCLK_DIV_4   = 1,
  SPI_BAUD_RATE_FPCLK_DIV_8   = 2,
  SPI_BAUD_RATE_FPCLK_DIV_16  = 3,
  SPI_BAUD_RATE_FPCLK_DIV_32  = 4,
  SPI_BAUD_RATE_FPCLK_DIV_64  = 5,
  SPI_BAUD_RATE_FPCLK_DIV_128 = 6,
  SPI_BAUD_RATE_FPCLK_DIV_256 = 7,
} spi_baud_rate_t;

typedef enum {
  SPI_REG_DATA_SIZE_NOT_USED_0  = 0,
  SPI_REG_DATA_SIZE_NOT_USED_1  = 1,
  SPI_REG_DATA_SIZE_NOT_USED_2  = 2,
  SPI_REG_DATA_SIZE_4_BITS      = 3,
  SPI_REG_DATA_SIZE_5_BITS      = 4,
  SPI_REG_DATA_SIZE_6_BITS      = 5,
  SPI_REG_DATA_SIZE_7_BITS      = 6,
  SPI_REG_DATA_SIZE_8_BITS      = 7,
  SPI_REG_DATA_SIZE_9_BITS      = 8,
  SPI_REG_DATA_SIZE_10_BITS     = 9,
  SPI_REG_DATA_SIZE_11_BITS     = 10,
  SPI_REG_DATA_SIZE_12_BITS     = 11,
  SPI_REG_DATA_SIZE_13_BITS     = 12,
  SPI_REG_DATA_SIZE_14_BITS     = 13,
  SPI_REG_DATA_SIZE_15_BITS     = 14,
  SPI_REG_DATA_SIZE_16_BITS     = 15,
} spi_reg_data_size_t;

typedef enum {
  SPI_FIFO_STATUS_EMPTY = 0,
  SPI_FIFO_STATUS_QUARTER = 1,
  SPI_FIFO_STATUS_HALF = 2,
  SPI_FIFO_STATUS_FULL = 3,
} spi_fifo_status_t;

typedef __IO struct {
  /* spi control register. */
#define spi_bidimode  (1 << 15)  /* Bidirectional data mode enable. */
#define spi_bidioe    (1 << 14)  /* Output enable in bidirectional mode */
#define spi_crcen     (1 << 13)  /* Hardware CRC calculation enable */
#define spi_crcnext   (1 << 12)  /* Transmit CRC next */
#define spi_crcl      (1 << 11)  /* CRC length */
#define spi_rxonly    (1 << 10)  /* Receive only mode enabled. */
#define spi_ssm       (1 << 9)   /* Software slave management */
#define spi_ssi       (1 << 8)   /* Internal slave select */
#define spi_lsbfirst  (1 << 7)   /* Frame format */
#define spi_spe       (1 << 6)   /* SPI enable */
#define spi_br        (7 << 3)   /* SPI enable */
#define spi_mstr      (1 << 2)   /* Master selection */
#define spi_cpol      (1 << 1)   /* Clock polarity */
#define spi_cpha      (1 << 0)   /* Clock phase */
  uint32_t c_r1;

  /* spi control register #2 */
#define spi_ldma_tx  (1 << 14)   /* Last DMA transfer for transmission */
#define spi_ldma_rx  (1 << 13)   /* Last DMA transfer for reception */
#define spi_frxth    (1 << 12)   /* FIFO reception threshold */
#define spi_ds       (0xF << 8)  /* Data size */
#define spi_txeie    (1 << 7)    /* Tx buffer empty interrupt enable */
#define spi_rxneie   (1 << 6)    /* RX buffer not empty interrupt enable */
#define spi_errie    (1 << 5)    /* Error interrupt enable */
#define spi_frf      (1 << 4)    /* Frame format */
#define spi_nssp     (1 << 3)    /*: NSS pulse management */
#define spi_ssoe     (1 << 2)    /* SS output enable */
#define spi_txdmaen  (1 << 1)    /* Tx buffer DMA enable */
#define spi_rxdmaen  (1 << 0)    /* Rx buffer DMA enable */
  uint32_t c_r2;

  /* spi status register. */
#define spi_ftlvl   (3 << 11)  /* Transmisison level */
#define spi_frlvl   (3 << 9)   /* Reception level */
#define spi_fre     (1 << 8)   /* Frame format error */
#define spi_bsy     (1 << 7)   /* Busy flag */
#define spi_ovr     (1 << 6)   /* Overrun flag */
#define spi_modf    (1 << 5)   /* Mode fault */
#define spi_crcerr  (1 << 4)   /* CRC error flag */
#define spi_txe     (1 << 1)   /* Transmit buffer empty */
#define spi_rxne    (1 << 0)   /* Receive buffer not empty */
  uint32_t s_r;

  /* spi data register. Really only the least-significant 16 bits are used.
   * reading from this register reads from the Rx FIFO while writing to it
   * writes to the Tx FIFO. */
  union {
    /* The lower 8 its of the spi data register. */
    __IO uint8_t dl_r;

    /* The data register. */
    __IO uint16_t d_r;
  };

  __IO uint16_t unused;

  /* spi CRC polynomial register. */
  uint32_t crcp_r;

  /* spi rx CRC register. */
  uint32_t rxcrc_r;

  /* spi tx CRC register. */
  uint32_t txcrc_r;
} spi_regs_t;

static_assert(offsetof(spi_regs_t, txcrc_r) == 0x18, "Offset check failed.");

#endif /* CORE_SPI_H_ */