1
- // Location should be embassy/examples/lpc55s69/src/bin/spi_master_test.rs
2
1
#![ no_std]
3
2
#![ no_main]
4
3
5
4
use cortex_m:: asm:: nop;
6
5
use defmt:: * ;
7
6
use embassy_executor:: Spawner ;
8
- //use embassy_nxp::pac::*;
9
7
use { defmt_rtt as _, panic_halt as _} ;
10
8
use nxp_pac:: * ;
11
9
12
10
fn init ( ) {
13
11
info ! ( "Init" ) ;
14
- // SPI 7 at FLEXCOMM 7 Setup
15
- // CLOCK ENABLING
12
+ // SPI 7 at FLEXCOMM 7 Setup (spi instance is the same as the flexcomm instance)
13
+ // Enable iocon and flexcomm
16
14
SYSCON . ahbclkctrl0 ( ) . modify ( |w| {
17
15
w. set_iocon ( true ) ;
18
16
} ) ;
19
17
SYSCON . ahbclkctrl1 ( ) . modify ( |w| {
20
18
w. set_fc ( 7 , true ) ;
21
19
} ) ;
22
20
23
- // RST FLEXCOMM 7
21
+ // Reset Flexcomm 7
24
22
SYSCON . presetctrl1 ( ) . modify ( |w| {
25
23
w. set_fc_rst ( 7 , syscon:: vals:: FcRst :: ASSERTED ) ;
26
24
} ) ;
@@ -29,14 +27,18 @@ fn init() {
29
27
} ) ;
30
28
31
29
// CLK SEL
30
+ // Select Main Clock (ENUM_0X2 is FRO 12Mhz)
32
31
SYSCON . fcclksel ( 7 ) . modify ( |w|
33
32
w. set_sel ( syscon:: vals:: FcclkselSel :: ENUM_0X2 )
34
33
) ;
34
+ // Set flexcomm to SPI
35
35
FLEXCOMM7 . pselid ( ) . modify ( |w|{
36
36
w. set_persel ( flexcomm:: vals:: Persel :: SPI ) ;
37
37
} ) ;
38
38
39
39
// IOCON Setup
40
+ // All pins are configured according to the standard settings in the SPI config documentation
41
+ // SSEL1 at func 1 iocon
40
42
IOCON . pio1 ( 20 ) . modify ( |w|{
41
43
w. set_func ( iocon:: vals:: PioFunc :: ALT1 ) ;
42
44
w. set_digimode ( iocon:: vals:: PioDigimode :: DIGITAL ) ;
@@ -45,6 +47,7 @@ fn init() {
45
47
w. set_invert ( false ) ;
46
48
w. set_od ( iocon:: vals:: PioOd :: NORMAL ) ;
47
49
} ) ;
50
+ // MOSI at func 7 iocon
48
51
IOCON . pio0 ( 20 ) . modify ( |w|{
49
52
w. set_func ( iocon:: vals:: PioFunc :: ALT7 ) ;
50
53
w. set_digimode ( iocon:: vals:: PioDigimode :: DIGITAL ) ;
@@ -53,6 +56,7 @@ fn init() {
53
56
w. set_invert ( false ) ;
54
57
w. set_od ( iocon:: vals:: PioOd :: NORMAL ) ;
55
58
} ) ;
59
+ // MISO at func 7 iocon
56
60
IOCON . pio0 ( 19 ) . modify ( |w|{
57
61
w. set_func ( iocon:: vals:: PioFunc :: ALT7 ) ;
58
62
w. set_digimode ( iocon:: vals:: PioDigimode :: DIGITAL ) ;
@@ -61,6 +65,7 @@ fn init() {
61
65
w. set_invert ( false ) ;
62
66
w. set_od ( iocon:: vals:: PioOd :: NORMAL ) ;
63
67
} ) ;
68
+ // SCKL at func 7 iocon
64
69
IOCON . pio0 ( 21 ) . modify ( |w|{
65
70
w. set_func ( iocon:: vals:: PioFunc :: ALT7 ) ;
66
71
w. set_digimode ( iocon:: vals:: PioDigimode :: DIGITAL ) ;
@@ -70,16 +75,18 @@ fn init() {
70
75
w. set_od ( iocon:: vals:: PioOd :: NORMAL ) ;
71
76
} ) ;
72
77
73
- // INTERFACE CLK Setup
78
+ // FlexcommFRG divider (div is 0xFF by default in the documentation meaning it can be divided by either 1 or 2)
74
79
SYSCON . flexfrgctrl ( 7 ) . modify ( |w|{
75
80
w. set_div ( 0xFF ) ;
76
81
w. set_mult ( 0 ) ;
77
82
} ) ;
83
+ // SPI clock divider can go from 1 to 255
78
84
SPI7 . div ( ) . modify ( |w|{
79
85
w. set_divval ( 0 ) ;
80
86
} ) ;
87
+ // Final Clock is 12 MHz
81
88
82
- //SPI MASTER CONFIG
89
+ // SPI Master config using ssel_1
83
90
SPI7 . cfg ( ) . modify ( |w|{
84
91
w. set_enable ( true ) ;
85
92
w. set_master ( spi:: vals:: Master :: MASTER_MODE ) ;
@@ -89,6 +96,7 @@ fn init() {
89
96
w. set_loop_ ( false ) ;
90
97
w. set_spol1 ( spi:: vals:: Spol1 :: LOW ) ;
91
98
} ) ;
99
+ // FIFO Config disabling DMA and enabling TX and RX
92
100
SPI7 . fifocfg ( ) . modify ( |w| {
93
101
w. set_dmatx ( false ) ;
94
102
w. set_dmarx ( false ) ;
@@ -97,17 +105,18 @@ fn init() {
97
105
//w.set_emptytx(true);
98
106
//w.set_emptyrx(true);
99
107
} ) ;
108
+ // Disabling RX is recommended in the documentation if you are not expecting to receive data
100
109
SPI7 . fifowr ( ) . write ( |w|{
101
110
w. set_rxignore ( spi:: vals:: Rxignore :: IGNORE ) ;
102
111
} ) ;
103
112
104
113
loop {
105
- SPI7 . fifowr ( ) . write ( |w|w. set_txssel1_n ( spi:: vals:: Txssel1N :: ASSERTED ) ) ;
114
+ SPI7 . fifowr ( ) . write ( |w|w. set_txssel1_n ( spi:: vals:: Txssel1N :: ASSERTED ) ) ; // Assert the SSEL you are transferring data to
106
115
for _ in 0 ..100_000 {
107
116
nop ( ) ; }
108
117
SPI7 . fifowr ( ) . write ( |w|{
109
- w. set_txdata ( 0x04 ) ;
110
- w. set_len ( 8 ) ;
118
+ w. set_txdata ( 0x04 ) ; // Data to be transfered
119
+ w. set_len ( 8 ) ; // !! IMPORTANT !! If length isn't specified data won't be shifted out
111
120
} ) ;
112
121
for _ in 0 ..100_000 {
113
122
nop ( ) ; }
@@ -116,8 +125,8 @@ fn init() {
116
125
info ! ( "Tx level: {}" , fifostat. txlvl( ) ) ;
117
126
info ! ( "Tx empty? {}" , fifostat. txempty( ) ) ;
118
127
SPI7 . fifowr ( ) . write ( |w|{
119
- w. set_eot ( true ) ;
120
- w. set_txssel1_n ( spi:: vals:: Txssel1N :: NOT_ASSERTED ) ;
128
+ w. set_eot ( true ) ; // Mark end of transfer
129
+ w. set_txssel1_n ( spi:: vals:: Txssel1N :: NOT_ASSERTED ) ; // Deassert our SSEL
121
130
} ) ;
122
131
for _ in 0 ..100_000 {
123
132
nop ( ) ; }
0 commit comments