Search code examples
cembeddedstm32

ISM330DHCX read axes


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?


Solution

  • 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(&reg, 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(&reg, 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);
    }