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-06-28 02:02 AM
@fru999 wrote:The protocol for SPI transmission is
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:
2024-06-28 02:09 AM - edited 2024-06-28 02:12 AM
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...)
2024-06-28 02:14 AM
Why do you think that will fix my problem (I just want to understand)
2024-06-28 02:16 AM
I it is 16bit that means that the 8 LSB are the register and the 8 last are the data ?
2024-06-28 02:19 AM
I did a mistake this is not the solution
I get the CPHA and CPOL values
2024-06-28 02:46 AM
:)
You can select in these box menu -> not the solution, Then can check another for solution...
2024-06-28 02:52 AM
do you think my read and write protocol are good ?
2024-06-28 03:05 AM
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).
2024-06-28 03:33 AM
but it is like a 16 bit receive/transmit thanks to my list of 8bit no ?