Случилось мне познакомиться с датчиком LSM303AGR. Для экспериментов мы купили платку STEVAL-MKI172V1, очень удобно.
Присоединил к микроконтроллеру, соединил все это с PC и начал ковыряться. Надо сказать, документация на это дело совершенно безобразная... Что дока на микросхему, что Application Note.
В конце концов я это дело запустил, акселерометр с магнетометром прочитал, читаю температуру. А вот тут начинаются странности. Вот что написано в даташите на микросхему:
4.5 Temperature sensor
The LSM303AGR is supplied with an internal temperature sensor. Temperature data
can be enabled by setting the TEMP_EN[1:0] bits to ‘1’ in the TEMP_CFG_REG_A (1Fh)
register.
To retrieve the temperature sensor data the BDU bit in CTRL_REG4_A (23h)
must be set to ‘1’. Both the OUT_TEMP_L_A (0Ch), OUT_TEMP_H_A (0Dh)
registers must be read.
Temperature data is stored inside OUT_TEMP_H as two’s complement data in 8-bit format
left-justified.
Далее в таблице Table 4. Temperature sensor characteristics написано, что формат данных 1 digit/°C. Запускаю считывание тепмературы. Вручную, нажимая кнопку в моем тестовом приложении. Смотрю на считанные данные. И вот что я вижу (адрес регистра 0x8C - это OUT_TEMP_L_A но с добавленным старшим битом автоинкремента, чтобы можно было прочитать два байта подряд):
Код
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 FF
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 FF
--- Тут я прикоснулся пальцем к микросхеме
I2C Read: dev_address 0x19, reg_address 0x8C, data: C0 01
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 03
I2C Read: dev_address 0x19, reg_address 0x8C, data: C0 03
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 04
I2C Read: dev_address 0x19, reg_address 0x8C, data: 80 04
I2C Read: dev_address 0x19, reg_address 0x8C, data: C0 04
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 05
--- Тут я палец убрал, микросхема начала остывать
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 04
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 03
I2C Read: dev_address 0x19, reg_address 0x8C, data: 80 02
I2C Read: dev_address 0x19, reg_address 0x8C, data: 40 02
I2C Read: dev_address 0x19, reg_address 0x8C, data: C0 01
I2C Read: dev_address 0x19, reg_address 0x8C, data: 80 01
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 01
I2C Read: dev_address 0x19, reg_address 0x8C, data: 80 00
I2C Read: dev_address 0x19, reg_address 0x8C, data: 80 00
I2C Read: dev_address 0x19, reg_address 0x8C, data: C0 FF
I2C Read: dev_address 0x19, reg_address 0x8C, data: C0 FF
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 FF
--- Тут я прикоснулся пальцем к микросхеме
I2C Read: dev_address 0x19, reg_address 0x8C, data: C0 01
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 03
I2C Read: dev_address 0x19, reg_address 0x8C, data: C0 03
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 04
I2C Read: dev_address 0x19, reg_address 0x8C, data: 80 04
I2C Read: dev_address 0x19, reg_address 0x8C, data: C0 04
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 05
--- Тут я палец убрал, микросхема начала остывать
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 04
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 03
I2C Read: dev_address 0x19, reg_address 0x8C, data: 80 02
I2C Read: dev_address 0x19, reg_address 0x8C, data: 40 02
I2C Read: dev_address 0x19, reg_address 0x8C, data: C0 01
I2C Read: dev_address 0x19, reg_address 0x8C, data: 80 01
I2C Read: dev_address 0x19, reg_address 0x8C, data: 00 01
I2C Read: dev_address 0x19, reg_address 0x8C, data: 80 00
I2C Read: dev_address 0x19, reg_address 0x8C, data: 80 00
I2C Read: dev_address 0x19, reg_address 0x8C, data: C0 FF
I2C Read: dev_address 0x19, reg_address 0x8C, data: C0 FF
Вот что странно. Почему-то младший байт тоже заметно и согласованно меняется. А ведь в документации английским по белому написано: "Temperature data is stored inside OUT_TEMP_H". Так как же понимать полученные результаты? И почему, елки палки, температура держится в районе 0 градусов?! Поверьте, я работаю в помещении, температура примерно 22-23 градуса, а никак не нулевая или -1!
Друзья, помогите разобраться, пожалуйста!
Спасибо!