Я настраиваю малину Pi для записи данных (CO2, влажность и температура) с сенсора Sensirion SCD30. Мой код находится в python3, используя библиотеку SMBus для связи с датчиком через контакты I2C в Pi GPIO. Существует команда, чтобы определить, готов ли датчик к отправке данных.
Ссылка на спецификацию интерфейса SCD30
Ссылка на библиотеку SCD30 для arduino от Sparkfun
Значение 0x0202
отправляется через I2C, и возвращается 3 байта данных:
0x00 0x00 0x81 for data not ready
0x00 0x01 0xB0 for data ready
Первые два байта - это MSB и LSB значения готовности данных. Комбинированные правильно они должны быть 0x0000
и 0x0001
. Третий байт - это CRC8 первых двух байтов. Это вычисляется с помощью полинома 0x31
и инициализации 0xFF
.
Примерно в половине случаев байты отправляются в неправильном порядке. Вместо MSB LSB CRC
отправляется MSB CRC LSB
. Например, если данные готовы, они могут отправлять 0x00, 0xB0, 0x01
вместо 0x00, 0x01, 0xB0
. Я не могу понять, почему это происходит, и я обеспокоен тем, что есть некоторая коррупция или проблемы при отправке данных. Я мог бы изменить код, чтобы узнать, является ли CRC вторым байтом, но я хотел бы найти основную проблему.
Я отправляю и получаю данные I2C, используя библиотеку smbus. Это мой код для отправки команд и чтения данных:
bus = smbus.SMBus(0)
I2C_ADDRESS = 0x61
def sendCommand(self, cmd): # sends a 2 byte command (cmd)
data = [0]*2
data[0] = cmd >> 8 # splits 2 byte command into MSB and LSB
data[1] = cmd & 0xFF
bus.write_i2c_block_data(I2C_ADDRESS, data[0], data[1:])
def readRegister(self, reg, length): # sends 2 byte command (reg) and receives (length) bytes
sendCommand(reg)
data = bus.read_i2c_block_data(I2C_ADDRESS, 0, length)
return data
В приведенном выше примере я бы выполнил следующий код:
ready = readRegister(0x0202, 3) # returns a list of 3 bytes
print(ready)
и вернет список из 3 байтов, показанных выше.