@@ -81,50 +81,59 @@ STATIC mp_obj_t machine_spi_deinit(mp_obj_t self) {
8181}
8282STATIC MP_DEFINE_CONST_FUN_OBJ_1 (machine_spi_deinit_obj , machine_spi_deinit );
8383
84- STATIC void mp_machine_spi_transfer (mp_obj_t self , size_t len , const void * src , void * dest ) {
84+ STATIC void mp_machine_spi_transfer (mp_obj_t self , size_t len , const void * src , void * dest , uint8_t bits ) {
8585 mp_obj_base_t * s = (mp_obj_base_t * )MP_OBJ_TO_PTR (self );
8686 mp_machine_spi_p_t * spi_p = (mp_machine_spi_p_t * )s -> type -> protocol ;
87- spi_p -> transfer (s , len , src , dest );
87+ spi_p -> transfer (s , len , src , dest , bits );
8888}
8989
9090STATIC mp_obj_t mp_machine_spi_read (size_t n_args , const mp_obj_t * args ) {
9191 vstr_t vstr ;
9292 vstr_init_len (& vstr , mp_obj_get_int (args [1 ]));
93- memset (vstr .buf , n_args == 3 ? mp_obj_get_int (args [2 ]) : 0 , vstr .len );
94- mp_machine_spi_transfer (args [0 ], vstr .len , vstr .buf , vstr .buf );
93+ memset (vstr .buf , n_args >= 3 ? mp_obj_get_int (args [2 ]) : 0 , vstr .len );
94+ uint8_t bits = n_args == 4 ? mp_obj_get_int (args [3 ]) : 0 ;
95+ mp_machine_spi_transfer (args [0 ], vstr .len , vstr .buf , vstr .buf , bits );
9596 return mp_obj_new_str_from_vstr (& mp_type_bytes , & vstr );
9697}
97- MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mp_machine_spi_read_obj , 2 , 3 , mp_machine_spi_read );
98+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mp_machine_spi_read_obj , 2 , 4 , mp_machine_spi_read );
9899
99100STATIC mp_obj_t mp_machine_spi_readinto (size_t n_args , const mp_obj_t * args ) {
100101 mp_buffer_info_t bufinfo ;
101102 mp_get_buffer_raise (args [1 ], & bufinfo , MP_BUFFER_WRITE );
102- memset (bufinfo .buf , n_args == 3 ? mp_obj_get_int (args [2 ]) : 0 , bufinfo .len );
103- mp_machine_spi_transfer (args [0 ], bufinfo .len , bufinfo .buf , bufinfo .buf );
103+ memset (bufinfo .buf , n_args >= 3 ? mp_obj_get_int (args [2 ]) : 0 , bufinfo .len );
104+ uint8_t bits = n_args == 4 ? mp_obj_get_int (args [3 ]) : 0 ;
105+ mp_machine_spi_transfer (args [0 ], bufinfo .len , bufinfo .buf , bufinfo .buf , bits );
104106 return mp_const_none ;
105107}
106- MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mp_machine_spi_readinto_obj , 2 , 3 , mp_machine_spi_readinto );
108+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mp_machine_spi_readinto_obj , 2 , 4 , mp_machine_spi_readinto );
107109
108- STATIC mp_obj_t mp_machine_spi_write (mp_obj_t self , mp_obj_t wr_buf ) {
110+ STATIC mp_obj_t mp_machine_spi_write (size_t n_args , const mp_obj_t * args ) {
111+ mp_obj_t self = args [0 ];
112+ mp_obj_t wr_buf = args [1 ];
113+ uint8_t bits = n_args == 3 ? mp_obj_get_int (args [2 ]) : 0 ;
109114 mp_buffer_info_t src ;
110115 mp_get_buffer_raise (wr_buf , & src , MP_BUFFER_READ );
111- mp_machine_spi_transfer (self , src .len , (const uint8_t * )src .buf , NULL );
116+ mp_machine_spi_transfer (self , src .len , (const uint8_t * )src .buf , NULL , bits );
112117 return mp_const_none ;
113118}
114- MP_DEFINE_CONST_FUN_OBJ_2 (mp_machine_spi_write_obj , mp_machine_spi_write );
119+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mp_machine_spi_write_obj , 2 , 3 , mp_machine_spi_write );
115120
116- STATIC mp_obj_t mp_machine_spi_write_readinto (mp_obj_t self , mp_obj_t wr_buf , mp_obj_t rd_buf ) {
121+ STATIC mp_obj_t mp_machine_spi_write_readinto (size_t n_args , const mp_obj_t * args ) {
122+ mp_obj_t self = args [0 ];
123+ mp_obj_t wr_buf = args [1 ];
124+ mp_obj_t rd_buf = args [2 ];
125+ uint8_t bits = n_args == 4 ? mp_obj_get_int (args [3 ]) : 0 ;
117126 mp_buffer_info_t src ;
118127 mp_get_buffer_raise (wr_buf , & src , MP_BUFFER_READ );
119128 mp_buffer_info_t dest ;
120129 mp_get_buffer_raise (rd_buf , & dest , MP_BUFFER_WRITE );
121130 if (src .len != dest .len ) {
122131 mp_raise_ValueError ("buffers must be the same length" );
123132 }
124- mp_machine_spi_transfer (self , src .len , src .buf , dest .buf );
133+ mp_machine_spi_transfer (self , src .len , src .buf , dest .buf , bits );
125134 return mp_const_none ;
126135}
127- MP_DEFINE_CONST_FUN_OBJ_3 (mp_machine_spi_write_readinto_obj , mp_machine_spi_write_readinto );
136+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mp_machine_spi_write_readinto_obj , 3 , 4 , mp_machine_spi_write_readinto );
128137
129138STATIC const mp_rom_map_elem_t machine_spi_locals_dict_table [] = {
130139 { MP_ROM_QSTR (MP_QSTR_init ), MP_ROM_PTR (& machine_spi_init_obj ) },
@@ -201,8 +210,9 @@ STATIC mp_obj_t mp_machine_soft_spi_make_new(const mp_obj_type_t *type, size_t n
201210 self -> spi .delay_half = baudrate_to_delay_half (args [ARG_baudrate ].u_int );
202211 self -> spi .polarity = args [ARG_polarity ].u_int ;
203212 self -> spi .phase = args [ARG_phase ].u_int ;
204- if (args [ARG_bits ].u_int != 8 ) {
205- mp_raise_ValueError ("bits must be 8" );
213+ self -> spi .bits = args [ARG_bits ].u_int ;
214+ if (self -> spi .bits == 0 ) {
215+ mp_raise_ValueError ("bits must be > 0" );
206216 }
207217 if (args [ARG_firstbit ].u_int != MICROPY_PY_MACHINE_SPI_MSB ) {
208218 mp_raise_ValueError ("firstbit must be MSB" );
@@ -260,9 +270,9 @@ STATIC void mp_machine_soft_spi_init(mp_obj_base_t *self_in, size_t n_args, cons
260270 mp_soft_spi_ioctl (& self -> spi , MP_SPI_IOCTL_INIT );
261271}
262272
263- STATIC void mp_machine_soft_spi_transfer (mp_obj_base_t * self_in , size_t len , const uint8_t * src , uint8_t * dest ) {
273+ STATIC void mp_machine_soft_spi_transfer (mp_obj_base_t * self_in , size_t len , const uint8_t * src , uint8_t * dest , uint8_t bits ) {
264274 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 );
275+ mp_soft_spi_transfer (& self -> spi , len , src , dest , bits );
266276}
267277
268278const mp_machine_spi_p_t mp_machine_soft_spi_p = {
0 commit comments