STM32L0xx_Hal_Driver库的使用--EXTI

在使用STM32L0xx HAL 库进行EXTI配置时,遇到统计IO口信号频率的问题。Oscillator和M+信号统计正常,但M-信号在PB2中断下统计异常。通过示波器确认硬件信号无误后,发现PB2中断影响了PB0的中断。即使将M-信号连接到不同中断源的PB12,仍然出现干扰。目前问题定位为PB2中断对PB0中断的干扰,期待解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单片机型号:STM32L051C8T6

开发环境MDK5.12

库版本:STM32L0xx_HAL_Driver V1.1.0

主机环境:Windows XP

 之前碰到的串口问题还没解决,现在在学习EXTI时又遇到了新的问题。。。很是无语

Searching for 'WriteReg'... C:\Users\mma\Desktop\test\USBPD\Target\usbpd_pwr_user.c(1069) : STUSB1602_WriteReg(port, 0x2C, val); // ??? 0x2C = VCONN Control C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(350) : LL_TIM_WriteReg(TIMx, CR1, tmpcr1); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(570) : LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(573) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(670) : LL_TIM_WriteReg(TIMx, CR2, tmpcr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(673) : LL_TIM_WriteReg(TIMx, SMCR, tmpsmcr); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(676) : LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(679) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(777) : LL_TIM_WriteReg(TIMx, BDTR, tmpbdtr); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(858) : LL_TIM_WriteReg(TIMx, CR2, tmpcr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(861) : LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(867) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(937) : LL_TIM_WriteReg(TIMx, CR2, tmpcr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(940) : LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(946) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1016) : LL_TIM_WriteReg(TIMx, CR2, tmpcr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1019) : LL_TIM_WriteReg(TIMx, CCMR2, tmpccmr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1025) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1086) : LL_TIM_WriteReg(TIMx, CR2, tmpcr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1089) : LL_TIM_WriteReg(TIMx, CCMR2, tmpccmr2); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1095) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1150) : LL_TIM_WriteReg(TIMx, CCMR3, tmpccmr3); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1156) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1210) : LL_TIM_WriteReg(TIMx, CCMR3, tmpccmr3); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_tim.c(1216) : LL_TIM_WriteReg(TIMx, CCER, tmpccer); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_rcc.c(177) : LL_RCC_WriteReg(CFGR, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_rcc.c(180) : LL_RCC_WriteReg(CR, RCC_CR_HSION); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_rcc.c(183) : LL_RCC_WriteReg(CR, RCC_CR_HSION); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_rcc.c(190) : LL_RCC_WriteReg(PLLCFGR, 16U << RCC_PLLCFGR_PLLN_Pos); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_rcc.c(193) : LL_RCC_WriteReg(CIER, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_rcc.c(196) : LL_RCC_WriteReg(CICR, 0xFFFFFFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(83) : LL_EXTI_WriteReg(IMR1, 0xFFF80000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(85) : LL_EXTI_WriteReg(EMR1, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(87) : LL_EXTI_WriteReg(RTSR1, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(89) : LL_EXTI_WriteReg(FTSR1, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(91) : LL_EXTI_WriteReg(SWIER1, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(94) : LL_EXTI_WriteReg(RPR1, 0x0017FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(95) : LL_EXTI_WriteReg(FPR1, 0x0017FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(97) : LL_EXTI_WriteReg(RPR1, 0x0007FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(98) : LL_EXTI_WriteReg(FPR1, 0x0007FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(100) : LL_EXTI_WriteReg(RPR1, 0x0001FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(101) : LL_EXTI_WriteReg(FPR1, 0x0001FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(103) : LL_EXTI_WriteReg(RPR1, 0x0000FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(104) : LL_EXTI_WriteReg(FPR1, 0x0000FFFFU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(109) : LL_EXTI_WriteReg(IMR2, 0x00000003U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(111) : LL_EXTI_WriteReg(EMR2, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(114) : LL_EXTI_WriteReg(IMR2, 0x0000001FU); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(116) : LL_EXTI_WriteReg(EMR2, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(118) : LL_EXTI_WriteReg(RTSR2, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(120) : LL_EXTI_WriteReg(FTSR2, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(122) : LL_EXTI_WriteReg(SWIER2, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(124) : LL_EXTI_WriteReg(RPR2, 0x00000004U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(125) : LL_EXTI_WriteReg(FPR2, 0x00000004U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(128) : LL_EXTI_WriteReg(IMR2, 0x00000010U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_exti.c(130) : LL_EXTI_WriteReg(EMR2, 0x00000000U); C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_usart.h(183) : * @brief Flags defines which can be used with LL_USART_WriteReg function C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_usart.h(242) : * @brief IT defines which can be used with LL_USART_ReadReg and LL_USART_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_usart.h(539) : #define LL_USART_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_ucpd.h(120) : * @brief IT defines which can be used with LL_UCPD_ReadReg and LL_UCPD_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_ucpd.h(311) : #define LL_UCPD_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG((__INSTANCE__)->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_tim.h(629) : * @brief IT defines which can be used with LL_TIM_ReadReg and LL_TIM_WriteReg functions. C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_tim.h(1438) : #define LL_TIM_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG((__INSTANCE__)->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_rcc.h(130) : * @brief Flags defines which can be used with LL_RCC_WriteReg function C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_rcc.h(173) : * @brief IT defines which can be used with LL_RCC_ReadReg and LL_RCC_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_rcc.h(815) : #define LL_RCC_WriteReg(__REG__, __VALUE__) WRITE_REG((RCC->__REG__), (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_pwr.h(54) : * @brief Flags defines which can be used with LL_PWR_WriteReg function C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_pwr.h(235) : #define LL_PWR_WriteReg(__REG__, __VALUE__) WRITE_REG(PWR->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_lpuart.h(153) : * @brief Flags defines which can be used with LL_LPUART_WriteReg function C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_lpuart.h(199) : * @brief IT defines which can be used with LL_LPUART_ReadReg and LL_LPUART_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_lpuart.h(431) : #define LL_LPUART_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_gpio.h(227) : #define LL_GPIO_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_exti.h(267) : #define LL_EXTI_WriteReg(__REG__, __VALUE__) WRITE_REG(EXTI->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_dmamux.h(62) : * @brief Flags defines which can be used with LL_DMAMUX_WriteReg function C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_dmamux.h(122) : * @brief IT defines which can be used with LL_DMA_ReadReg and LL_DMAMUX_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_dmamux.h(413) : #define LL_DMAMUX_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_dma.h(165) : * @brief Flags defines which can be used with LL_DMA_WriteReg function C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_dma.h(245) : * @brief IT defines which can be used with LL_DMA_ReadReg and LL_DMA_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_dma.h(363) : #define LL_DMA_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_adc.h(484) : * @brief IT defines which can be used with LL_ADC_ReadReg and LL_ADC_WriteReg functions C:\Users\mma\Desktop\test\Drivers\STM32G0xx_HAL_Driver\Inc\stm32g0xx_ll_adc.h(1176) : #define LL_ADC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) C:\Users\mma\Desktop\test\Drivers\BSP\X-NUCLEO-DRP1M1\drp1m1_usbpd_pwr.c(1830) : TCPP0203IOCtx.WriteReg = BSP_I2C_WriteReg; C:\Users\mma\Desktop\test\Drivers\BSP\X-NUCLEO-DRP1M1\drp1m1_bus.h(86) : int32_t BSP_I2C_WriteReg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length); C:\Users\mma\Desktop\test\Drivers\BSP\X-NUCLEO-DRP1M1\drp1m1_bus.h(88) : int32_t BSP_I2C_WriteReg16(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length); C:\Users\mma\Desktop\test\Drivers\BSP\X-NUCLEO-DRP1M1\drp1m1_bus.c(345) : int32_t BSP_I2C_WriteReg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) C:\Users\mma\Desktop\test\Drivers\BSP\X-NUCLEO-DRP1M1\drp1m1_bus.c(409) : int32_t BSP_I2C_WriteReg16(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203_reg.h(68) : TCPP0203_Write_Func WriteReg; C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203_reg.c(59) : return ctx->WriteReg(ctx->handle, reg, data, length); C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.h(48) : typedef int32_t (*TCPP0203_WriteReg_Func)(uint16_t, uint16_t, uint8_t *, uint16_t); C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.h(56) : TCPP0203_WriteReg_Func WriteReg; C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.c(112) : static int32_t TCPP0203_WriteRegWrap(const void *handle, uint8_t Reg, uint8_t *Data, uint8_t Length); C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.c(146) : pObj->IO.WriteReg = pIO->WriteReg; C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.c(151) : pObj->Ctx.WriteReg = TCPP0203_WriteRegWrap; C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.c(795) : static int32_t TCPP0203_WriteRegWrap(const void *handle, uint8_t Reg, uint8_t *pData, uint8_t Length) C:\Users\mma\Desktop\test\Drivers\BSP\Components\tcpp0203\tcpp0203.c(803) : return pObj->IO.WriteReg(pObj->IO.Address, Reg, pData, Length); Lines matched: 94 Files matched: 22 Total files searched: 159 这些都是关于WriteReg的,我是不是可以自己写关于 STUSB1602来开启VCONN
最新发布
08-06
<think>我们正在讨论如何为STUSB1602芯片实现一个WriteReg函数,以便通过I2C接口写入寄存器,从而控制VCONN的启用。STUSB1602是一款USB Type-C端口控制器,通常通过I2C接口进行配置。 根据用户的问题,他们可能已经知道如何通过BSP_USBPD_PWR_VCONNOn函数来启用VCONN,但该函数可能是弱定义且未实现,因此需要自己编写底层寄存器操作。 步骤: 1. 确认硬件连接:STUSB1602的I2C接口连接到STM32的哪个I2C外设,以及设备地址。 2. 初始化I2C外设。 3. 实现WriteReg函数,通过I2C向STUSB1602的指定寄存器写入数据。 注意:STUSB1602的寄存器地址是8位的,数据也是8位。通常,I2C写操作包括: - 发送起始条件 - 发送设备地址(写模式,即最低位为0- 发送寄存器地址 - 发送要写入的数据 - 发送停止条件 假设STUSB1602的I2C设备地址为0x28(7位地址,因此写地址为0x50)。实际地址可能由芯片的ADDR引脚决定,请参考数据手册。 下面是一个可能的WriteReg函数实现,使用STM32 HAL: ```c /** * @brief 向STUSB1602写入一个寄存器 * @param DevAddr: 设备地址(7位地址,即0x28,但HAL要求左移一位,所以实际传入0x50) * @param RegAddr: 寄存器地址 * @param Value: 要写入的值 * @retval HAL状态 */ HAL_StatusTypeDef STUSB1602_WriteReg(uint8_t DevAddr, uint8_t RegAddr, uint8_t Value) { // 使用I2C句柄,假设为hi2c1 return HAL_I2C_Mem_Write(&hi2c1, DevAddr, RegAddr, I2C_MEMADD_SIZE_8BIT, &Value, 1, HAL_MAX_DELAY); } ``` 但是,请注意: - 设备地址:STUSB1602的7位地址是0x28(ADDR引脚接地)或0x29(ADDR接上拉电阻)。在HAL中,我们需要将7位地址左移一位,因此0x28变为0x50(写地址),0x29变为0x52。 - 函数HAL_I2C_Mem_Write的参数说明: * hi2c: I2C句柄 * DevAddr: 设备地址(7位地址左移一位,即包含读写位,所以写地址是(0x28<<1)) * MemAddress: 寄存器地址 * MemAddSize: 寄存器地址大小,这里为8位,使用I2C_MEMADD_SIZE_8BIT * pData: 指向要写入数据的指针 * Size: 数据大小(字节数),这里为1 * Timeout: 超时时间 因此,调用示例: ```c #define STUSB1602_ADDR (0x28 << 1) // 假设ADDR引脚接地,则7位地址为0x28,左移一位得到0x50 // 启用VCONN,需要设置STUSB1602的VCONN控制寄存器(具体寄存器地址需查阅数据手册) // 假设VCONN控制寄存器地址为0x0E,并且要使能CC1上的VCONN,则设置对应位(具体位定义请参考手册) uint8_t regValue = 0x01; // 例如,设置第0位为1表示启用CC1的VCONN(这里仅为示例,具体位需参考手册) STUSB1602_WriteReg(STUSB1602_ADDR, 0x0E, regValue); ``` 关键点:需要查阅STUSB1602的数据手册,找到控制VCONN的寄存器。通常,VCONN的控制在配置寄存器(Configuration Registers)中。 根据STUSB1602数据手册(如文档UM2552或芯片手册),VCONN的控制在寄存器“VCONN_CTRL_1”(地址0x0E)和“VCONN_CTRL_2”(地址0x0F)。例如,在0x0E寄存器中,位[1:0]用于选择VCONN源(CC1或CC2)以及使能状态。 具体位定义: - VCONN_CTRL_1 (0x0E) 的位[1:0]:VCONN_SWAP_EN和VCONN_EN。 - 通常,要启用VCONN,需要设置VCONN_EN位(位0)为1,同时通过VCONN_SWAP_EN(位1)选择CC线(0表示CC1,1表示CC2)。但具体请以手册为准。 因此,如果要通过CC1启用VCONN,可以写入0x01(即只使能VCONN,且选择CC1,因为VCONN_SWAP_EN=0);通过CC2启用则写入0x03(VCONN_EN=1且VCONN_SWAP_EN=1)。 所以,在BSP_USBPD_PWR_VCONNOn函数中,我们可以这样实现: ```c int32_t BSP_USBPD_PWR_VCONNOn(uint32_t Instance, uint32_t CCPinId) { // 假设我们使用I2C1,且STUSB1602地址为0x28(左移后0x50) uint8_t regValue = 0; // 根据CCPinId选择要启用的VCONN通道 if (CCPinId == USBPD_PWR_TYPE_C_CC1) { regValue = 0x01; // 启用CC1的VCONN } else if (CCPinId == USBPD_PWR_TYPE_C_CC2) { regValue = 0x03; // 启用CC2的VCONN(注意:这里0x03表示设置VCONN_EN和VCONN_SWAP_EN) } else { return BSP_ERROR_WRONG_PARAM; } // 写入寄存器0x0E(VCONN_CTRL_1) if (HAL_OK != STUSB1602_WriteReg(STUSB1602_ADDR, 0x0E, regValue)) { return BSP_ERROR_PERIPH_FAILURE; } return BSP_ERROR_NONE; } ``` 注意:以上寄存器地址和位定义是基于STUSB1602的典型配置,具体请参考您所使用的版本的数据手册。 另外,在调用写寄存器之前,确保I2C已经初始化,并且STUSB1602已经上电并正确响应。 如果使用ST提供的STUSB1602驱动程序(如果有的话),也可以直接使用其提供的API。 总结步骤: 1. 初始化I2C外设(在STM32CubeMX中配置,并生成代码)。 2. 实现STUSB1602的写寄存器函数(如上)。 3. 在BSP_USBPD_PWR_VCONNOn函数中,根据CC引脚选择写入正确的值到VCONN控制寄存器。 4. 调用BSP_USBPD_PWR_VCONNOn即可启用VCONN。 注意:在启用VCONN之前,确保已经完成了USB PD的初始化和连接检测。 如果遇到问题,可以检查: - I2C线路是否正确(SCL,SDA) - 设备地址是否正确 - 寄存器地址和值是否正确 参考文献: [STUSB1602数据手册](https://www.st.com/resource/en/datasheet/stusb1602.pdf) 第6节寄存器映射。 以上实现基于假设的寄存器地址和位定义,请务必查阅您使用的芯片手册确认。 相关问题: §§相关问题§§ 1. 如何初始化STM32的I2C外设以与STUSB1602通信? 2. STUSB1602的I2C设备地址如何确定? 3. STUSB1602中控制VCONN的寄存器有哪些?</think>### 为 STUSB1602 实现 WriteReg 函数以启用 VCONN STUSB1602 是一款 USB Type-C 端口控制器,需要通过 I2C 接口进行寄存器配置。以下是完整的实现方案: #### 1. **硬件连接确认** - 确保 STUSB1602 的 I2C 接口正确连接到 STM32 的 I2C 外设 - 典型连接: - SDA:STM32 I2C 数据线 - SCL:STM32 I2C 时钟线 - ADDR:接地(0x28)或接 VDD(0x29)决定 I2C 地址 #### 2. **I2C 初始化** 在 STM32CubeMX 中配置 I2C 外设: ```c hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; // 100kHz hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; HAL_I2C_Init(&hi2c1); ``` #### 3. **WriteReg 函数实现** ```c #define STUSB1602_I2C_ADDR 0x28 << 1 // 7位地址左移1位 HAL_StatusTypeDef STUSB1602_WriteReg(I2C_HandleTypeDef *hi2c, uint8_t reg, uint8_t value) { uint8_t data[2] = {reg, value}; return HAL_I2C_Master_Transmit( hi2c, STUSB1602_I2C_ADDR, data, sizeof(data), HAL_MAX_DELAY ); } ``` #### 4. **启用 VCONN 的寄存器配置** 根据 STUSB1602 数据手册: - VCONN 控制寄存器:`0x0E` (VCONN_CTRL_1) - 启用位:bit[0] (VCONN_EN) - CC 选择位:bit[1] (VCONN_SWAP_EN) ```c // 启用 VCONN 的封装函数 int32_t BSP_USBPD_PWR_VCONNOn(uint32_t Instance, uint32_t CCPinId) { uint8_t vconn_ctrl = 0x01; // 默认启用 CC1 if(CCPinId == USBPD_PWR_TYPE_C_CC2) { vconn_ctrl |= 0x02; // 设置 VCONN_SWAP_EN 位 } // 写入寄存器 0x0E if(HAL_OK != STUSB1602_WriteReg(&hi2c1, 0x0E, vconn_ctrl)) { return BSP_ERROR_PERIPH_FAILURE; } return BSP_ERROR_NONE; } ``` #### 5. **关键配置说明** 1. **电源管理**: ```c __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_EnableBkUpAccess(); // 启用备份域访问 ``` 2. **状态检查**: ```c // 检查 VCONN 状态寄存器 (0x0F) uint8_t status; HAL_I2C_Mem_Read(&hi2c1, STUSB1602_I2C_ADDR, 0x0F, I2C_MEMADD_SIZE_8BIT, &status, 1, 100); if(!(status & 0x01)) { // 检查 VCONN_OK 位 // 错误处理 } ``` #### 6. **调试技巧** - 使用逻辑分析仪检查 I2C 波形 - 验证寄存器写入: ```c uint8_t read_back; HAL_I2C_Mem_Read(&hi2c1, STUSB1602_I2C_ADDR, 0x0E, I2C_MEMADD_SIZE_8BIT, &read_back, 1, 100); assert(read_back == vconn_ctrl); ``` > **重要提示**:实际寄存器地址和位定义请参考最新的 [STUSB1602 数据手册](https://www.st.com/resource/en/datasheet/stusb1602.pdf)[^1],不同芯片版本可能有差异。 #### 7. **典型工作流程** ```mermaid graph TD A[检测Type-C连接] --> B{CC引脚状态} B -->|CC1有效| C[设置VCONN_CTRL=0x01] B -->|CC2有效| D[设置VCONN_CTRL=0x03] C --> E[写入寄存器0x0E] D --> E E --> F[检查VCONN_OK状态] F -->|成功| G[VCONN供电] F -->|失败| H[错误处理] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值