@@ -128,7 +128,7 @@ typedef struct _machine_hw_spi_obj_t {
128
128
uint32_t buffer_size ;
129
129
uint32_t slave_ro_size ;
130
130
bool slave_buffer_allocated ;
131
- uint32_t * slave_cb ; // slave callback function
131
+ mp_obj_t slave_cb ; // slave callback function
132
132
ws2812b_buffer_t ws2812_buffer ;
133
133
uint16_t ws2812_lo ;
134
134
uint16_t ws2812_hi ;
@@ -232,7 +232,7 @@ STATIC void machine_hw_spi_print(const mp_print_t *print, mp_obj_t self_in, mp_p
232
232
mp_printf (print , "\r\n (pin value of -1 means the pin is not used)" );
233
233
234
234
if (self -> spi_num == SPI_SLAVE ) mp_printf (print , "\r\n buffer_size=%u (%u read_only), callback: %s" ,
235
- self -> buffer_size , self -> slave_ro_size , (self -> slave_cb == NULL ) ? "False" : "True" );
235
+ self -> buffer_size , self -> slave_ro_size , (self -> slave_cb == mp_const_none ) ? "False" : "True" );
236
236
237
237
if ((self -> spi_num == SPI_MASTER_WS2812_0 ) || (self -> spi_num == SPI_MASTER_WS2812_1 )) {
238
238
mp_printf (print , "\r\n ws2812: pixels=%u, buffer size=%u (needs=%u)" , self -> ws2812_buffer .num_pix , self -> buffer_size , self -> ws_needed_buf_size );
@@ -485,7 +485,12 @@ static void spi_slave_task(void *pvParameters)
485
485
vTaskDelete (NULL );
486
486
}
487
487
}
488
+ TaskHandle_t task_handle = (TaskHandle_t )pvParameters ;
488
489
spi_slave_command_t slv_cmd = {0 };
490
+ // if the task uses some MicroPython functions, we have to save
491
+ // MicroPython state in local storage pointers
492
+ vTaskSetThreadLocalStoragePointer (NULL , THREAD_LSP_STATE , pvTaskGetThreadLocalStoragePointer (task_handle , THREAD_LSP_STATE ));
493
+ vTaskSetThreadLocalStoragePointer (NULL , THREAD_LSP_ARGS , pvTaskGetThreadLocalStoragePointer (task_handle , THREAD_LSP_ARGS ));
489
494
490
495
while (1 ) {
491
496
// Check notification
@@ -520,7 +525,7 @@ static void spi_slave_task(void *pvParameters)
520
525
}
521
526
}
522
527
if (slave_obj -> state == MACHINE_HW_SPI_STATE_INIT ) {
523
- if ((slave_obj ) && (slave_obj -> slave_cb )) {
528
+ if ((slave_obj ) && (slave_obj -> slave_cb != mp_const_none )) {
524
529
// schedule callback function
525
530
mp_obj_t tuple [4 ];
526
531
tuple [0 ] = mp_obj_new_int (slv_cmd .cmd );
@@ -561,10 +566,10 @@ mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_
561
566
{ MP_QSTR_polarity , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = false} },
562
567
{ MP_QSTR_phase , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = false} },
563
568
{ MP_QSTR_firstbit , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = MICROPY_PY_MACHINE_SPI_MSB } },
564
- { MP_QSTR_sck , MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT , {.u_int = -1 } },
569
+ { MP_QSTR_sck , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
565
570
{ MP_QSTR_mosi , MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT , {.u_int = -1 } },
566
571
{ MP_QSTR_miso , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
567
- { MP_QSTR_cs , MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT , {.u_int = -1 } },
572
+ { MP_QSTR_cs , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 } },
568
573
{ MP_QSTR_duplex , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = true} },
569
574
{ MP_QSTR_bits , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 8 } },
570
575
{ MP_QSTR_slave_buffer , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = mp_const_none } },
@@ -618,11 +623,13 @@ mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_
618
623
bool flag = true;
619
624
if ((args [ARG_mosi ].u_int < 0 ) || (args [ARG_mosi ].u_int >= FPIOA_NUM_IO )) flag = false;
620
625
else if (self -> spi_num == SPI_SLAVE ) {
626
+ // in SLAVE mode cs, sck & mosi are required
621
627
if ((args [ARG_sck ].u_int < 0 ) || (args [ARG_sck ].u_int >= FPIOA_NUM_IO )) flag = false;
622
628
else if ((args [ARG_cs ].u_int < 0 ) || (args [ARG_cs ].u_int >= FPIOA_NUM_IO )) flag = false;
623
629
else if ((args [ARG_miso ].u_int < -1 ) || (args [ARG_miso ].u_int >= FPIOA_NUM_IO )) flag = false;
624
630
}
625
631
else if (self -> spi_num <= SPI_MASTER_1 ) {
632
+ // in MASTER mode sck & mosi are required
626
633
if ((args [ARG_sck ].u_int < 0 ) || (args [ARG_sck ].u_int >= FPIOA_NUM_IO )) flag = false;
627
634
else if ((args [ARG_cs ].u_int < -1 ) || (args [ARG_cs ].u_int >= FPIOA_NUM_IO )) flag = false;
628
635
else if ((args [ARG_miso ].u_int < -1 ) || (args [ARG_miso ].u_int >= FPIOA_NUM_IO )) flag = false;
@@ -679,7 +686,7 @@ mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_
679
686
self -> sck = args [ARG_sck ].u_int ;
680
687
self -> cs = args [ARG_cs ].u_int ;
681
688
self -> slave_buffer = NULL ;
682
- self -> slave_cb = NULL ;
689
+ self -> slave_cb = mp_const_none ;
683
690
if (args [ARG_rolen ].u_int < 0 ) self -> slave_ro_size = 0 ;
684
691
else self -> slave_ro_size = args [ARG_rolen ].u_int ;
685
692
@@ -727,12 +734,12 @@ mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_
727
734
else {
728
735
// SPI Slave
729
736
BaseType_t res = xTaskCreate (
730
- spi_slave_task , // function entry
731
- "spi_slave_task" , // task name
732
- configMINIMAL_STACK_SIZE , // stack_deepth
733
- NULL , // function argument
734
- MICROPY_TASK_PRIORITY + 1 , // task priority
735
- & slave_task ); // task handle
737
+ spi_slave_task , // function entry
738
+ "spi_slave_task" , // task name
739
+ configMINIMAL_STACK_SIZE , // stack_deepth
740
+ ( void * ) xTaskGetCurrentTaskHandle (), // function argument
741
+ MICROPY_TASK_PRIORITY + 1 , // task priority
742
+ & slave_task ); // task handle
736
743
if (res != pdPASS ) slave_task = NULL ;
737
744
vTaskDelay (2 );
738
745
if (slave_task == NULL ) {
@@ -759,14 +766,15 @@ mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_
759
766
self -> slave_buffer_allocated = true;
760
767
}
761
768
else {
769
+ // MPy buffer object is provided
762
770
mp_buffer_info_t bufinfo ;
763
771
mp_get_buffer_raise (args [ARG_buffer ].u_obj , & bufinfo , MP_BUFFER_RW );
764
772
if (bufinfo .len < SLAVE_BUFFER_MIN_SIZE ) {
765
773
io_close (self -> handle );
766
774
spi_hard_deinit (self );
767
775
mp_raise_ValueError ("SPI slave buffer size out of range" );
768
776
}
769
- self -> buffer_size = bufinfo .len - 8 ;
777
+ self -> buffer_size = (( bufinfo .len * 8 ) / 8 ) - 8 ;
770
778
self -> slave_buffer = (uint8_t * )bufinfo .buf ;
771
779
self -> slave_buffer_allocated = false;
772
780
}
@@ -1160,8 +1168,7 @@ STATIC mp_obj_t mp_machine_spi_slave_callback(mp_obj_t self_in, mp_obj_t func)
1160
1168
nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "Function argument required" ));
1161
1169
}
1162
1170
1163
- if (func == mp_const_none ) self -> slave_cb = NULL ;
1164
- else self -> slave_cb = func ;
1171
+ self -> slave_cb = func ;
1165
1172
1166
1173
return mp_const_none ;
1167
1174
}
0 commit comments