cancel
Showing results for 
Search instead for 
Did you mean: 

LIS2D12

fru999
Associate III

I use LIS2DS12 

This is my init function

 

 

 

void LIS2DS12_Init(void)
{
	uint8_t ctrl_1 = 0x72; //0111 for 6.4kHz ODR [7:4], 00 for 2g [3:2], 1 for high frequency available[1], 0 for BDU not activated [0]
	uint8_t ctrl_2; // [6] for soft_reset, [1] for disable I2C, [0] for 4 wires SPI
	HAL_StatusTypeDef ret;

	ret = spi_read_LIS2DS12(CTRL2_ADDR, &ctrl_2);
	ctrl_2 |= 0x42; // [6] for soft_reset, [1] = 1 for disable I2C, [0] = 0 for 4 wires SPI
	ret = spi_write_LIS2DS12(CTRL2_ADDR, &ctrl_2);

	//reset the accelerometer
	ret = spi_write_LIS2DS12(CTRL1_ADDR, &ctrl_1);

	//set the accelerometer to measurement mode


	spi_read_LIS2DS12(CTRL1_ADDR, &ctrl_1);
	spi_read_LIS2DS12(CTRL2_ADDR, &ctrl_2);
}

 

 

 

with read and write : 

 

 

 

HAL_StatusTypeDef spi_write_LIS2DS12(uint8_t regAddr, uint8_t *pData)
{
	HAL_StatusTypeDef ret;
	uint8_t address = regAddr & 0x7F;

	uint8_t sendData[2] = {address, *pData};
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, 0);

	ret = HAL_SPI_Transmit(&hspi2, sendData, 2, 20);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, 1);

	return ret;
}
HAL_StatusTypeDef spi_read_LIS2DS12(uint8_t regAddr, uint8_t *pData)
{
	HAL_StatusTypeDef ret;
	uint8_t address = regAddr | 0x80;

	uint8_t sendData[2] = {address, 0};
	uint8_t receiveData[2] = {0};

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, 0);

	ret = HAL_SPI_TransmitReceive(&hspi2, sendData, receiveData, 2, 50);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, 1);

	*pData = receiveData[1];

	return ret;
}

 

 

 

The protocol for SPI transmission is 

fru999_0-1719563774185.png

fru999_1-1719563790647.png

But my Register always equal to 0. ret = HAL_OK.

I don't understand why

Can you help me

 

27 REPLIES 27
fru999
Associate III

and this is the definition of the function in STM32 CUBE :

HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData,

uint16_t Size, uint32_t Timeout)

fru999
Associate III

and the problem is the same if my datasize is 8 or 16 

fru999
Associate III

when i use the function transmitreceive i set the size data to 2 bytes

Again: did you set data size to 16b ?

here:

AScha3_0-1721318217862.png

+ your data in software also 16b , but: command/send is only in upper 8b , resonse/receive is only in lower 8b of the 16b words.

If you feel a post has answered your question, please click "Accept as Solution".
fru999
Associate III

Yes

The problem remains the same

this what i get when i analyse my signals :

fru999_0-1721380512644.png

when the thing I am supposed to send is {10001111, 0}

 

 not So the first clock tick is not supposed to be here because the count of clock rise is 17 when it supposed to be 16

+ for LIS   - maybe need this spi setting: ( high+2edge )

AScha3_0-1721383608666.png

 

+

always just 

HAL_SPI_TransmitReceive(..)

1 x 16b word, for write set the upper/lower 8b (discard the receive);

for read, as i wrote,  data in software also 16b , but: command/send is only in upper 8b , resonse/receive is only in lower 8b of the 16b word received.

If you feel a post has answered your question, please click "Accept as Solution".

this is my configuration already