I2CSensor.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "I2CSensor.h"
  2. static uint8_t readReg(I2CSensor* i2c_sensor, uint8_t reg) {
  3. //Блокировка шины
  4. furi_hal_i2c_acquire(i2c_sensor->i2c);
  5. uint8_t buff[1];
  6. furi_hal_i2c_read_mem(i2c_sensor->i2c, i2c_sensor->currentI2CAdr << 1, reg, buff, 1, 0xFF);
  7. furi_hal_i2c_release(i2c_sensor->i2c);
  8. return buff[0];
  9. }
  10. static void writeReg(I2CSensor* i2c_sensor, uint8_t reg, uint8_t value) {
  11. //Блокировка шины
  12. furi_hal_i2c_acquire(i2c_sensor->i2c);
  13. uint8_t buff[1] = {value};
  14. furi_hal_i2c_write_mem(i2c_sensor->i2c, i2c_sensor->currentI2CAdr << 1, reg, buff, 1, 0xFF);
  15. furi_hal_i2c_release(i2c_sensor->i2c);
  16. }
  17. bool unitemp_I2C_sensorInit(void* sensor) {
  18. I2CSensor* i2c_sensor = (I2CSensor*)((Sensor*)sensor)->instance;
  19. //BMP280
  20. if(((Sensor*)sensor)->type == BMP280) {
  21. //Перезагрузка
  22. writeReg(i2c_sensor, 0xE0, 0xB6);
  23. //Чтение ID датчика
  24. uint8_t id = readReg(i2c_sensor, 0xD0);
  25. if(id != 0x58) {
  26. ((Sensor*)sensor)->status = UT_ERROR;
  27. return false;
  28. }
  29. //TODO: Дальнейшая инициализация
  30. ((Sensor*)sensor)->status = UT_OK;
  31. return true;
  32. }
  33. return false;
  34. }
  35. bool unitemp_I2C_sensorDeInit(void* sensor) {
  36. //TODO датчик в спячку, очистить память
  37. UNUSED(sensor);
  38. return true;
  39. }
  40. UnitempStatus unitemp_I2C_updateData(void* sensor) {
  41. if(((Sensor*)sensor)->status == UT_ERROR || ((Sensor*)sensor)->status == UT_TIMEOUT) {
  42. if(((Sensor*)sensor)->initializer(sensor) != true) return UT_ERROR;
  43. }
  44. //I2CSensor* i2c_sensor = (I2CSensor*)((Sensor*)sensor)->instance;
  45. return UT_OK;
  46. }
  47. bool unitemp_I2C_sensorAlloc(Sensor* sensor, SensorType st, uint16_t* anotherValues) {
  48. I2CSensor* instance = malloc(sizeof(I2CSensor));
  49. instance->interface = I2C;
  50. instance->i2c = &furi_hal_i2c_handle_external;
  51. instance->lastPollingTime = 0xFFFFFFFF;
  52. sensor->initializer = unitemp_I2C_sensorInit;
  53. sensor->deinitializer = unitemp_I2C_sensorDeInit;
  54. sensor->updater = unitemp_I2C_updateData;
  55. sensor->instance = instance;
  56. sensor->type = st;
  57. //Настройки для BMP280
  58. if(st == BMP280) {
  59. instance->minI2CAdr = 0x76;
  60. instance->maxI2CAdr = 0x77;
  61. }
  62. if(anotherValues[0] >= instance->minI2CAdr && anotherValues[0] <= instance->maxI2CAdr) {
  63. instance->currentI2CAdr = anotherValues[0];
  64. } else {
  65. instance->currentI2CAdr = instance->minI2CAdr;
  66. }
  67. return true;
  68. }