Skip to content

Commit b7ded4c

Browse files
committed
esp8266: Allow for MOSI or MISO only SPI. Fixes adafruit#65
1 parent 3dda38c commit b7ded4c

1 file changed

Lines changed: 27 additions & 2 deletions

File tree

  • esp8266/common-hal/nativeio

esp8266/common-hal/nativeio/SPI.c

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,36 @@ extern const mcu_pin_obj_t pin_MTDI;
4141
void 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

5176
void common_hal_nativeio_spi_deinit(nativeio_spi_obj_t *self) {

0 commit comments

Comments
 (0)