revised vl53l0x XSHUT, GPIO setting for max 3 TOF sensors

This commit is contained in:
Yunhorn 2023-07-13 14:11:56 +08:00
parent 02ba2481c7
commit 1c393d1043
6 changed files with 131 additions and 80 deletions

View File

@ -96,10 +96,21 @@ void MX_TOF_Init(void);
#define TOF_C_INT_Pin GPIO_PIN_10 #define TOF_C_INT_Pin GPIO_PIN_10
#define TOF_C_INT_GPIO_Port GPIOA #define TOF_C_INT_GPIO_Port GPIOA
#define TOF_C_INT_EXTI_IRQn EXTI15_10_IRQn #define TOF_C_INT_EXTI_IRQn EXTI15_10_IRQn
#define TOF_C_XSHUT_Pin GPIO_PIN_3 #define TOF_C_XSHUT_Pin GPIO_PIN_3
#define TOF_C_XSHUT_GPIO_Port GPIOB #define TOF_C_XSHUT_GPIO_Port GPIOB
#define TOF_L_INT_Pin GPIO_PIN_7
#define TOF_L_INT_GPIO_Port GPIOC
#define TOF_L_INT_EXTI_IRQn EXTI9_5_IRQn
#define TOF_L_XSHUT_Pin GPIO_PIN_10
#define TOF_L_XSHUT_GPIO_Port GPIOB
#define TOF_R_INT_Pin GPIO_PIN_10
#define TOF_R_INT_GPIO_Port GPIOA
#define TOF_R_INT_EXTI_IRQn EXTI15_10_IRQn
#define TOF_R_XSHUT_Pin GPIO_PIN_5
#define TOF_R_XSHUT_GPIO_Port GPIOB
#define STS_SERVICE_MASK_L0 (0) // Service normal , no mask off #define STS_SERVICE_MASK_L0 (0) // Service normal , no mask off
#define STS_SERVICE_MASK_L1 (1) // service mask level 1, sensing data upload in silence mode, node appearance silence (no LED, No display, no sound, no vibration) #define STS_SERVICE_MASK_L1 (1) // service mask level 1, sensing data upload in silence mode, node appearance silence (no LED, No display, no sound, no vibration)
#define STS_SERVICE_MASK_L2 (2) // service mask level 2, NO sensing data upload (event or periodicity) #define STS_SERVICE_MASK_L2 (2) // service mask level 2, NO sensing data upload (event or periodicity)

View File

