2024-07-28 11:50 PM
Hi,
I am attempting to obtain readings from the LIS2DTW12 accelerometer on board, utilizing the SPI interface and an STM32F098RCT6 microcontroller.
I’m accessing the ‘who_am_i’ register along with the high and low registers for the x, y, and z axes. Upon debugging, I’ve found that the high and low values for the x, y, and z axes are consistently 0xff, resulting in raw x, y, and z values of 0xffff.
Notably, these values remain unchanged even when the board is in motion.
Please help me.
Here is the code:
#define LIS2DTW12_WHO_IAM_I_ADDR 0x0F
#define LIS2DTW12_OUT_X_L_ADDR 0x28
#define LIS2DTW12_OUT_X_H_ADDR 0x29
#define LIS2DTW12_OUT_Y_L_ADDR 0x2A
#define LIS2DTW12_OUT_Y_H_ADDR 0x2B
#define LIS2DTW12_OUT_Z_L_ADDR 0x2C
#define LIS2DTW12_OUT_Z_H_ADDR 0x2D
uint8_t LIS2DTW12_ReadReg(uint8_t reg){
uint8_t Received_data = 0;
uint8_t address = reg | 0x80;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, &address,1,50);
HAL_SPI_Receive(&hspi1, &Received_data, 1, 50);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
return Received_data;
}
int main(void){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();
uint8_t who_am_i = LIS2DTW12_ReadReg(LIS2DTW12_WHO_IAM_I_ADDR);
if(who_am_i != 0x44){}
uint8_t x_low = LIS2DTW12_ReadReg(LIS2DTW12_OUT_X_L_ADDR);
uint8_t x_high = LIS2DTW12_ReadReg(LIS2DTW12_OUT_X_H_ADDR);
uint8_t y_low = LIS2DTW12_ReadReg(LIS2DTW12_OUT_Y_L_ADDR);
uint8_t y_high = LIS2DTW12_ReadReg(LIS2DTW12_OUT_Y_H_ADDR);
uint8_t z_low = LIS2DTW12_ReadReg(LIS2DTW12_OUT_Z_L_ADDR);
uint8_t z_high = LIS2DTW12_ReadReg(LIS2DTW12_OUT_Z_H_ADDR);
uint16_t x_raw = ((x_high << 8)|x_low);
uint16_t y_raw = ((y_high << 8)|y_low);
uint16_t z_raw = ((z_high << 8)|z_low);
while (1)
{
}
}
static void MX_SPI1_Init(void){
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
After debugging, values are obtaining as follows: