Skip to main content
Visitor II
December 14, 2020
Question

Hi everyone, I want to connect ADXL355 accelerometer sensor with stm32F407 mcu using I2C but, there is no any response from the sensor. Can anyone help me? Thanks...

  • December 14, 2020
  • 1 reply
  • 1912 views

0693W000006Fj6DQAS.jpg 

ADXL355_Result ADXL355_Init(I2C_HandleTypeDef* I2Cx,ADXL355 * DataStruct, ADXL355_Device DeviceNumber, ADXL355_Accelerometer AccelerometerSensitivity)

{

uint8_t WHO_AM_I = (uint8_t)ADXL355_DEVID_AD ;

uint8_t temp;

I2C_HandleTypeDef* Handle = I2Cx;

/* Format I2C address */

DataStruct->Address = (uint8_t)DeviceNumber;

uint8_t address = DataStruct->Address;

/* Check if device is connected */

if(HAL_I2C_IsDeviceReady(Handle,address,2,5)!=HAL_OK)

{

return ADXL355_Result_Error;

}

if(HAL_I2C_Mem_Read(Handle, address, WHO_AM_I, 1, &temp, 1, 1000) != HAL_OK)

{

return ADXL355_Result_Error;

}

/* Checking */

while(temp != ADXL355_ID)

{

/* Return error */

return ADXL355_Result_DeviceInvalid;

}

//------------------

/* POWER_CTL */

//------------------

/* Set POWER_CTL register */

if(ADXL355_POWERCTL(I2Cx , DataStruct) != ADXL355_Result_Ok)

{

return ADXL355_Result_Error;

}

//------------------

/* Config accelerometer */

ADXL355_SetAccelerometer(I2Cx,DataStruct, AccelerometerSensitivity);

/* Return OK */

return ADXL355_Result_Ok;

}

ADXL355_Result ADXL355_SetAccelerometer(I2C_HandleTypeDef* I2Cx,ADXL355* DataStruct, ADXL355_Accelerometer AccelerometerSensitivity)

{

uint8_t temp;

I2C_HandleTypeDef* Handle = I2Cx;

uint8_t address = DataStruct->Address;

uint8_t regAdd =(uint8_t )ADXL355_Range;

/* Config accelerometer */

while(HAL_I2C_Master_Transmit(Handle, (uint16_t)address,&regAdd, 1, 1000) != HAL_OK);

/*{

return SD_MPU6050_Result_Error;

}*/

while(HAL_I2C_Master_Receive(Handle, (uint16_t)address, &temp, 1, 1000) != HAL_OK);

/*{

return SD_MPU6050_Result_Error;

}*/

temp = (temp & 0xFC) | (uint8_t)AccelerometerSensitivity ;

while(HAL_I2C_Master_Transmit(Handle, (uint16_t)address,&temp, 1, 1000) != HAL_OK);

/*{

return SD_MPU6050_Result_Error;

}*/

/* Set sensitivities for multiplying gyro and accelerometer data */

switch (AccelerometerSensitivity) {

case ADXL355_Accelerometer_2G:

DataStruct->Acce_Mult = (float)1 / ADXL355_ACCE_SENS_2;

break;

case ADXL355_Accelerometer_4G:

DataStruct->Acce_Mult = (float)1 / ADXL355_ACCE_SENS_4;

break;

case ADXL355_Accelerometer_8G:

DataStruct->Acce_Mult = (float)1 / ADXL355_ACCE_SENS_8;

break;

default:

break;

}

/* Return OK */

return ADXL355_Result_Ok;

}

ADXL355_Result ADXL355_POWERCTL(I2C_HandleTypeDef* I2Cx, ADXL355* DataStruct)

{

uint8_t temp;

I2C_HandleTypeDef* Handle = I2Cx;

uint8_t address = DataStruct->Address;

uint8_t regAdd =(uint8_t )ADXL355_POWER_CTL;

/* Config accelerometer */

while(HAL_I2C_Master_Transmit(Handle, (uint16_t)address,&regAdd, 1, 1000) != HAL_OK)

{

return ADXL355_Result_Error;

}

while(HAL_I2C_Master_Receive(Handle, (uint16_t)address, &temp, 1, 1000) != HAL_OK)

{

return ADXL355_Result_Error;

}

temp = temp & 0xFE ; // Set measurement bit in POWER_CTL register

while(HAL_I2C_Master_Transmit(Handle, (uint16_t)address,&temp, 1, 1000) != HAL_OK)

{

return ADXL355_Result_Error;

}

return ADXL355_Result_Ok;

}

ADXL355_Result ADXL355_ReadAccelerometer(I2C_HandleTypeDef* I2Cx,ADXL355* DataStruct)

{

uint32_t X = 0, Y = 0 , Z = 0;

uint8_t data[9];

uint8_t reg = ADXL355_XDATA3 ;

I2C_HandleTypeDef* Handle = I2Cx ;

uint8_t address = DataStruct->Address ;

/* Read accelerometer data */

//while(HAL_I2C_Master_Transmit(Handle, (uint16_t)address, &reg, 1, 1000) != HAL_OK) ;

while(HAL_I2C_Mem_Read(Handle, address, reg, 1, data , 6, 1000) != HAL_OK) ;

for(int t=0;t<3;t++)

{

X<<=8;

X+=data[t];

}

for(int t=3;t<6;t++)

{

Y<<=8;

Y+=data[t];

}

for(int t=6;t<9;t++)

{

Z<<=8;

Z+=data[t];

}

DataStruct->Accelerometer_X = ADXL355_Acceleration_Data_Conversion(X);

DataStruct->Accelerometer_Y = ADXL355_Acceleration_Data_Conversion(Y);

DataStruct->Accelerometer_Z = ADXL355_Acceleration_Data_Conversion(Z);

ADXL_AX = (float)DataStruct->Accelerometer_X*DataStruct->Acce_Mult;

ADXL_AY = (float)DataStruct->Accelerometer_Y*DataStruct->Acce_Mult;

ADXL_AZ = (float)DataStruct->Accelerometer_Z*DataStruct->Acce_Mult;

/* Return OK */

return ADXL355_Result_Ok;

}

    This topic has been closed for replies.

    1 reply

    Graduate II
    December 14, 2020

    Make sure you have pull-ups on the SCL/SDA pins (external 2K7 suggested), and they are configured in open-drain.

    Not going to dig into the code. The device needs to respond to its Slave Address with a NACK, or none of the rest will matter.

    The Slave Address in ST terms with be (0x1D << 1) or (0x53 << 1) for the secondary.

    MHass.2Author
    Visitor II
    December 14, 2020

    in datasheet of ADXL355 it says that

    ASEL (pin) = 0, device address = 0x1D

    ASEL (pin) = 1, device address = 0x53

    why we shift it left?

    Graduate II
    December 14, 2020

    Because the address bits are the high order 7-bits, and this is how ST manages them.

    If you've not shifted them, and it's not working, should tell you something about the implementation.