SPI + MS5540C driver
-
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)toSPI.setDataMode(SPI_MODE0). I am not familiar with the SPI protocol, so I post my code looking for any insight in this matter.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]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() -
hello there,
Did you manage to solve this issue? :)
Thanks
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