|
32 | 32 |
|
33 | 33 | typedef struct _microbit_spi_obj_t {
|
34 | 34 | mp_obj_base_t base;
|
| 35 | + const microbit_pin_obj_t *sclk; |
| 36 | + const microbit_pin_obj_t *mosi; |
| 37 | + const microbit_pin_obj_t *miso; |
35 | 38 | } microbit_spi_obj_t;
|
36 | 39 |
|
37 | 40 | STATIC bool microbit_spi_initialised = false;
|
@@ -71,12 +74,10 @@ STATIC mp_obj_t microbit_spi_init(mp_uint_t n_args, const mp_obj_t *pos_args, mp
|
71 | 74 | miso = microbit_obj_get_pin(args[ARG_miso].u_obj);
|
72 | 75 | }
|
73 | 76 |
|
74 |
| - // Initialise the pins. |
75 |
| - // Note: the pins are not freed, so init'ing the SPI a second time on |
76 |
| - // different pins will leave the old pins still in SPI mode. |
77 |
| - microbit_obj_pin_acquire(sclk, microbit_pin_mode_spi); |
78 |
| - microbit_obj_pin_acquire(mosi, microbit_pin_mode_spi); |
79 |
| - microbit_obj_pin_acquire(miso, microbit_pin_mode_spi); |
| 77 | + // Acquire new pins and free the previous ones. |
| 78 | + microbit_obj_pin_acquire_and_free(µbit_spi_obj.sclk, sclk, microbit_pin_mode_spi); |
| 79 | + microbit_obj_pin_acquire_and_free(µbit_spi_obj.mosi, mosi, microbit_pin_mode_spi); |
| 80 | + microbit_obj_pin_acquire_and_free(µbit_spi_obj.miso, miso, microbit_pin_mode_spi); |
80 | 81 |
|
81 | 82 | // Initialise the SPI bus.
|
82 | 83 | int ret = microbit_hal_spi_init(sclk->name, mosi->name, miso->name,
|
@@ -147,6 +148,9 @@ STATIC MP_DEFINE_CONST_OBJ_TYPE(
|
147 | 148 | locals_dict, µbit_spi_locals_dict
|
148 | 149 | );
|
149 | 150 |
|
150 |
| -const microbit_spi_obj_t microbit_spi_obj = { |
| 151 | +microbit_spi_obj_t microbit_spi_obj = { |
151 | 152 | { µbit_spi_type },
|
| 153 | + .sclk = µbit_p13_obj, |
| 154 | + .mosi = µbit_p15_obj, |
| 155 | + .miso = µbit_p14_obj, |
152 | 156 | };
|
0 commit comments