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

    SPI + MS5540C driver

    Scheduled Pinned Locked Moved Discussion
    spisensorms5540c
    2 Posts 2 Posters 351 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.
    • B Offline
      BorbonJuggler
      last edited by

      Hello everyone,

      I am trying to write the driver for the MS5540C Miniature Barometer Module using SPI interface, I based my code in an existing arduino sketch. Nevertheless, I haven't managed to read from the sensor, which worked on the Arduino Uno without problem. I think the problem is in the phase and polarity value that have to be change during the reading sequence, in the Arduino SPI they just change SPI.setDataMode(SPI_MODE1) to SPI.setDataMode(SPI_MODE0) . I am not familiar with the SPI protocol, so I post my code looking for any insight in this matter.

      MS5540C.py:

      import ustruct
      import time
      from machine import SPI, PWM
      
      # SPI default pins for SCLK (CLK) , DIN(MOSI) and DOUT(MISO) (``P10``, ``P11`` and ``P14``)
      
      # MCLK signal with a frequency of 32.768KHz on P12
      pwm = PWM( 0, frequency=32768 )
      # 0 create pwm channel on pin P12 with a duty cycle of 50%
      pwm_c = pwm.channel ( 0, pin='P12', duty_cycle=0.5 )
      
      _RESET_SEQUENCE = bytearray ( [0x15, 0x55, 0x40] )
      _ADDRESS_WORD1 = bytearray ( [0x1D, 0x50] )
      _ADDRESS_WORD2 = bytearray ( [0x1D, 0x60] )
      _ADDRESS_WORD3 = bytearray ( [0x1D, 0x90] )
      _ADDRESS_WORD4 = bytearray ( [0x1D, 0xA0] )
      
      class MS5540C:
      
          def __init__( self ):
      
              #Calibration Word 1
              self.w1 = self.__read__calibration__word__( _ADDRESS_WORD1 )
              #Calibration Word 2
              self.w2 = self.__read__calibration__word__( _ADDRESS_WORD2 )
              #Calibration Word 3
              self.w3 = self.__read__calibration__word__( _ADDRESS_WORD3 )
              #Calibration Word 4
              self.w4 = self.__read__calibration__word__( _ADDRESS_WORD4 )
      
          def reset_sensor( self ):
              self.spi = SPI( 0, mode=SPI.MASTER, baudrate=500000, polarity=0, phase=0ze, firstbit=SPI.MSB )
              e = self.spi.write( _RESET_SEQUENCE ) # sent the byteds for _reset_sensor_
              if e != 3:
                  print('Error en Reset \n')
      
          def __read__calibration__word__ ( self, adress ):
              self.reset_sensor() # phase = 0
              # Calibration word request
              e = self.spi.write( adress ) #  Get Calibration word
              if e != 2:
                  print('Error en request Word \n')
              # Reading Calibration
              self.spi = SPI( 0, mode=SPI.MASTER, baudrate=500000, polarity=0, phase=1, firstbit=SPI.MSB )
              rbuf= self.spi.read(2)
              return  (rbuf[0] << 8) | rbuf[1]
      

      main.py:

      import time                   # Allows use of time.sleep() for delays
      import pycom                  # Base library for Pycom devices
      import ubinascii              # Needed to run any MicroPython code
      import machine                # Interfaces with hardware components
      import utime                  # Unix timestamp
      import micropython            # Needed to run any MicroPython code
      from machine import  Pin, Timer
      from MS5540C import MS5540C
      
      
      
      # Setup
      # Level sensor
      level_sensor = MS5540C()
      
      # FUNCTIONS
      
      # MAIN
      def main():
      
          while True:
              print( "Word 1 is {}".format( level_sensor.w1 ) )
              print( "Word 2 is {}".format( level_sensor.w2 ) )
              print( "Word 3 is {}".format( level_sensor.w3 ) )
              print( "Word 4 is {}".format( level_sensor.w4 ) )
      main()
      
      
      1 Reply Last reply Reply Quote 0
      • T Offline
        tttadam
        last edited by

        hello there,

        Did you manage to solve this issue? :)
        Thanks

        1 Reply Last reply Reply Quote 0

        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