I have problem with ISMDHCX sensor. In CubeMx I downloaded MEMS1 and ISMDHCX setted to SPI.
I wrote init function
void acc_module_init(ISM330DHCX_Object_t *ISM330) {
ISM330DHCX_IO_t io_ctx;
io_ctx.BusType = ISM330DHCX_SPI_3WIRES_BUS;
io_ctx.Init = BSP_SPI1_Init;
io_ctx.DeInit = BSP_SPI1_DeInit;
io_ctx.ReadReg = BSP_SPI1_Recv;
io_ctx.WriteReg = BSP_SPI1_Send;
io_ctx.GetTick = BSP_GetTick;
ISM330DHCX_RegisterBusIO(ISM330, &io_ctx);
ISM330DHCX_Init(ISM330);
ISM330DHCX_ACC_Enable(ISM330);
}
And I have a task to read axes from this sensor
void accTaskFunc(void *argument) {
ISM330DHCX_Object_t ISM330;
ISM330DHCX_Axes_t axes_data;
uint8_t ISM_ID;
acc_module_init(&ISM330);
ISM330DHCX_ReadID(&ISM330, &ISM_ID);
for(;;) {
int32_t stat = ISM330DHCX_ACC_GetAxes(&ISM330, &axes_data);
printf("id: %d, x: %ld, y: %ld, z: %ld, get_axes_stat: %ld\r\n", ISM_ID, axes_data.x, axes_data.y, axes_data.z, stat);
osDelay(500);
}
}
I can read some values for x, y and z, but this values don't change when I move the PCB. Any idea what could be wrong?
To properly working I wrote to functions
int32_t platform_write(void *handle, uint8_t reg, const uint8_t *bufp, uint16_t len) {
reg |= (0x40 << 7);
HAL_GPIO_WritePin(CUSTOM_ISM330DHCX_0_CS_PORT, CUSTOM_ISM330DHCX_0_CS_PIN, GPIO_PIN_RESET);
CUSTOM_ISM330DHCX_0_SPI_Send(®, 1);
CUSTOM_ISM330DHCX_0_SPI_Send((uint8_t*) bufp, len);
HAL_GPIO_WritePin(CUSTOM_ISM330DHCX_0_CS_PORT, CUSTOM_ISM330DHCX_0_CS_PIN, GPIO_PIN_SET);
return 0;
}
int32_t platform_read(void *handle, uint8_t reg, uint8_t *bufp, uint16_t len) {
reg |= (1 << 7);
HAL_GPIO_WritePin(CUSTOM_ISM330DHCX_0_CS_PORT, CUSTOM_ISM330DHCX_0_CS_PIN, GPIO_PIN_RESET);
CUSTOM_ISM330DHCX_0_SPI_Send(®, 1);
CUSTOM_ISM330DHCX_0_SPI_Recv(bufp, len);
HAL_GPIO_WritePin(CUSTOM_ISM330DHCX_0_CS_PORT, CUSTOM_ISM330DHCX_0_CS_PIN, GPIO_PIN_SET);
return 0;
}
And init looks like this now:
void acc_module_init(ISM330DHCX_Object_t *ISM330) {
ISM330DHCX_IO_t io_ctx;
io_ctx.BusType = ISM330DHCX_SPI_3WIRES_BUS;
io_ctx.Init = BSP_SPI1_Init;
io_ctx.DeInit = BSP_SPI1_DeInit;
io_ctx.ReadReg = platform_read;
io_ctx.WriteReg = platform_write;
io_ctx.GetTick = HAL_GetTick;
ISM330DHCX_RegisterBusIO(ISM330, &io_ctx);
ISM330DHCX_Init(ISM330);
ISM330DHCX_ACC_Enable(ISM330);
}