Я настраиваю Raspberry Pi для записи данных (CO2, влажность и температура) с датчика Sensirion SCD30.Мой код написан на python3 и использует библиотеку SMBus для связи с датчиком через контакты I2C в GPIO Pi.Существует команда для определения, готов ли датчик к отправке данных.
Ссылка на таблицу данных интерфейса 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 байта, показанные выше.