cancel
Showing results for 
Search instead for 
Did you mean: 

Ported VL53L0X Pololu code to STM32 - Always times out, can't find error!

Adam Halliwell
Associate II
Posted on May 29, 2018 at 04:06

Hi all

In lieu of the VL53L0X API being so awkward to use, I've made an effort to port the Pololu version of the VL53L0X library to STM32-compatible C code, using HAL functions to manage I2C communication.

Using an STM32F072RB board, with fast mode I2C (400KHz) and the 'D3' pin as XSHUT1, the setup and operation of the sensor in main.c goes as follows (removed surrounding code for readability)

VL53L0X sensor1;
char msg[64];
main()
{
setup_VL53L0X(&sensor1);
HAL_GPIO_WritePin(XSHUT1_GPIO_Port, XSHUT1_Pin,false);
 HAL_Delay(100);
HAL_GPIO_WritePin(XSHUT1_GPIO_Port, XSHUT1_Pin,true);
 HAL_Delay(20);
if(!init(&sensor1,true))
 {
 snprintf(msg,sizeof(msg),'Failed to initialize\r\n');
 HAL_UART_Transmit(UART, (uint8_t*)msg, strlen(msg), 0xFFFF);
 }
 else
 {
 snprintf(msg,sizeof(msg),'Successfully initialized\r\n');
 HAL_UART_Transmit(UART, (uint8_t*)msg, strlen(msg), 0xFFFF);
 }
setTimeout(&sensor1,500);
 startContinuous(&sensor1,0);
while(1)
{
snprintf(msg,sizeof(msg),'Read value: %u\r\n');//,readRangeContinuousMillimeters(&sensor1));
 HAL_UART_Transmit(UART, (uint8_t*)msg, strlen(msg), 0xFFFF);
}
}�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?

Unfortunately the function readRangeContinuousMillimeters(...) always returns a timeout (65536), as if the sensor is never initialised to read continuously (but, as shown in the code, it definitely is). Furthermore, reading WHO_AM_I always returns 0xEE which is correct and proves that the I2C bus is working.

Every function in the VL53L0X library has been ported over appropriately, and I've scanned every line of code to try and find the source of the problem. However, zero luck as of yet.

I have attached both the Pololu and my own version of the VL53L0X library, plus a custom I2C library which makes use of HAL functions, and the full main.c of this project.

If anyone is able to play spot-the-difference in order to get this working I'd be eternally grateful, as I'm completely stumped. Not that it's much in return, but this code is free for anyone to use if they can get it working.

Cheers

#port #vl53l0x
28 REPLIES 28

0693W000000Vb1hQAC.jpgMerci, Jean-Christophe, d'avoir consacrer de ton temps précieux, je sais que tes fonctions sont contraignantes.

J'utilise l'I2C1 de la STM32F469 Discovery.

Des résistances de pullUp (R140 et R142) de 1.5K sont soudées sur le pcb.

Pour s'approcher des 10K, j'ai déjà désactivé le pullUp interne => GPIO_InitStruct.Pull = GPIO_NOPULL;

Je pense que les signaux I2C sont stables car je peux initialiser totalement le VL53L0X et voir que les mesures de  "VL53L0X_PerformSingleRangingMeasurement" donne "RangeMillimeter" correct.

Le problème vient de "VL53L0X_GetDistance()"..... jusqu'à "VL53L0X_measurement_poll_for_completion()" qui génère le timeOut

Je continue de chercher de mon coté...

Bonne journée

SSilv.1
Associate

galera, alguém me ajude pelo amor de Deus, estou tentando fazer o vl53l1x funcionar na minha descoberta stm32f051, mas não consigo, já faz 3 dias. É para um trabalho na faculdade, estou desesperado, já tentei o programa para todos aqui, mas há algum erro de tempo limite e não consigo resolver-lo, alguém pode executar essa descoberta e me ajudar?

Bonjour Dominique

La librairie fonctionne correctement avec une Nucleo-F411RE.

La pin GPIO1 du module VL52L0X n'est pas utilisée dans mon code.

J'ai réduit la vitesse du bus I2C à 100kHz.

Je te joins le micro-projet sous F4 en attaché. J'ai utilisé le CubeIDE pour ce développement.

