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

fru999_0-1719570923550.pngfru999_1-1719570937157.png

my CS:

fru999_2-1719570962846.png

 

@fru999 - again:

Have you used a logic analyser or oscilloscope to see if what's actually happening in your hardware matches the protocol spec diagrams you posted ?

Among other things, you haven't told us what board(s) you're using - please see:

https://community.st.com/t5/community-guidelines/how-to-write-your-question-to-maximize-your-chances-to-find-a/ta-p/575228

But "like" is not "it is" .

Imagine : the receiving chip expects a sequence, as given in diagram.

But you send another, in two parts...could work, or not.

So set it to 16bit SPI data size.

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

Ahh, + set : Motorola, with NSS = hardware , to get matching /CS signal. (Then no need to set it in software.)

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

But everywhere I see, bit for the adress and  it says 8 bits because each communication is 8 bit long (8bit for the adress, 8 bit for the data but the slave expects 8 bits for the adress and 8 bits for the data and it is separated). If i put 16 bit long the slave will wait for 16 bit for the adress and 16 bits for the data no ?

 

If i do that that means i will not have to toggle the pin every time ?

Where you "see 8bits" ?

in your pic:

AScha3_0-1719574390153.png

AScha3_2-1719574465732.png

I see 16bit sequence here.

 

>If i do that that means i will not have to toggle the pin every time ?

Right. SPI hardware doing it then.

 

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

Read underneath the picture, it is 8 bits the data size 
But now the problem is that when I am in reading mode, after transmit receive, the receive data are equal to the transmit data... 
Do you have an idea why? 

Did you set it to 16bit frame at last ?

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

No, I have changed it and i always have hal_error and i have worked with another accelerometer wich description of SPI was the same and the data size was 8