cancel
Showing results for 
Search instead for 
Did you mean: 

VL53L8CX SPI communication

bastl
Associate

Hi all,

I'm trying to setup the SPI communication with a VL53L8CX which is connected to a STM32F401RE-Nucleo. I took some code snippets from the STSW-IMG040 package and I wonder why the bytes to be send in VL53L8CX_WrMulti and VL53L8CX_RdMulti are treated with a special mask instead of just separating the bytes like shown below:

#define SPI_WRITE_MASK(x) (uint16_t)(x | 0x8000)  // 1
#define SPI_READ_MASK(x)  (uint16_t)(x & ~0x8000)

data_write[0] = SPI_WRITE_MASK(temp) >> 8;
data_write[1] = SPI_WRITE_MASK(temp) & 0xFF;

       respectively

data_write[0] = SPI_READ_MASK(temp) >> 8;
data_write[1] = SPI_READ_MASK(temp) & 0xFF;

     instead of just

data_write[0] = (temp >> 8) & 0xFF;
data_write[1] = temp & 0xFF;

Is there a special reason for doing this?

Regards
Bastian

1 ACCEPTED SOLUTION

Accepted Solutions
John E KVAM
ST Employee

On an i2C, if the sensor has a base address of 0x29, one shifts the base address one bit and uses the LSB as a write/read. So write to address 0x52 and read from address 0x53.

According to Bing A/I, "In SPI communications, there is no specific "read/write" bit. Instead, the first byte contains the SPI address, and the following bytes contain the data. The first bit of the first byte indicates whether it is a read (1) or write (0) operation123."

So that mask sets (or clears) the MSB.

and the rest is to swap the bytes as SPI (and I2C) are big-endian and the STM32 is little endian. 

- john

 


If this or any post solves your issue, please mark them as 'Accept as Solution' It really helps. And if you notice anything wrong do not hesitate to 'Report Inappropriate Content'. Someone will review it.

View solution in original post

1 REPLY 1
John E KVAM
ST Employee

On an i2C, if the sensor has a base address of 0x29, one shifts the base address one bit and uses the LSB as a write/read. So write to address 0x52 and read from address 0x53.

According to Bing A/I, "In SPI communications, there is no specific "read/write" bit. Instead, the first byte contains the SPI address, and the following bytes contain the data. The first bit of the first byte indicates whether it is a read (1) or write (0) operation123."

So that mask sets (or clears) the MSB.

and the rest is to swap the bytes as SPI (and I2C) are big-endian and the STM32 is little endian. 

- john

 


If this or any post solves your issue, please mark them as 'Accept as Solution' It really helps. And if you notice anything wrong do not hesitate to 'Report Inappropriate Content'. Someone will review it.