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
Andrew Neil
Evangelist III

@fru999 wrote:

The protocol for SPI transmission is 

fru999_0-1719563774185.png

fru999_1-1719563790647.png


So have you used a logic analyser or oscilloscope to see if what's actually happening in your hardware matches those ?

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

AScha.3
Chief II

Maybe you have to adjust your setting for the SPI:

set it to 16bit data , (Motorola) MSB first, and clock CPOL high + CPHA 2 edge .

Try...  (and write/read uint_16  size , 1 x . (not 2 bytes, as now.) )

 

+

if not working: verify with scope, what you do (if possible) (as Andrew said...)

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

Why do you think that will fix my problem (I just want to understand) 

fru999
Associate III

I it is 16bit that means that the 8 LSB are the register and the 8 last are the data ?

fru999
Associate III

I did a mistake this is not the solution
I get the CPHA and CPOL values

You can select in these box menu -> not the solution, Then can check another for solution...

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

do you think my read and write protocol are good ?

I dont know...(just came back.).

But at first your clock/timing needs to match the device, you wanna talk to. (timing->phase = is rising or falling edge the correct point, to get the data).

Then transmit/receive , to write to device (and get response in same access, if device can do this.) ->

In your timing pic , for SPI-read , it shows like this; 

transmitted word/upper 8 bits is address, response (read=answer) comes in received word, lower 8bits ;

so you always have to do a (16bit) word transmit/receive , and set the important byte (= address), and in received word only use the lower byte (=response).

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

but it is like a 16 bit receive/transmit thanks to my list of 8bit no ?