Using SPI on SyPy

  • I just can't seem to get SPI working on the SyPy. I am trying to use I2C as well but due to the conflicting pins, I have shifted the I2C pins to P8 and P9 and it works fine.

    For CS I have tried P12 and P23. Using P12 causes problems when uploading code probably because it keeps the pin high, which causes a firmware downgrade. Pins 13-18 are input only so can't be used. Pins 5-7 are SPI but connected to the Sigfox module. I don't think I can use pins 0-4 either so it doesn't leave much room for manoeuvre.

    I am using the default pins for CLK, MOSI and MISO, i.e. 10, 11 & 14.

    Is there some other connectivity that I am missing?

  • @robert-hh Unfortunately not although I have converted the code to Arduino C++ and used it on an Adafruit Feather with no problem.

  • @alidaf Strange. Dou you have a means of testing the communication, like a logic analyzer (Saleae clone?)

  • I am testing with the following code:

    from machine import Pin
    from machine import SPI
    #import binascii
    #SPI  pins.
    SPI_CS   = 'P23'
    SPI_MOSI = 'P11'
    SPI_MISO = 'P22'
    SPI_CLK  = 'P10'
    REGISTER_TEST      = 0x00
    SPI_LOW  = 0
    SPI_HIGH = 1
    spi_cs = Pin(SPI_CS, mode = Pin.OUT)
    spi = SPI(0, mode=SPI.MASTER, baudrate=1000000, pins=(SPI_CLK, SPI_MOSI, SPI_MISO))
    # Test register should return whatever value is written to it.
    for data in range(0, 0x7e):
        print("Writing 0x{:02x} to register 0x{:02x}".format(data, REGISTER_TEST))
        wbuf = bytes([REGISTER_TEST | REGISTER_WRITE_BIT, data])
        # Write data into register.
        # Read data from register.
        #spi.write(bytes([REGISTER_TEST & REGISTER_READ_MASK]))
        tbuf = bytes([REGISTER_TEST & REGISTER_READ_MASK])
        rbuf =, write=tbuf[0])
        #numRead = spi.readinto(rbuf, write=tbuf[0])
        print("Read 0x{:02x} from register 0x{:02x}".format(rbuf[0], REGISTER_TEST))

  • @robert-hh I've moved MISO to pin 21 but still no joy.

  • @alidaf Pins 10,11,14 should work. Pin 14 has no internal pull-up, so you have to supply an external one.


Pycom on Twitter