BMP280 sensor (i2c) yc biblioteca

0

Estoy escribiendo un software (para ATMega32) que lee la presión del sensor Bosch BMP280. Estoy usando bus I2C. He encontrado esta biblioteca: enlace

y tengo una pregunta sobre la inicialización de I2C:

int8_t rslt;
struct bmp280_dev bmp;
/* Sensor interface over I2C with primary slave address  */
bmp.dev_id = BMP280_I2C_ADDR_PRIM;
bmp.intf = BMP280_I2C_INTF;
bmp.read = user_i2c_read;
bmp.write = user_i2c_write;
bmp.delay_ms = user_delay_ms;

¿Qué función debo usar como user_i2c_read / user_i2c_write y user_delay_ms?

    
pregunta Krzysiek

1 respuesta

1

La estructura bmp280_dev se define en bmp280_defs.h Los miembros reales son

bmp280_com_fptr_t read;
bmp280_com_fptr_t write;
bmp280_delay_fptr_t delay_ms;

Si busca más en ese archivo la palabra clave

  

bmp280_com_fptr_t

encontrarás esta declaración

typedef int8_t (*bmp280_com_fptr_t)(uint8_t dev_id, uint8_t reg_addr,
    uint8_t *data, uint16_t len);

que permite que las funciones que solicitas sean punteros a función. Aquí hay un buen tutorial sobre punteros de función. Programas como datos: punteros de función

además, es esencial crear estas funciones y punteros de función, e inicializar un valor de retorno predeterminado de rslt=BMP280_OK. Aquí hay un ejemplo corto de mi propio código. Tienes que implantar rutinas para obtener un correcto control de errores-

int8_t user_i2c_read(uint8_t dev_id, uint8_t reg_addr, 
uint8_t*reg_data, uint16_t len) 
{
  printf("\nuser_i2c_read\n"); //just to see that the function executes
  int8_t rslt = BMP280_OK;
   // implent more code here, to a start you can print out the
   // variables.and check that they are are 'set'
   if (rslt != BMP280_OK)
   {
      rslt = BMP280_E_COMM_FAIL; 
   }
   return rslt;
}

Al igual que para user_i2c_write    y

void user_delay_ms(uint32_t ms){ usleep(ms); }

Las funciones de Thoose se llaman desde bmp280.c. También - cuando eres de ejecución principal

rslt = bmp280_init(&bmp);

Sin crear esas funciones, el bmp280_init nunca le dará los valores de retorno correctos.

También vale la pena mencionar que no es necesario nombrar las funciones a user_blabla. Puede nombrarlos para lo que desee, siempre que imitalice los punteros a funciones con el mismo nombre. Eso da: puede reinicializar las funciones-puntos con otros nombres y, por lo tanto, hacer la llamada de lectura, la llamada de escritura, etcétera para llamar a otras funciones que antes.

Puede que tenga algunas cosas en esto para no ser 100% exactas, porque hace unas horas, después de trabajar muchas horas con esto, lo descubrí yo mismo, y he pasado muchas horas para conseguirlo trabajando. Y, naturalmente, no hablo inglés, así que ahí tenemos languge-barriar.

Una última sugerencia, el subproceso de problemas del repositorio de BoschSensortec / BMP280_driver tiene un código que vale la pena ver. BoschSensortec / BMP280_driver issuses

    
respondido por el phol

Lea otras preguntas en las etiquetas