@ -93,18 +93,41 @@ void MX_GPIO_Init(void)
HAL_GPIO_Init(BUT1_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(BUT1_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : TOF_C_INT_Pin TOF_R_INT_Pin */ /*Configure GPIO pins : TOF_C_INT_Pin */
GPIO_InitStruct.Pin = TOF_C_INT_Pin; GPIO_InitStruct.Pin = TOF_C_INT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(TOF_C_INT_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(TOF_C_INT_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : TOF_L_INT_Pin */
GPIO_InitStruct.Pin = TOF_L_INT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(TOF_L_INT_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : TOF_R_INT_Pin */
GPIO_InitStruct.Pin = TOF_R_INT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(TOF_R_INT_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : TOF_C_XSHUT_Pin */ /*Configure GPIO pins : TOF_C_XSHUT_Pin */
GPIO_InitStruct.Pin = TOF_C_XSHUT_Pin; GPIO_InitStruct.Pin = TOF_C_XSHUT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(TOF_C_XSHUT_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(TOF_C_XSHUT_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : TOF_L_XSHUT_Pin */
GPIO_InitStruct.Pin = TOF_L_XSHUT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(TOF_L_XSHUT_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : TOF_R_XSHUT_Pin */
GPIO_InitStruct.Pin = TOF_R_XSHUT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(TOF_R_XSHUT_GPIO_Port, &GPIO_InitStruct);
/* EXTI interrupt init*/ /* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
@ -115,7 +138,10 @@ void MX_GPIO_Init(void)
HAL_NVIC_SetPriority(TOF_C_INT_EXTI_IRQn, 0, 0); HAL_NVIC_SetPriority(TOF_C_INT_EXTI_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TOF_C_INT_EXTI_IRQn); HAL_NVIC_EnableIRQ(TOF_C_INT_EXTI_IRQn);
HAL_NVIC_SetPriority(TOF_L_INT_EXTI_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TOF_L_INT_EXTI_IRQn);
HAL_NVIC_SetPriority(TOF_R_INT_EXTI_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TOF_R_INT_EXTI_IRQn);
} }
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */

View File

@ -270,7 +270,7 @@ void STS_YunhornSTSEventP3_Process(void)
void STS_YunhornSTSEventP4_Process(void) void STS_YunhornSTSEventP4_Process(void)
{ {
STS_SENSOR_Power_ON(0); STS_SENSOR_Power_ON(0);
STS_SENSOR_Power_OFF(0);
APP_LOG(TS_OFF, VLEVEL_L, "\r\n P4 Testing Process\r\n"); APP_LOG(TS_OFF, VLEVEL_L, "\r\n P4 Testing Process\r\n");
STS_TOF_VL53L0X_Range_Process(); STS_TOF_VL53L0X_Range_Process();
@ -450,9 +450,9 @@ void STS_SENSOR_Power_ON(uint8_t cnt)
case 1: case 1:
case 2: case 2:
#if (defined(YUNHORN_STS_M7_ENABLED) || defined(YUNHORN_STS_R0_ENABLED)) #if (defined(YUNHORN_STS_M7_ENABLED) || defined(YUNHORN_STS_R0_ENABLED))
HAL_GPIO_WritePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin, GPIO_PIN_SET);
#endif
HAL_GPIO_WritePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin, GPIO_PIN_SET);
#endif
break; break;
default: default:
@ -469,7 +469,7 @@ void STS_SENSOR_Power_OFF(uint8_t cnt)
#if (defined(YUNHORN_STS_M7_ENABLED) || defined(YUNHORN_STS_R0_ENABLED)) #if (defined(YUNHORN_STS_M7_ENABLED) || defined(YUNHORN_STS_R0_ENABLED))
HAL_GPIO_WritePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin, GPIO_PIN_RESET);
#endif #endif
HAL_GPIO_WritePin(MEMS_POWER_GPIO_Port, MEMS_POWER_Pin, GPIO_PIN_RESET);
break; break;
default: default:
break; break;

View File

@ -196,13 +196,23 @@ int XWL55_WLE5_53L0X_Init(void)
} }
void XWL55_WLE5_53L0X_Reset(void) void XWL55_WLE5_53L0X_ResetId(uint8_t DevNo, int state)
{ {
HAL_GPIO_WritePin(TOF_C_XSHUT_GPIO_Port, TOF_C_XSHUT_Pin, GPIO_PIN_RESET); switch(DevNo) {
HAL_Delay(30); case XNUCLEO53L0X_LEFT:
HAL_GPIO_WritePin(TOF_C_XSHUT_GPIO_Port, TOF_C_XSHUT_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(TOF_L_XSHUT_GPIO_Port, TOF_L_XSHUT_Pin, ((state == 1)?GPIO_PIN_SET:GPIO_PIN_RESET));
HAL_Delay(30); break;
case XNUCLEO53L0X_CENTER:
HAL_GPIO_WritePin(TOF_C_XSHUT_GPIO_Port, TOF_C_XSHUT_Pin, ((state == 1)?GPIO_PIN_SET:GPIO_PIN_RESET)); break;
case XNUCLEO53L0X_RIGHT:
HAL_GPIO_WritePin(TOF_R_XSHUT_GPIO_Port, TOF_R_XSHUT_Pin, ((state == 1)?GPIO_PIN_SET:GPIO_PIN_RESET)); break;
default:
break;
}
} }

View File

@ -47,7 +47,7 @@
* *
* require @a VL53L0X_HAVE_UART * require @a VL53L0X_HAVE_UART
*/ */
# define VL53L0X_UART_DMA_RX 0 #define VL53L0X_UART_DMA_RX 0
#endif //VL53L0X_UART_DMA_RX #endif //VL53L0X_UART_DMA_RX
#ifndef VL53L0X_UART_DMA_TX #ifndef VL53L0X_UART_DMA_TX
@ -57,7 +57,7 @@
* *
* require @a VL53L0X_HAVE_UART * require @a VL53L0X_HAVE_UART
*/ */
# define VL53L0X_UART_DMA_TX 1 #define VL53L0X_UART_DMA_TX 1
#endif //VL53L0X_UART_DMA_RX #endif //VL53L0X_UART_DMA_RX
@ -77,7 +77,7 @@
* @warning only F401 * @warning only F401
*/ */
# define VL53L0X_UART_DMA_TX_IRQ_PRI 0 #define VL53L0X_UART_DMA_TX_IRQ_PRI 0
#endif #endif
#ifndef VL53L0X_UART_IRQ_PRI #ifndef VL53L0X_UART_IRQ_PRI
@ -85,7 +85,7 @@
* User override default uart irq priority 0 to fit application needs * User override default uart irq priority 0 to fit application needs
* @warning only supported for f401 * @warning only supported for f401
*/ */
# define VL53L0X_UART_IRQ_PRI 0 #define VL53L0X_UART_IRQ_PRI 0
#endif #endif
/* provided by MSP part */ /* provided by MSP part */
@ -119,7 +119,7 @@ extern void XNUCLEO53L1A1_USART2_UART_Init(void);
* Must be set to non 0 for shared interrupt line * Must be set to non 0 for shared interrupt line
* see @sa VL53L0X_GPIO1_C_OPTION * see @sa VL53L0X_GPIO1_C_OPTION
*/ */
# define VL53L0X_GPIO1_SHARED 0 #define VL53L0X_GPIO1_SHARED 0
#endif #endif
@ -132,15 +132,15 @@ extern void XNUCLEO53L1A1_USART2_UART_Init(void);
* @li not defined or 0 : U14=On and U17=off => GPIO1_C = PA4 * @li not defined or 0 : U14=On and U17=off => GPIO1_C = PA4
* @li defined and not 0 : U14=Off and U17=on => GPIO1_C = PC1 * @li defined and not 0 : U14=Off and U17=on => GPIO1_C = PC1
*/ */
# define VL53L0X_GPIO1_C_OPTION 1 #define VL53L0X_GPIO1_C_OPTION 1
#endif #endif
# define VL53L0X_GPIO1_C_GPIO_PORT GPIOA #define VL53L0X_GPIO1_C_GPIO_PORT GPIOA
# define VL53L0X_GPIO1_C_CLK_ENABLE __GPIOA_CLK_ENABLE #define VL53L0X_GPIO1_C_CLK_ENABLE __GPIOA_CLK_ENABLE
# define VL53L0X_GPIO1_C_GPIO_PIN GPIO_PIN_10 #define VL53L0X_GPIO1_C_GPIO_PIN GPIO_PIN_10
# define VL53L0X_GPIO1_C_INTx EXTI15_10_IRQn #define VL53L0X_GPIO1_C_INTx EXTI15_10_IRQn
/** @} */ /* defgroup L53L1A1_GPIO1_MAP */ /** @} */ /* defgroup L53L1A1_GPIO1_MAP */
@ -154,7 +154,7 @@ extern void XNUCLEO53L1A1_USART2_UART_Init(void);
* *
* Traces formating and output is end user defined via #trace_printf * Traces formating and output is end user defined via #trace_printf
*/ */
# define XNUCLEO53L1A1_TRACE TRACE_UART #define XNUCLEO53L1A1_TRACE TRACE_UART
#endif // XNUCLEO53L1A1_TRACE #endif // XNUCLEO53L1A1_TRACE
@ -228,10 +228,8 @@ int XWL55_WLE5_53L0X_Init(void);
* @param state State of the device reset (xsdn) pin @warning reset pin is active low * @param state State of the device reset (xsdn) pin @warning reset pin is active low
* @return 0 on success * @return 0 on success
*/ */
int XNUCLEO53L1A1_ResetId(int DevNo, int state );
void XWL55_WLE5_53L0X_ResetId(uint8_t DevNo, int state);
void XWL55_WLE5_53L0X_Reset(void);
/** /**
* Enable Disable interrupt at MCU level (MSP) * Enable Disable interrupt at MCU level (MSP)
@ -254,6 +252,7 @@ void XWL55_WLE5_53L0X_Reset(void);
* >0 interrupt configured but with potential sharing on EXTI groups see @ref VL53L0X_GPIO1_MAP * >0 interrupt configured but with potential sharing on EXTI groups see @ref VL53L0X_GPIO1_MAP
*/ */
int XNUCLEO53L1A1_SetIntrStateId(int EnableIntr, int DevNo); int XNUCLEO53L1A1_SetIntrStateId(int EnableIntr, int DevNo);
int XWL55_WLE5_53L0X_SetIntrStateId(int EnableIntr, int DevNo);
int sts_tof_vl53l0x_DetectSensors(void); int sts_tof_vl53l0x_DetectSensors(void);
#endif /* _X_WL55_WLE5_53L0X_H_ */ #endif /* _X_WL55_WLE5_53L0X_H_ */

View File

@ -131,68 +131,73 @@ int sts_tof_vl53l0x_DetectSensors(void)
int FinalAddress; int FinalAddress;
nDevPresent = 0; nDevPresent = 0;
XWL55_WLE5_53L0X_Reset(); for (i=0; i < MAX_TOF_COUNT; i++) {
//HAL_GPIO_WritePin(TOF_C_XSHUT_GPIO_Port, TOF_C_XSHUT_Pin, GPIO_PIN_SET); XWL55_WLE5_53L0X_ResetId(i,0);
//HAL_Delay(100); }
//XWL55_WLE5_53L0X_SetIntrStateId(0,0);
/* detect all sensors (even on-board)*/ /* detect all sensors (even on-board)*/
for (i=0; i < MAX_TOF_COUNT; i++) for (i=0; i < MAX_TOF_COUNT; i++)
{ {
VL53L0X_Dev_t *pDev; VL53L0X_Dev_t *pDev;
pDev = &VL53L0XDevs[i]; pDev = &VL53L0XDevs[i];
pDev->I2cDevAddr = 0x52;//+(i*2); pDev->I2cDevAddr = 0x52;
pDev->Present = 0; pDev->Present = 0;
//status = XNUCLEO53L0A1_ResetId(pDev->Id, 1); XWL55_WLE5_53L0X_ResetId(pDev->Id, 1);
//HAL_Delay(2); HAL_Delay(2);
FinalAddress=0x52 +(i+1)*2; FinalAddress = 0x52+(i+1)*2;
APP_LOG(TS_OFF, VLEVEL_L, "\r\n Detect TOF sensors #%u with I2CDevAddr=0x%02x \r\n", i, pDev->I2cDevAddr); APP_LOG(TS_OFF, VLEVEL_L, "\r\n Detect TOF sensors #%u with I2CDevAddr=0x%02x \r\n", i, pDev->I2cDevAddr);
do { do {
/* Set I2C standard mode (400 KHz) before doing the first register access */ /* Set I2C standard mode (400 KHz) before doing the first register access */
//if (status == VL53L0X_ERROR_NONE) //if (status == VL53L0X_ERROR_NONE)
status = VL53L0X_WrByte(pDev, 0x88, 0x00); status = VL53L0X_WrByte(pDev, 0x88, 0x00);
/* Try to read one register using default 0x52 address */ /* Try to read one register using default 0x52 address */
status = VL53L0X_RdWord(pDev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Id); status = VL53L0X_RdWord(pDev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Id);
APP_LOG(TS_OFF, VLEVEL_L, "#%u read id = %04x I2C ADDR=0x%2X\r\n",i, Id, pDev->I2cDevAddr); APP_LOG(TS_OFF, VLEVEL_L, "#%u read id = %04x I2C ADDR=0x%2X\r\n",i, Id, pDev->I2cDevAddr);
if (status) { if (status) {
APP_LOG(TS_OFF, VLEVEL_L, "# Read id fail\n"); APP_LOG(TS_OFF, VLEVEL_L, "# Read id fail\n");
break; break;
} }
if (Id == 0xEEAA) { if (Id == 0xEEAA) {
/* Sensor is found => Change its I2C address to final one */ /* Sensor is found => Change its I2C address to final one */
status = VL53L0X_SetDeviceAddress(pDev,FinalAddress); status = VL53L0X_SetDeviceAddress(pDev,FinalAddress);
if (status != 0) { if (status != 0) {
APP_LOG(TS_OFF, VLEVEL_L, "#i VL53L0X_SetDeviceAddress fail\n"); APP_LOG(TS_OFF, VLEVEL_L, "#i VL53L0X_SetDeviceAddress fail\n");
break; break;
} }
pDev->I2cDevAddr = FinalAddress; pDev->I2cDevAddr = FinalAddress;
/* Check all is OK with the new I2C address and initialize the sensor */ /* Check all is OK with the new I2C address and initialize the sensor */
status = VL53L0X_RdWord(pDev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Id); status = VL53L0X_RdWord(pDev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Id);
status = VL53L0X_DataInit(pDev); status = VL53L0X_DataInit(pDev);
if( status == 0 ){ if( status == 0 ){
pDev->Present = 1; pDev->Present = 1;
APP_LOG(TS_OFF, VLEVEL_L, "#%u VL53L0X_SetDeviceAddress to 0x%02x\r\n",i, pDev->I2cDevAddr); APP_LOG(TS_OFF, VLEVEL_L, "#%u VL53L0X_SetDeviceAddress to 0x%02x\r\n",i, pDev->I2cDevAddr);
nDevPresent++; nDevPresent++;
nDevMask |= 1 << i; nDevMask |= 1 << i;
pDev->Present = 1; pDev->Present = 1;
APP_LOG(TS_OFF, VLEVEL_L, "VL53L0X %d Present and initiated to final 0x%2x, Position Mask=0x%02x\r\n", pDev->Id, pDev->I2cDevAddr, nDevMask); APP_LOG(TS_OFF, VLEVEL_L, "VL53L0X %d Present and initiated to final 0x%2x, Position Mask=0x%02x\r\n", pDev->Id, pDev->I2cDevAddr, nDevMask);
} }
else{ else{
APP_LOG(TS_OFF, VLEVEL_L, "VL53L0X_DataInit %d fail\n"); APP_LOG(TS_OFF, VLEVEL_L, "VL53L0X_DataInit %d fail\n");
break; break;
} }
} else { } else {
APP_LOG(TS_OFF, VLEVEL_L, "# unknown ID %x\n", Id); APP_LOG(TS_OFF, VLEVEL_L, "# unknown ID %x\n", Id);
status = 1; status = 1;
} }
} while(0); } while(0);
/* Display detected sensor(s) */ /* Display detected sensor(s) */
} if (status) {
XWL55_WLE5_53L0X_ResetId(i,0);
}
}
return nDevPresent; return nDevPresent;
} }