Skip to content

Commit 0d5214a

Browse files
Igor Anokhinstaroselskii
Igor Anokhin
authored andcommitted
python: navio: update ms5611 driver
Add SPI support
1 parent eb9dbe7 commit 0d5214a

File tree

1 file changed

+53
-13
lines changed

1 file changed

+53
-13
lines changed

Python/navio/ms5611.py

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,49 @@
2929
import time
3030

3131
from smbus import SMBus
32+
import spidev
33+
3234

3335
class MS5611:
3436

37+
class SPIBus():
38+
def __init__(self, SPI_bus_number, SPI_dev_number):
39+
self.bus = spidev.SpiDev()
40+
self.SPI_bus_number = SPI_bus_number
41+
self.SPI_dev_number = SPI_dev_number
42+
43+
def open(self):
44+
self.bus.open(self.SPI_bus_number, self.SPI_dev_number)
45+
self.bus.max_speed_hz=1000000
46+
47+
def write_register(self, reg_address, data = 0x00):
48+
self.open()
49+
tx = [reg_address, data]
50+
rx = self.bus.xfer2(tx)
51+
self.bus.close()
52+
return rx
53+
54+
def read_registers(self, reg_address, length=3):
55+
self.open()
56+
tx = [0] * (length + 1)
57+
tx[0] = reg_address
58+
rx = self.bus.xfer2(tx)
59+
self.bus.close()
60+
return rx[1:len(rx)]
61+
62+
class I2CBus():
63+
def __init__(self, I2C_bus_number, address):
64+
self.bus = SMBus(I2C_bus_number)
65+
self.address = address
66+
67+
def write_register(self, reg_address, device_address = None):
68+
device_address = self.address
69+
return self.bus.write_byte(device_address, reg_address)
70+
71+
def read_registers(self, reg_address, device_address = None):
72+
device_address = self.address
73+
return self.bus.read_i2c_block_data(device_address, reg_address)
74+
3575
__MS5611_ADDRESS_CSB_LOW = 0x76
3676
__MS5611_ADDRESS_CSB_HIGH = 0x77
3777
__MS5611_DEFAULT_ADDRESS = 0x77
@@ -60,9 +100,9 @@ class MS5611:
60100
__MS5611_RA_D2_OSR_2048 = 0x56
61101
__MS5611_RA_D2_OSR_4096 = 0x58
62102

63-
def __init__(self, I2C_bus_number = 1, address = 0x77):
64-
self.bus = SMBus(I2C_bus_number)
65-
self.address = address
103+
def __init__(self, I2C_bus_number = 1, address = 0x77, SPI_bus_number = 0, SPI_dev_number = 0, bus = "I2C"):
104+
self.bus = self.I2CBus(I2C_bus_number, address) if bus == "I2C" else \
105+
self.SPIBus(SPI_bus_number, SPI_dev_number)
66106
self.C1 = 0
67107
self.C2 = 0
68108
self.C3 = 0
@@ -78,17 +118,17 @@ def initialize(self):
78118
## The MS6511 Sensor stores 6 values in the EPROM memory that we need in order to calculate the actual temperature and pressure
79119
## These values are calculated/stored at the factory when the sensor is calibrated.
80120
## I probably could have used the read word function instead of the whole block, but I wanted to keep things consistent.
81-
C1 = self.bus.read_i2c_block_data(self.address, self.__MS5611_RA_C1) #Pressure Sensitivity
121+
C1 = self.bus.read_registers(self.__MS5611_RA_C1) #Pressure Sensitivity
82122
#time.sleep(0.05)
83-
C2 = self.bus.read_i2c_block_data(self.address, self.__MS5611_RA_C2) #Pressure Offset
123+
C2 = self.bus.read_registers(self.__MS5611_RA_C2) #Pressure Offset
84124
#time.sleep(0.05)
85-
C3 = self.bus.read_i2c_block_data(self.address, self.__MS5611_RA_C3) #Temperature coefficient of pressure sensitivity
125+
C3 = self.bus.read_registers(self.__MS5611_RA_C3) #Temperature coefficient of pressure sensitivity
86126
#time.sleep(0.05)
87-
C4 = self.bus.read_i2c_block_data(self.address, self.__MS5611_RA_C4) #Temperature coefficient of pressure offset
127+
C4 = self.bus.read_registers(self.__MS5611_RA_C4) #Temperature coefficient of pressure offset
88128
#time.sleep(0.05)
89-
C5 = self.bus.read_i2c_block_data(self.address, self.__MS5611_RA_C5) #Reference temperature
129+
C5 = self.bus.read_registers(self.__MS5611_RA_C5) #Reference temperature
90130
#time.sleep(0.05)
91-
C6 = self.bus.read_i2c_block_data(self.address, self.__MS5611_RA_C6) #Temperature coefficient of the temperature
131+
C6 = self.bus.read_registers(self.__MS5611_RA_C6) #Temperature coefficient of the temperature
92132

93133
## Again here we are converting the 2 8bit packages into a single decimal
94134
self.C1 = C1[0] * 256.0 + C1[1]
@@ -101,17 +141,17 @@ def initialize(self):
101141
self.update()
102142

103143
def refreshPressure(self, OSR = __MS5611_RA_D1_OSR_4096):
104-
self.bus.write_byte(self.address, OSR)
144+
self.bus.write_register(OSR)
105145

106146
def refreshTemperature(self, OSR = __MS5611_RA_D2_OSR_4096):
107-
self.bus.write_byte(self.address, OSR)
147+
self.bus.write_register(OSR)
108148

109149
def readPressure(self):
110-
D1 = self.bus.read_i2c_block_data(self.address, self.__MS5611_RA_ADC)
150+
D1 = self.bus.read_registers(self.__MS5611_RA_ADC)
111151
self.D1 = D1[0] * 65536 + D1[1] * 256.0 + D1[2]
112152

113153
def readTemperature(self):
114-
D2 = self.bus.read_i2c_block_data(self.address, self.__MS5611_RA_ADC)
154+
D2 = self.bus.read_registers(self.__MS5611_RA_ADC)
115155
self.D2 = D2[0] * 65536 + D2[1] * 256.0 + D2[2]
116156

117157
def calculatePressureAndTemperature(self):

0 commit comments

Comments
 (0)