Skip to main content
Visitor II
May 29, 2018
Question

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

  • May 29, 2018
  • 14 replies
  • 5817 views
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
    This topic has been closed for replies.

    14 replies

    Visitor II
    April 9, 2020

    Bonjour Dominique

    Je suis directeur adjoint de Phelma et je ne chôme pas en ce moment. Mes étudiants en projets de fin d'étude sont des situations critiques.

    Je t'avouerai que cela fait longtemps que j'ai travaillé sur le module VL53L0X en I2C.

    Comme tu le sais, avec l'I2C, on peut avoir des mauvaises surprises du style : le capteur est reconnu mais les signaux I2C ne sont pas stables.

    Il faut d'abord vérifier les 2 résistances de pull-up (10 kOhms) sur SDA et SDC. Quitte à les rajouter sur une breadboard.

    As-tu accès à un analyseur logique pour vérifier les trames I2C?

    Je viens de m'apercevoir que j'ai testé la librairie avec une STM32L4 et non une F4 (normalement HAL est plus fiable)

    Je te joins le lien sur le module que j'ai acheté

    https://fr.aliexpress.com/item/32828144370.html?spm=a2g0s.9042311.0.0.27426c372fevjx clique sur le 2eme choix.

    De mémoire dans mes essais, la pin GPIO1 n'est pas utilisée.

    Je n'ai pas à ma position une STM32F469 Discovery mais à une Nucleo-F411RE.

    Si je trouve le temps, j'essaierai de tester la librairie sur ma Nucleo-F4.

    Merci à toi

    JC

    Visitor II
    April 9, 2020

    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

    Visitor II
    April 11, 2020

    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

    Visitor II
    April 9, 2020

    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?

    Visitor II
    April 11, 2020

    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

    Visitor II
    April 13, 2020

    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

    Visitor II
    May 2, 2020

    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).