64
64
#ifndef MICROPY_HW_SPI2_SCK
65
65
#if CONFIG_IDF_TARGET_ESP32
66
66
// ESP32 has IO_MUX pins for VSPI/SPI3 lines, use them as defaults
67
- #define MICROPY_HW_SPI2_SCK VSPI_IOMUX_PIN_NUM_CLK // pin 18
68
- #define MICROPY_HW_SPI2_MOSI VSPI_IOMUX_PIN_NUM_MOSI // pin 23
69
- #define MICROPY_HW_SPI2_MISO VSPI_IOMUX_PIN_NUM_MISO // pin 19
67
+ #define MICROPY_HW_SPI2_SCK SPI3_IOMUX_PIN_NUM_CLK // pin 18
68
+ #define MICROPY_HW_SPI2_MOSI SPI3_IOMUX_PIN_NUM_MOSI // pin 23
69
+ #define MICROPY_HW_SPI2_MISO SPI3_IOMUX_PIN_NUM_MISO // pin 19
70
70
#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
71
71
// ESP32S2 and S3 uses GPIO matrix for SPI3 pins, no IO_MUX possible
72
72
// Set defaults to the pins used by SPI2 in Octal mode
79
79
#define MP_HW_SPI_MAX_XFER_BYTES (4092)
80
80
#define MP_HW_SPI_MAX_XFER_BITS (MP_HW_SPI_MAX_XFER_BYTES * 8) // Has to be an even multiple of 8
81
81
82
- #if CONFIG_IDF_TARGET_ESP32C3
83
- #define HSPI_HOST SPI2_HOST
84
- #elif CONFIG_IDF_TARGET_ESP32S3
85
- #define HSPI_HOST SPI3_HOST
86
- #define FSPI_HOST SPI2_HOST
87
- #endif
88
-
89
82
typedef struct _machine_hw_spi_default_pins_t {
90
83
int8_t sck ;
91
84
int8_t mosi ;
@@ -112,15 +105,15 @@ typedef struct _machine_hw_spi_obj_t {
112
105
} machine_hw_spi_obj_t ;
113
106
114
107
// Default pin mappings for the hardware SPI instances
115
- STATIC const machine_hw_spi_default_pins_t machine_hw_spi_default_pins [2 ] = {
108
+ STATIC const machine_hw_spi_default_pins_t machine_hw_spi_default_pins [MICROPY_HW_SPI_MAX ] = {
116
109
{ .sck = MICROPY_HW_SPI1_SCK , .mosi = MICROPY_HW_SPI1_MOSI , .miso = MICROPY_HW_SPI1_MISO },
117
110
#ifdef MICROPY_HW_SPI2_SCK
118
111
{ .sck = MICROPY_HW_SPI2_SCK , .mosi = MICROPY_HW_SPI2_MOSI , .miso = MICROPY_HW_SPI2_MISO },
119
112
#endif
120
113
};
121
114
122
- // Static objects mapping to HSPI and VSPI hardware peripherals
123
- STATIC machine_hw_spi_obj_t machine_hw_spi_obj [2 ];
115
+ // Static objects mapping to SPI2 ( and SPI3 if available) hardware peripherals.
116
+ STATIC machine_hw_spi_obj_t machine_hw_spi_obj [MICROPY_HW_SPI_MAX ];
124
117
125
118
STATIC void machine_hw_spi_deinit_internal (machine_hw_spi_obj_t * self ) {
126
119
switch (spi_bus_remove_device (self -> spi )) {
@@ -129,18 +122,28 @@ STATIC void machine_hw_spi_deinit_internal(machine_hw_spi_obj_t *self) {
129
122
return ;
130
123
131
124
case ESP_ERR_INVALID_STATE :
132
- mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("SPI device already freed" ));
133
- return ;
125
+ // NOTE:
126
+ // core2和cores3的屏幕和sd卡复用一个spi,
127
+ // 所以这里不需要对VSPI_HOST和SPI3_HOST进行初始化。
128
+ if (self -> host != SPI2_HOST ) {
129
+ mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("SPI device already freed" ));
130
+ return ;
131
+ }
134
132
}
135
133
136
- switch (spi_bus_free (self -> host )) {
137
- case ESP_ERR_INVALID_ARG :
138
- mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("invalid configuration" ));
139
- return ;
140
-
141
- case ESP_ERR_INVALID_STATE :
142
- mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("SPI bus already freed" ));
143
- return ;
134
+ // NOTE:
135
+ // core2和cores3的屏幕和sd卡复用一个spi,
136
+ // 所以这里不需要对VSPI_HOST和SPI3_HOST进行初始化。
137
+ if (self -> host != SPI2_HOST ) {
138
+ switch (spi_bus_free (self -> host )) {
139
+ case ESP_ERR_INVALID_ARG :
140
+ mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("invalid configuration" ));
141
+ return ;
142
+
143
+ case ESP_ERR_INVALID_STATE :
144
+ mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("SPI bus already freed" ));
145
+ return ;
146
+ }
144
147
}
145
148
146
149
int8_t pins [3 ] = {self -> miso , self -> mosi , self -> sck };
@@ -223,17 +226,6 @@ STATIC void machine_hw_spi_init_internal(
223
226
changed = true;
224
227
}
225
228
226
- if (self -> host != HSPI_HOST
227
- #ifdef FSPI_HOST
228
- && self -> host != FSPI_HOST
229
- #endif
230
- #ifdef VSPI_HOST
231
- && self -> host != VSPI_HOST
232
- #endif
233
- ) {
234
- mp_raise_msg_varg (& mp_type_ValueError , MP_ERROR_TEXT ("SPI(%d) doesn't exist" ), self -> host );
235
- }
236
-
237
229
if (changed ) {
238
230
if (self -> state == MACHINE_HW_SPI_STATE_INIT ) {
239
231
self -> state = MACHINE_HW_SPI_STATE_DEINIT ;
@@ -267,7 +259,7 @@ STATIC void machine_hw_spi_init_internal(
267
259
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3
268
260
dma_chan = SPI_DMA_CH_AUTO ;
269
261
#else
270
- if (self -> host == HSPI_HOST ) {
262
+ if (self -> host == SPI2_HOST ) {
271
263
dma_chan = 1 ;
272
264
} else {
273
265
dma_chan = 2 ;
@@ -281,10 +273,13 @@ STATIC void machine_hw_spi_init_internal(
281
273
return ;
282
274
283
275
case ESP_ERR_INVALID_STATE :
284
- if (self -> host != HSPI_HOST ) {
276
+ // NOTE:
277
+ // core2和cores3的屏幕和sd卡复用一个spi,
278
+ // 所以这里不需要对VSPI_HOST和SPI3_HOST进行初始化。
279
+ if (self -> host != SPI2_HOST ) {
285
280
mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("SPI host already in use" ));
281
+ return ;
286
282
}
287
- return ;
288
283
}
289
284
290
285
ret = spi_bus_add_device (self -> host , & devcfg , & self -> spi );
@@ -482,13 +477,14 @@ mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_
482
477
483
478
machine_hw_spi_obj_t * self ;
484
479
const machine_hw_spi_default_pins_t * default_pins ;
485
- if (args [ARG_id ].u_int == 1 ) { // SPI2_HOST which is FSPI_HOST on ESP32Sx, HSPI_HOST on others
486
- self = & machine_hw_spi_obj [0 ];
487
- default_pins = & machine_hw_spi_default_pins [0 ];
480
+ mp_int_t spi_id = args [ARG_id ].u_int ;
481
+ if (1 <= spi_id && spi_id <= MICROPY_HW_SPI_MAX ) {
482
+ self = & machine_hw_spi_obj [spi_id - 1 ];
483
+ default_pins = & machine_hw_spi_default_pins [spi_id - 1 ];
488
484
} else {
489
- self = & machine_hw_spi_obj [1 ];
490
- default_pins = & machine_hw_spi_default_pins [1 ];
485
+ mp_raise_msg_varg (& mp_type_ValueError , MP_ERROR_TEXT ("SPI(%d) doesn't exist" ), spi_id );
491
486
}
487
+
492
488
self -> base .type = & machine_spi_type ;
493
489
494
490
int8_t sck , mosi , miso ;
0 commit comments