30
30
#include "py/nlr.h"
31
31
#include "py/runtime.h"
32
32
#include "py/mphal.h"
33
+ #include "extmod/machine_spi.h"
33
34
#include "irq.h"
34
35
#include "pin.h"
35
36
#include "genhdr/pins.h"
@@ -400,6 +401,17 @@ STATIC void spi_transfer(mp_obj_base_t *self_in, size_t src_len, const uint8_t *
400
401
}
401
402
}
402
403
404
+ STATIC void spi_transfer_machine (mp_obj_base_t * self_in , size_t src_len , const uint8_t * src_buf , size_t dest_len , uint8_t * dest_buf ) {
405
+ if (src_len == 1 && dest_len > 1 ) {
406
+ // this catches read and readinto
407
+ // copy the single output byte to the dest buffer and use that as source
408
+ memset (dest_buf , src_buf [0 ], dest_len );
409
+ src_len = dest_len ;
410
+ src_buf = dest_buf ;
411
+ }
412
+ spi_transfer (self_in , src_len , src_buf , dest_len , dest_buf , 100 );
413
+ }
414
+
403
415
/******************************************************************************/
404
416
/* Micro Python bindings */
405
417
@@ -748,6 +760,13 @@ STATIC const mp_map_elem_t pyb_spi_locals_dict_table[] = {
748
760
// instance methods
749
761
{ MP_OBJ_NEW_QSTR (MP_QSTR_init ), (mp_obj_t )& pyb_spi_init_obj },
750
762
{ MP_OBJ_NEW_QSTR (MP_QSTR_deinit ), (mp_obj_t )& pyb_spi_deinit_obj },
763
+
764
+ { MP_OBJ_NEW_QSTR (MP_QSTR_read ), (mp_obj_t )& mp_machine_spi_read_obj },
765
+ { MP_OBJ_NEW_QSTR (MP_QSTR_readinto ), (mp_obj_t )& mp_machine_spi_readinto_obj },
766
+ { MP_OBJ_NEW_QSTR (MP_QSTR_write ), (mp_obj_t )& mp_machine_spi_write_obj },
767
+ { MP_OBJ_NEW_QSTR (MP_QSTR_write_readinto ), (mp_obj_t )& mp_machine_spi_write_readinto_obj },
768
+
769
+ // legacy methods
751
770
{ MP_OBJ_NEW_QSTR (MP_QSTR_send ), (mp_obj_t )& pyb_spi_send_obj },
752
771
{ MP_OBJ_NEW_QSTR (MP_QSTR_recv ), (mp_obj_t )& pyb_spi_recv_obj },
753
772
{ MP_OBJ_NEW_QSTR (MP_QSTR_send_recv ), (mp_obj_t )& pyb_spi_send_recv_obj },
@@ -773,10 +792,15 @@ STATIC const mp_map_elem_t pyb_spi_locals_dict_table[] = {
773
792
774
793
STATIC MP_DEFINE_CONST_DICT (pyb_spi_locals_dict , pyb_spi_locals_dict_table );
775
794
795
+ STATIC const mp_machine_spi_p_t pyb_spi_p = {
796
+ .transfer = spi_transfer_machine ,
797
+ };
798
+
776
799
const mp_obj_type_t pyb_spi_type = {
777
800
{ & mp_type_type },
778
801
.name = MP_QSTR_SPI ,
779
802
.print = pyb_spi_print ,
780
803
.make_new = pyb_spi_make_new ,
804
+ .protocol = & pyb_spi_p ,
781
805
.locals_dict = (mp_obj_t )& pyb_spi_locals_dict ,
782
806
};
0 commit comments