24
24
#include "fsl_dspi_hal.h"
25
25
26
26
static const PinMap PinMap_SPI_SCLK [] = {
27
-
27
+ { PTD1 , SPI_0 , 2 },
28
28
{NC , NC , 0 }
29
29
};
30
30
31
31
static const PinMap PinMap_SPI_MOSI [] = {
32
-
32
+ { PTD2 , SPI_0 , 2 },
33
33
{NC , NC , 0 }
34
34
};
35
35
36
36
static const PinMap PinMap_SPI_MISO [] = {
37
-
37
+ { PTD3 , SPI_0 , 2 },
38
38
{NC , NC , 0 }
39
39
};
40
40
41
41
static const PinMap PinMap_SPI_SSEL [] = {
42
-
42
+ { PTD0 , SPI_0 , 2 },
43
43
{NC , NC , 0 }
44
44
};
45
45
46
+ static void spi_set_delays (uint32_t instance ) {
47
+ dspi_delay_settings_config_t delay_config ;
48
+ delay_config .pcsToSck = 1 ; /*!< PCS to SCK delay (CSSCK): initialize the scalar
49
+ * value to '1' to provide the master with a little
50
+ * more data-in read setup time.
51
+ */
52
+ delay_config .pcsToSckPre = 0 ; /*!< PCS to SCK delay prescalar (PCSSCK) */
53
+ delay_config .afterSckPre = 0 ; /*!< After SCK delay prescalar (PASC)*/
54
+ delay_config .afterSck = 0 ; /*!< After SCK delay scalar (ASC)*/
55
+ delay_config .afterTransferPre = 0 ; /*!< Delay after transfer prescalar (PDT)*/
56
+ delay_config .afterTransfer = 0 ;
57
+ dspi_hal_configure_delays (instance , kDspiCtar0 , & delay_config );
58
+ }
59
+
46
60
void spi_init (spi_t * obj , PinName mosi , PinName miso , PinName sclk , PinName ssel ) {
47
61
// determine the SPI to use
48
62
uint32_t spi_mosi = pinmap_peripheral (mosi , PinMap_SPI_MOSI );
@@ -67,9 +81,11 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
67
81
} else {
68
82
spi_format (obj , 8 , 0 , 1 ); // 8 bits, mode 0, slave
69
83
}
84
+ spi_set_delays (obj -> instance );
70
85
spi_frequency (obj , 1000000 );
71
86
72
87
dspi_hal_enable (obj -> instance );
88
+ dspi_hal_start_transfer (obj -> instance );
73
89
74
90
// pin out the spi pins
75
91
pinmap_pinout (mosi , PinMap_SPI_MOSI );
@@ -104,7 +120,7 @@ void spi_format(spi_t *obj, int bits, int mode, int slave) {
104
120
void spi_frequency (spi_t * obj , int hz ) {
105
121
uint32_t busClock ;
106
122
clock_manager_get_frequency (kBusClock , & busClock );
107
- dspi_hal_set_baud (obj -> instance , kDspiCtar0 , hz , busClock );
123
+ dspi_hal_set_baud (obj -> instance , kDspiCtar0 , ( uint32_t ) hz , busClock );
108
124
}
109
125
110
126
static inline int spi_writeable (spi_t * obj ) {
@@ -120,10 +136,13 @@ int spi_master_write(spi_t *obj, int value) {
120
136
while (!spi_writeable (obj ));
121
137
dspi_command_config_t command = {0 };
122
138
command .isEndOfQueue = true;
139
+ command .isChipSelectContinuous = 0 ;
123
140
dspi_hal_write_data_master_mode (obj -> instance , & command , (uint16_t )value );
141
+ dspi_hal_clear_status_flag (obj -> instance , kDspiTxFifoFillRequest );
124
142
125
143
// wait rx buffer full
126
144
while (!spi_readable (obj ));
145
+ dspi_hal_clear_status_flag (obj -> instance , kDspiRxFifoDrainRequest );
127
146
return dspi_hal_read_data (obj -> instance ) & 0xff ;
128
147
}
129
148
0 commit comments