Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    LOPY SPI Mikroe click module

    Scheduled Pinned Locked Moved LoPy
    lopyspisensor
    4 Posts 2 Posters 498 Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • J Offline
      johncaipa
      last edited by

      Hello, has anyone tried to read through SPI any Mikroe Click module using a Pycom board?
      I would like to use this module to read a pressure sensor, but I have not been able to decipher how to read it.
      someone could help me?, thanks.

      robert-hhR 1 Reply Last reply Reply Quote 0
      • robert-hhR Offline
        robert-hh @johncaipa
        last edited by robert-hh

        @johncaipa No, but it looks quite straightforward.
        a) enable an SPI bus. Connect Clk->Clk, MOSI->CS, MISO->SDO

        • read 2 bytes from SPI, while sending 0x00
        • shift the value you got to the proper position

        I made a driver here for the ADS7818, where MOSI is used for CS, which nicely synchronizes it with the read. Ignore the inverted part.
        https://github.com/robert-hh/ADS7818.
        Edit: On the click module, Vref is 2.048V, as it uses a MAX6106 voltage reference

        J 1 Reply Last reply Reply Quote 1
        • J Offline
          johncaipa @robert-hh
          last edited by

          @robert-hh thanks but that example did not work for me, neither MOSI-> CS, for this I used an independent pin, but based on your example and the manufacturer's examples it seems that I could do it, although I do not understand the additional byte displacement:

          from machine import Pin
          from machine import SPI
          
          #SPI  pins.
          SPI_CLK  = 'P19'
          SPI_MOSI = 'P20'
          SPI_MISO = 'P21'
          SPI_CS   = 'P23'
          
          SPI_LOW  = 0
          SPI_HIGH = 1
          
          spi_cs = Pin(SPI_CS, mode = Pin.OUT)
          spi_cs.value(SPI_HIGH)
          # configure the SPI master @ 1MHz
          # this uses the SPI non-default pins for CLK, MOSI and MISO ('P19(G6)','P20(G7)','P21(G8)')
          spi = SPI(0, mode=SPI.MASTER, baudrate=1000000, polarity=1, phase=1, bits=16, pins=(SPI_CLK, SPI_MOSI, SPI_MISO))
          
          spi_cs.value(SPI_LOW)
          buf = bytearray(2)
          conv = b'\xe0\x00'
          spi.write_readinto(conv, buf)
          spi_cs.value(SPI_HIGH)
          adc = (((buf[0] << 8) | buf[1]) & 0xfff) >>1
          mA =  adc * 102.4 / 4096.0 / 4.99 # Vref=2048 A=20 Vref/A = 102.4 ; 12bit=4096 ; Shunt R = 4R99
          print(mA)
          

          what do you think?

          robert-hhR 1 Reply Last reply Reply Quote 0
          • robert-hhR Offline
            robert-hh @johncaipa
            last edited by robert-hh

            @johncaipa said in LOPY SPI Mikroe click module:

            adc = (((buf[0] << 8) | buf[1]) & 0xfff) >>1

            That one is wrong. You have to shift the raw value befor masking.
            The lowest bit of the returned value will not be at bit0 of adc, so you have to shift to to the right. Reason: The adc starts shifting out values at the 2nd (or third?) clock cycle, and SPI will create 16 clock cycles. So there are like 14 bits in the result buffer, of which only the high order 12 bits are valid. The others have to be discarded and the value has to be properly aligned.
            If you use a separate CS pin, you can simply use spi.read_into().

            spi.read_into(buf)
            adc = ((buf[0] << 8) | buf[1]) >> x) & 0xfff
            

            x should be a value between 1 and 3. Best is to determine it experimentally.

            The conv variable and write_readinto() is only used to create the CS signal at the MOSI pin. By using an appropriate pattern for conv, like 0x8000, 0xc000, of 0xe000, you can shift the CS signal in clock steps, making the final shift of the result obsolete. So doing that save a pin and saves a few instructions.

            1 Reply Last reply Reply Quote 1

            Hello! It looks like you're interested in this conversation, but you don't have an account yet.

            Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

            With your input, this post could be even better 💗

            Register Login
            • 1 / 1
            • First post
              Last post

            Pycom on Twitter

            Pycom