2024-06-28 01:37 AM
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
But my Register always equal to 0. ret = HAL_OK.
I don't understand why :)
Can you help me
2024-07-18 08:08 AM
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)
2024-07-18 08:12 AM
and the problem is the same if my datasize is 8 or 16
2024-07-18 08:21 AM
when i use the function transmitreceive i set the size data to 2 bytes
2024-07-18 08:58 AM
Again: did you set data size to 16b ?
here:
+ 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.
2024-07-19 01:08 AM
Yes
The problem remains the same
2024-07-19 02:17 AM
this what i get when i analyse my signals :
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
2024-07-19 03:11 AM
+ for LIS - maybe need this spi setting: ( high+2edge )
+
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.
2024-07-19 05:52 AM
this is my configuration already ;)