Je vais essayer de déterrer une carte discoveryF429 pour tester la lib de nouveau. Je n'ai pas en ma possession de carte F469.

Bon week-end

JC

Olá

A biblioteca que disponibilizei funciona apenas com um módulo VL53L0X e um STM32F4 ou L4.

Para o seu módulo VL53L1, existe uma biblioteca desenvolvida pela ST, aqui está o link. Mas é necessário ter um quadro Núcleo F4 ou L4.

https://www.st.com/content/st_com/en/products/ecosystems/stm32-open-development-environment/stm32-nucleo-expansion-boards/stm32-ode-sense-hw/x-nucleo-53l1a1.html#tools-software

Aconselho-o, portanto, a comprar um cartão STM32F411RE.

Boa sorte

JC

Hello

The library I provided works with a VL53L0X module only and a STM32F4 or L4.

For your VL53L1 module, there is a library developed by ST, here is the link. But you must have a Nucleo F4 or L4 board.

https://www.st.com/content/st_com/en/products/ecosystems/stm32-open-development-environment/stm32-nucleo-expansion-boards/stm32-ode-sense-hw/x-nucleo-53l1a1.html#tools-software

I therefore advise you to buy a STM32F411RE card.

Good luck.

JC

0693W000000ViNfQAK.jpg0693W000000ViNaQAK.jpgEncore merci, Jean-christophe, d'avoir dégagé du temps et de l'énergie dans ton planning chargé.

Sur ma F469discovery, j'ai essayé avec le bus I2C1 à 100kHz au lieu de 400.

Non seulement, le timeOut du VL53 (0x52) est toujours présent mais mon écran OLED (0x78) ne fonctionne plus.

Le bus I2C2 est à 100kHz, par défaut, pour l'audio DAQ CS43L22 (0x94), le souci est qu'il n'est pas accessible à l'utilisateur.

Il faudrait souder 2 fils, SCL&SDA, sur les 2 résistance de pullUp : R121 et R124 (2k2 ohm).

De plus il faudrait remplacer ces résistances par des 10k et désactiver les pullUp internes.

Différence entre la F411 et ma F469, c'est l'horloge : 100 MHz et 180MHz.

J'ai une NucleoL476 à 80 MHz pour tester ton projet F411. (plus basique pour réaliser des tests que la discovery)

Je ferai mes essais demain.

Très bon week-end.

Dom

Bonjour Jean-Christophe,

Je m'interroge sur le niveau de tension de l'alimentation du VL53.

Dans ma platine "flow Breakout", le VL53 est en 2.8V => erreur de timeOut

Dans ta platine "GY-530", le VL53 est en 3.3V => ça fonctionne...

La doc pdf du VL53 n'est pas claire à ce sujet.

Y a-t'il un rapport de cause à effet ?

Bonne journée.

Dom0693W000000VjOeQAK.jpg0693W000000VjOZQA0.jpg0693W000000VjOKQA0.jpg

Bonjour Dominique

C'est sympa que tu as pu faire l'analyse.

La réponse est certainement oui.

Humm, de mémoire, il faut passer le device en mode 2V8 par programmation.

Et dans ma librairie, je l'ai supprimé.

Je te tiens au courant si je retrouve le bout de code manquant.

JC

Bonjour Jean-Christophe,

1) Sur F469 discovery :

j'ai inclus "#define USE_I2C_2V8" dans "vl53l0x_class.h" mais sans succés.... grrrr...

2) sur L476 Nucleo :

j'ai installé le projet "Nucleo_L4_VL53L0X_v1" validé sur L476RG

j'ai migré sous cubeIde 1.3.0

La fonction GetDistance fonctionne très bien, je mets une copie de la config I2C1

3) je vais analyser les différences pour aboutir surma F4690693W000000VxFHQA0.jpg

Bonne journée

SSpan.1
Associate

Sorry if it's too late... I just found your topic, and @ZVita (Community Member) is right. One must insert these lines in the initialization code:

setVcselPulsePeriod (& sensor1, VcselPeriodPreRange, 18);

setVcselPulsePeriod (& sensor1, VcselPeriodFinalRange, 14);

After that, with minor adaptation, the ATT[1234] from @Adam Halliwell (Community Member) worked very well on STM32F4 Discovery (no 65535 issue).