2020-05-13 05:00 AM
Hi,
I was taking a look at the STMems Standard C Library for the LIS3DSH. The implementation of the function lis3dsh_status_get looks a bit weird as there are 2 calls to the lis3dsh_write_reg functions.
int32_t lis3dsh_status_get(stmdev_ctx_t *ctx, lis3dsh_status_var_t *val)
{
lis3dsh_ctrl_reg3_t ctrl_reg3;
lis3dsh_ctrl_reg6_t ctrl_reg6;
lis3dsh_stat_t stat;
int32_t ret;
ret = lis3dsh_read_reg(ctx, LIS3DSH_STAT, (uint8_t*)&stat, 1);
if (ret == 0) {
ret = lis3dsh_write_reg(ctx, LIS3DSH_CTRL_REG3, (uint8_t*)&ctrl_reg3, 1);
}
if (ret == 0) {
ret = lis3dsh_write_reg(ctx, LIS3DSH_CTRL_REG6, (uint8_t*)&ctrl_reg6, 1);
}
val->sw_reset = ctrl_reg3.strt;
val->boot = ctrl_reg6.boot;
val->drdy_xl = stat.drdy;
val->ovrn_xl = stat.dor;
return ret;
}
Shouldn't lis3dsh_read_reg be called to get the values of the control reg 3 and 6? If the write reg functions are called, wouldn't it populate the ctrl reg with garbage values?
Thanks
2020-05-13 09:32 AM
Hi @GTS.1 , it seems you are right again ;) Thank you for your reporting, the driver will be fixed by the end of this week. Regards
2020-05-13 12:23 PM
No problem, I have few more questions regarding the library
2020-05-15 07:46 AM
Hi @GTS.1 , after an internal check with out API expert, I can tell you that we are re-defining the driver APIs at a higher level than before (especially on the newest sensors and on the LIS3DSH), according to the FAQ and the most common requirements from the customers. For these reason, the rational now is not to develop explicitly the low level functions.
To answer your specific questions:
>> Why is the status_get function reading the STAT reg instead of the STATUS_REG?
Actually the STATUS register isn't there because the info in this register are the drdy and the overrun for every axis, and it is not used from the majority of the programmer and user of the current , but we will add it ;)
>> enable/disable BDU
lis3dsh_reg reg;
lis3dsh_read_reg(ctx, LIS3DSH_CTRL_REG6, ®.byte,1);
reg.ctrl_reg6.bdu = PROPERTY_ENABLE;
lis3dsh_write_reg(ctx, LIS3DSH_CTRL_REG6, ®.byte,1);
>> get raw individual axis values
int16_t raw_data
lis3dsh_read_reg(ctx, LIS3DSH_OUT_Y_L, (uint8_t*)&raw_data,2);
data_mg = lis3dsh_from_fsX_tomg(raw_data)
Regards
2020-05-15 09:43 AM
Thanks, this cleared up my question. I initially assumed that the status_get function reads the STATUS register. That was a wrong assumption on my part.