Вот, как это делается неправильно:
if (read_register16(dev, 0x88, &dev->dig_T1)
&& read_register16(dev, 0x8a, (uint16_t *) &dev->dig_T2)
&& read_register16(dev, 0x8c, (uint16_t *) &dev->dig_T3)
&& read_register16(dev, 0x8e, &dev->dig_P1)
&& read_register16(dev, 0x90, (uint16_t *) &dev->dig_P2)
&& read_register16(dev, 0x92, (uint16_t *) &dev->dig_P3)
&& read_register16(dev, 0x94, (uint16_t *) &dev->dig_P4)
&& read_register16(dev, 0x96, (uint16_t *) &dev->dig_P5)
&& read_register16(dev, 0x98, (uint16_t *) &dev->dig_P6)
&& read_register16(dev, 0x9a, (uint16_t *) &dev->dig_P7)
&& read_register16(dev, 0x9c, (uint16_t *) &dev->dig_P8)
&& read_register16(dev, 0x9e,
(uint16_t *) &dev->dig_P9)) {
return true;
}
А вот — правильно:
if(I2C_OK != i2c_7bit_send_onebyte(BMP280_REG_CALIBA, 0)) return 0;
if(I2C_OK != i2c_7bit_receive((uint8_t*)&CaliData, BMP280_CALIBA_SIZE)) return 0;
return 1;
Вот неужели людям так нравится портянка копипасты, чреватая возможностью не тот регистр где-нибудь нарисовать (или не ту переменную) + насилующая шину I2C лишними операциями?
Journal information