Newer
Older
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
#ifndef BOOTLOADER_SPI
#define BOOTLOADER_SPI
#include <stdint.h>
//reg offsets
#define SPI_OFF_CR1 0x00
#define SPI_OFF_CR2 0x04
#define SPI_OFF_SR 0x08
#define SPI_OFF_DR 0x0C
#define SPI_OFF_CRCPR 0x10
#define SPI_OFF_RXCRCR 0x14
#define SPI_OFF_TXCRCR 0x18
#define SPI_OFF_I2SCFGR 0x1C
#define SPI_OFF_I2SPR 0x20
//bits values
#define SPI_CR1_BIDIMODE ( 1 << 15)
#define SPI_CR1_BIDIOE ( 1 << 14)
#define SPI_CR1_CRCEN ( 1 << 13)
#define SPI_CR1_CRCNEXT ( 1 << 12)
#define SPI_CR1_DFF ( 1 << 11)
#define SPI_CR1_RXONLY ( 1 << 10)
#define SPI_CR1_SSM ( 1 << 9)
#define SPI_CR1_SSI ( 1 << 8)
#define SPI_CR1_LSBFIRST ( 1 << 7)
#define SPI_CR1_SPE ( 1 << 6)
#define SPI_CR1_BR_SHIFT 3
#define SPI_CR1_BR_MASK (15 << SPI_CR1_BR_SHIFT)
#define SPI_CR1_MSTR ( 1 << 2)
#define SPI_CR1_CPOL ( 1 << 1)
#define SPI_CR1_CPHA ( 1 << 0)
#define SPI_CR2_TXEIE ( 1 << 7)
#define SPI_CR2_RXNEIE ( 1 << 6)
#define SPI_CR2_ERRIE ( 1 << 5)
#define SPI_CR2_FRF ( 1 << 4)
#define SPI_CR2_SSOE ( 1 << 2)
#define SPI_CR2_TXDMAEN ( 1 << 1)
#define SPI_CR2_RXDMAEN ( 1 << 0)
#define SPI_SR_FRE ( 1 << 8)
#define SPI_SR_BSY ( 1 << 7)
#define SPI_SR_OVR ( 1 << 6)
#define SPI_SR_MODF ( 1 << 5)
#define SPI_SR_CRCERR ( 1 << 4)
#define SPI_SR_UDR ( 1 << 3)
#define SPI_SR_CHSIDE ( 1 << 2)
#define SPI_SR_TXE ( 1 << 1)
#define SPI_SR_RXNE ( 1 << 0)
#define SPI_I2SCFGR_I2SMOD ( 1 << 11)
#define SPI_I2SCFGR_I2SE ( 1 << 10)
#define SPI_I2SCFGR_I2SMAST ( 1 << 9)
#define SPI_I2SCFGR_I2SRX ( 1 << 8)
#define SPI_I2SCFGR_I2SCFG_SHIFT 8
#define SPI_I2SCFGR_I2SCFG_MASK ( 1 << SPI_I2SCFGR_I2SCFG_SHIFT)
#define SPI_I2SCFGR_PCMSYNC ( 1 << 7)
#define SPI_I2SCFGR_I2SSTD_SHIFT 4
#define SPI_I2SCFGR_I2SSTD_MASK ( 7 << SPI_I2SCFGR_I2SSTD_SHIFT)
#define SPI_I2SCFGR_CKPOL ( 1 << 5)
#define SPI_I2SCFGR_DATLEN_SHIFT 1
#define SPI_I2SCFGR_DATLEN_MASK (15 << SPI_I2SCFGR_DATLEN_SHIFT)
#define SPI_I2SCFGR_CHLEN ( 1 << 0)
#define SPI_I2SPR_MCKOE ( 1 << 9 )
#define SPI_I2SPR_ODD ( 1 << 8 )
#define SPI_I2SPR_I2SDIV_SHIFT 0
#define SPI_I2SPR_I2SDIV_MASK (0xFF << SPI_I2SPR_I2SDIV_SHIFT)
/* spi flags
pos len name
0 1 CPHA
1 1 CPOL
2 1 LSB_FIRST
3 3 BAUD_DIV
*/
#define SPI_CPHA_SHIFT 0
#define SPI_CPHA_MASK (1<<SPI_CPHA_SHIFT)
#define SPI_CPHA_0 (0<<SPI_CPHA_SHIFT)
#define SPI_CPHA_1 (1<<SPI_CPHA_SHIFT)
#define SPI_CPOL_SHIFT 1
#define SPI_CPOL_MASK (1<<SPI_CPOL_SHIFT)
#define SPI_CPOL_0 (0<<SPI_CPOL_SHIFT)
#define SPI_CPOL_1 (1<<SPI_CPOL_SHIFT)
#define SPI_MODE_0 (SPI_CPOL_0 | SPI_CPHA_0)
#define SPI_MODE_1 (SPI_CPOL_0 | SPI_CPHA_1)
#define SPI_MODE_2 (SPI_CPOL_1 | SPI_CPHA_0)
#define SPI_MODE_3 (SPI_CPOL_1 | SPI_CPHA_1)
#define SPI_BITORDER_SHIFT 2
#define SPI_BITORDER_MASK (1<<SPI_BITORDER_SHIFT)
#define SPI_MSBFIRST (0<<SPI_BITORDER_SHIFT)
#define SPI_LSBFIRST (1<<SPI_BITORDER_SHIFT)
#define SPI_BAUDDIV_SHIFT 3
#define SPI_BAUDDIV_MASK (7<<SPI_BAUDDIV_SHIFT)
#define SPI_BAUDDIV_2 (0<<SPI_BAUDDIV_SHIFT)
#define SPI_BAUDDIV_4 (1<<SPI_BAUDDIV_SHIFT)
#define SPI_BAUDDIV_8 (2<<SPI_BAUDDIV_SHIFT)
#define SPI_BAUDDIV_16 (3<<SPI_BAUDDIV_SHIFT)
#define SPI_BAUDDIV_32 (4<<SPI_BAUDDIV_SHIFT)
#define SPI_BAUDDIV_64 (5<<SPI_BAUDDIV_SHIFT)
#define SPI_BAUDDIV_128 (6<<SPI_BAUDDIV_SHIFT)
#define SPI_BAUDDIV_256 (7<<SPI_BAUDDIV_SHIFT)
void bootloader_spi_init(uint32_t spiid, uint32_t flags);
void bootloader_spi_fini(uint32_t spiid);
void bootloader_spi_transac8(uint32_t spiid, uint32_t len, uint8_t *mosi, uint8_t *miso);
#endif /* BOOTLOADER_SPI */