@@ -41,11 +41,36 @@ extern const mcu_pin_obj_t pin_MTDI;
4141void common_hal_nativeio_spi_construct (nativeio_spi_obj_t * self ,
4242 const mcu_pin_obj_t * clock , const mcu_pin_obj_t * mosi ,
4343 const mcu_pin_obj_t * miso ) {
44- if (clock != & pin_MTMS || mosi != & pin_MTCK || miso != & pin_MTDI ) {
44+ if (clock != & pin_MTMS || !((mosi == & pin_MTCK && miso == MP_OBJ_TO_PTR (mp_const_none )) ||
45+ (mosi == MP_OBJ_TO_PTR (mp_const_none ) && miso == & pin_MTDI ))) {
4546 nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_OSError ,
4647 "Pins not valid for SPI" ));
4748 }
48- spi_init (HSPI );
49+
50+ uint32_t clock_div_flag = 0 ;
51+ if (SPI_CLK_USE_DIV ) {
52+ clock_div_flag = 0x0001 ;
53+ }
54+
55+ // Set bit 9 if 80MHz sysclock required
56+ WRITE_PERI_REG (PERIPHS_IO_MUX , 0x105 | (clock_div_flag <<9 ));
57+ // GPIO12 is HSPI MISO pin (Master Data In)
58+ if (miso == & pin_MTDI ) {
59+ PIN_FUNC_SELECT (PERIPHS_IO_MUX_MTDI_U , 2 );
60+ }
61+ // GPIO13 is HSPI MOSI pin (Master Data Out)
62+ if (mosi == & pin_MTCK ) {
63+ PIN_FUNC_SELECT (PERIPHS_IO_MUX_MTCK_U , 2 );
64+ }
65+ // GPIO14 is HSPI CLK pin (Clock)
66+ PIN_FUNC_SELECT (PERIPHS_IO_MUX_MTMS_U , 2 );
67+
68+ spi_clock (HSPI , SPI_CLK_PREDIV , SPI_CLK_CNTDIV );
69+ spi_tx_byte_order (HSPI , SPI_BYTE_ORDER_HIGH_TO_LOW );
70+ spi_rx_byte_order (HSPI , SPI_BYTE_ORDER_HIGH_TO_LOW );
71+
72+ SET_PERI_REG_MASK (SPI_USER (HSPI ), SPI_CS_SETUP |SPI_CS_HOLD );
73+ CLEAR_PERI_REG_MASK (SPI_USER (HSPI ), SPI_FLASH_MODE );
4974}
5075
5176void common_hal_nativeio_spi_deinit (nativeio_spi_obj_t * self ) {
0 commit comments