3838#define MICROPY_PY_MACHINE_SPI_LSB (1)
3939#endif
4040
41- void mp_machine_soft_spi_transfer (mp_obj_base_t * self_in , size_t len , const uint8_t * src , uint8_t * dest ) {
42- mp_machine_soft_spi_obj_t * self = (mp_machine_soft_spi_obj_t * )self_in ;
43- uint32_t delay_half = self -> delay_half ;
44-
45- // only MSB transfer is implemented
46-
47- // If a port defines MICROPY_PY_MACHINE_SPI_MIN_DELAY, and the configured
48- // delay_half is equal to this value, then the software SPI implementation
49- // will run as fast as possible, limited only by CPU speed and GPIO time.
50- #ifdef MICROPY_PY_MACHINE_SPI_MIN_DELAY
51- if (delay_half == MICROPY_PY_MACHINE_SPI_MIN_DELAY ) {
52- for (size_t i = 0 ; i < len ; ++ i ) {
53- uint8_t data_out = src [i ];
54- uint8_t data_in = 0 ;
55- for (int j = 0 ; j < 8 ; ++ j , data_out <<= 1 ) {
56- mp_hal_pin_write (self -> mosi , (data_out >> 7 ) & 1 );
57- mp_hal_pin_write (self -> sck , 1 - self -> polarity );
58- data_in = (data_in << 1 ) | mp_hal_pin_read (self -> miso );
59- mp_hal_pin_write (self -> sck , self -> polarity );
60- }
61- if (dest != NULL ) {
62- dest [i ] = data_in ;
63- }
64- }
65- return ;
66- }
67- #endif
68-
69- for (size_t i = 0 ; i < len ; ++ i ) {
70- uint8_t data_out = src [i ];
71- uint8_t data_in = 0 ;
72- for (int j = 0 ; j < 8 ; ++ j , data_out <<= 1 ) {
73- mp_hal_pin_write (self -> mosi , (data_out >> 7 ) & 1 );
74- if (self -> phase == 0 ) {
75- mp_hal_delay_us_fast (delay_half );
76- mp_hal_pin_write (self -> sck , 1 - self -> polarity );
77- } else {
78- mp_hal_pin_write (self -> sck , 1 - self -> polarity );
79- mp_hal_delay_us_fast (delay_half );
80- }
81- data_in = (data_in << 1 ) | mp_hal_pin_read (self -> miso );
82- if (self -> phase == 0 ) {
83- mp_hal_delay_us_fast (delay_half );
84- mp_hal_pin_write (self -> sck , self -> polarity );
85- } else {
86- mp_hal_pin_write (self -> sck , self -> polarity );
87- mp_hal_delay_us_fast (delay_half );
88- }
89- }
90- if (dest != NULL ) {
91- dest [i ] = data_in ;
92- }
93- }
94- }
95-
9641/******************************************************************************/
9742// MicroPython bindings for generic machine.SPI
9843
@@ -199,9 +144,9 @@ MP_DEFINE_CONST_DICT(mp_machine_spi_locals_dict, machine_spi_locals_dict_table);
199144// Implementation of soft SPI
200145
201146STATIC uint32_t baudrate_from_delay_half (uint32_t delay_half ) {
202- #ifdef MICROPY_PY_MACHINE_SPI_MIN_DELAY
203- if (delay_half == MICROPY_PY_MACHINE_SPI_MIN_DELAY ) {
204- return MICROPY_PY_MACHINE_SPI_MAX_BAUDRATE ;
147+ #ifdef MICROPY_HW_SOFTSPI_MIN_DELAY
148+ if (delay_half == MICROPY_HW_SOFTSPI_MIN_DELAY ) {
149+ return MICROPY_HW_SOFTSPI_MAX_BAUDRATE ;
205150 } else
206151 #endif
207152 {
@@ -210,9 +155,9 @@ STATIC uint32_t baudrate_from_delay_half(uint32_t delay_half) {
210155}
211156
212157STATIC uint32_t baudrate_to_delay_half (uint32_t baudrate ) {
213- #ifdef MICROPY_PY_MACHINE_SPI_MIN_DELAY
214- if (baudrate >= MICROPY_PY_MACHINE_SPI_MAX_BAUDRATE ) {
215- return MICROPY_PY_MACHINE_SPI_MIN_DELAY ;
158+ #ifdef MICROPY_HW_SOFTSPI_MIN_DELAY
159+ if (baudrate >= MICROPY_HW_SOFTSPI_MAX_BAUDRATE ) {
160+ return MICROPY_HW_SOFTSPI_MIN_DELAY ;
216161 } else
217162 #endif
218163 {
@@ -229,8 +174,8 @@ STATIC void mp_machine_soft_spi_print(const mp_print_t *print, mp_obj_t self_in,
229174 mp_machine_soft_spi_obj_t * self = MP_OBJ_TO_PTR (self_in );
230175 mp_printf (print , "SoftSPI(baudrate=%u, polarity=%u, phase=%u,"
231176 " sck=" MP_HAL_PIN_FMT ", mosi=" MP_HAL_PIN_FMT ", miso=" MP_HAL_PIN_FMT ")" ,
232- baudrate_from_delay_half (self -> delay_half ), self -> polarity , self -> phase ,
233- mp_hal_pin_name (self -> sck ), mp_hal_pin_name (self -> mosi ), mp_hal_pin_name (self -> miso ));
177+ baudrate_from_delay_half (self -> spi . delay_half ), self -> spi . polarity , self -> spi . phase ,
178+ mp_hal_pin_name (self -> spi . sck ), mp_hal_pin_name (self -> spi . mosi ), mp_hal_pin_name (self -> spi . miso ));
234179}
235180
236181STATIC mp_obj_t mp_machine_soft_spi_make_new (const mp_obj_type_t * type , size_t n_args , size_t n_kw , const mp_obj_t * all_args ) {
@@ -253,9 +198,9 @@ STATIC mp_obj_t mp_machine_soft_spi_make_new(const mp_obj_type_t *type, size_t n
253198 self -> base .type = & mp_machine_soft_spi_type ;
254199
255200 // set parameters
256- self -> delay_half = baudrate_to_delay_half (args [ARG_baudrate ].u_int );
257- self -> polarity = args [ARG_polarity ].u_int ;
258- self -> phase = args [ARG_phase ].u_int ;
201+ self -> spi . delay_half = baudrate_to_delay_half (args [ARG_baudrate ].u_int );
202+ self -> spi . polarity = args [ARG_polarity ].u_int ;
203+ self -> spi . phase = args [ARG_phase ].u_int ;
259204 if (args [ARG_bits ].u_int != 8 ) {
260205 mp_raise_ValueError ("bits must be 8" );
261206 }
@@ -267,15 +212,12 @@ STATIC mp_obj_t mp_machine_soft_spi_make_new(const mp_obj_type_t *type, size_t n
267212 || args [ARG_miso ].u_obj == MP_OBJ_NULL ) {
268213 mp_raise_ValueError ("must specify all of sck/mosi/miso" );
269214 }
270- self -> sck = mp_hal_get_pin_obj (args [ARG_sck ].u_obj );
271- self -> mosi = mp_hal_get_pin_obj (args [ARG_mosi ].u_obj );
272- self -> miso = mp_hal_get_pin_obj (args [ARG_miso ].u_obj );
215+ self -> spi . sck = mp_hal_get_pin_obj (args [ARG_sck ].u_obj );
216+ self -> spi . mosi = mp_hal_get_pin_obj (args [ARG_mosi ].u_obj );
217+ self -> spi . miso = mp_hal_get_pin_obj (args [ARG_miso ].u_obj );
273218
274- // configure pins
275- mp_hal_pin_write (self -> sck , self -> polarity );
276- mp_hal_pin_output (self -> sck );
277- mp_hal_pin_output (self -> mosi );
278- mp_hal_pin_input (self -> miso );
219+ // configure bus
220+ mp_soft_spi_ioctl (& self -> spi , MP_SPI_IOCTL_INIT );
279221
280222 return MP_OBJ_FROM_PTR (self );
281223}
@@ -296,29 +238,31 @@ STATIC void mp_machine_soft_spi_init(mp_obj_base_t *self_in, size_t n_args, cons
296238 mp_arg_parse_all (n_args , pos_args , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
297239
298240 if (args [ARG_baudrate ].u_int != -1 ) {
299- self -> delay_half = baudrate_to_delay_half (args [ARG_baudrate ].u_int );
241+ self -> spi . delay_half = baudrate_to_delay_half (args [ARG_baudrate ].u_int );
300242 }
301243 if (args [ARG_polarity ].u_int != -1 ) {
302- self -> polarity = args [ARG_polarity ].u_int ;
244+ self -> spi . polarity = args [ARG_polarity ].u_int ;
303245 }
304246 if (args [ARG_phase ].u_int != -1 ) {
305- self -> phase = args [ARG_phase ].u_int ;
247+ self -> spi . phase = args [ARG_phase ].u_int ;
306248 }
307249 if (args [ARG_sck ].u_obj != MP_OBJ_NULL ) {
308- self -> sck = mp_hal_get_pin_obj (args [ARG_sck ].u_obj );
250+ self -> spi . sck = mp_hal_get_pin_obj (args [ARG_sck ].u_obj );
309251 }
310252 if (args [ARG_mosi ].u_obj != MP_OBJ_NULL ) {
311- self -> mosi = mp_hal_get_pin_obj (args [ARG_mosi ].u_obj );
253+ self -> spi . mosi = mp_hal_get_pin_obj (args [ARG_mosi ].u_obj );
312254 }
313255 if (args [ARG_miso ].u_obj != MP_OBJ_NULL ) {
314- self -> miso = mp_hal_get_pin_obj (args [ARG_miso ].u_obj );
256+ self -> spi . miso = mp_hal_get_pin_obj (args [ARG_miso ].u_obj );
315257 }
316258
317- // configure pins
318- mp_hal_pin_write (self -> sck , self -> polarity );
319- mp_hal_pin_output (self -> sck );
320- mp_hal_pin_output (self -> mosi );
321- mp_hal_pin_input (self -> miso );
259+ // configure bus
260+ mp_soft_spi_ioctl (& self -> spi , MP_SPI_IOCTL_INIT );
261+ }
262+
263+ STATIC void mp_machine_soft_spi_transfer (mp_obj_base_t * self_in , size_t len , const uint8_t * src , uint8_t * dest ) {
264+ mp_machine_soft_spi_obj_t * self = (mp_machine_soft_spi_obj_t * )self_in ;
265+ mp_soft_spi_transfer (& self -> spi , len , src , dest );
322266}
323267
324268const mp_machine_spi_p_t mp_machine_soft_spi_p = {
0 commit comments