Zephyr OS下树莓派Pico同时启用CDC-ACM UART与I2C故障求助
在Zephyr OS环境下为树莓派Pico启用CDC-ACM USB虚拟串口与I2C功能,尝试将BME680传感器数据通过虚拟串口输出到终端。单独启用USB虚拟串口时功能正常,但添加I2C0配置后虚拟串口失效。
使用的设备树overlay代码:
/ { chosen { zephyr,console = &usb_cdc; }; }; &zephyr_udc0 { usb_cdc: usb_cdc_0 { compatible = "zephyr,cdc-acm-uart"; }; }; &i2c0 { status = "okay"; bme680: bme680@77 { compatible = "bosch,bme680"; label = "BME680"; reg = <0x77>; }; };
对应的.conf配置文件:
# Enable USB stack CONFIG_USB_DEVICE_STACK=y # Enable USB Initialize at boot CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=y # USB device descriptors CONFIG_USB_DEVICE_VID=0x2e8a CONFIG_USB_DEVICE_PID=0x000a CONFIG_USB_DEVICE_PRODUCT="Pico" CONFIG_USB_DEVICE_MANUFACTURER="Raspberry Pi" # Set to "n" for bus-powered devices (powered from the USB host) like the Raspberry Pi Pico. # Set to "y" for self-powered devices (powered from an external power supply) like PicoDRO hardware. CONFIG_USB_SELF_POWERED=n CONFIG_I2C=y CONFIG_SENSOR=y
以下是可能的问题点及对应解决方案:
缺失CDC-ACM核心配置
你的.conf文件未启用CDC-USB虚拟串口的核心配置项CONFIG_USB_CDC_ACM=y,仅开启USB_DEVICE_STACK不足以驱动CDC-ACM功能。单独测试时可能误启用了硬件UART而非USB CDC,添加I2C配置后系统初始化流程变化,暴露了这一配置缺失。需在.conf中添加该配置项。传感器初始化阻塞系统
如果BME680硬件接线错误(如I2C引脚接反、地址不匹配、传感器未供电),系统启动时会持续尝试初始化传感器,导致USB CDC的初始化流程被阻塞。可以先注释掉设备树中的bme680节点,仅保留&i2c0 { status = "okay"; };,验证USB CDC是否恢复正常,以此确认是否为传感器初始化导致的问题。设备树节点配置优化
为USB CDC节点补充必要属性,确保与Zephyr驱动正确绑定,可添加current-speed属性明确串口波特率:&zephyr_udc0 { usb_cdc: usb_cdc_0 { compatible = "zephyr,cdc-acm-uart"; current-speed = <115200>; }; };引脚冲突排查
树莓派Pico的I2C0默认引脚为GPIO4(SDA)、GPIO5(SCL),USB CDC使用GPIO24(D-)、GPIO25(D+),理论上无硬件引脚冲突。若你自定义了I2C引脚,需核对设备树中是否配置了正确的pinctrl节点,避免与USB引脚交叉占用。
修正后的.conf文件
# Enable USB stack CONFIG_USB_DEVICE_STACK=y # Enable CDC-ACM core functionality CONFIG_USB_CDC_ACM=y # Enable USB Initialize at boot CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=y # USB device descriptors CONFIG_USB_DEVICE_VID=0x2e8a CONFIG_USB_DEVICE_PID=0x000a CONFIG_USB_DEVICE_PRODUCT="Pico" CONFIG_USB_DEVICE_MANUFACTURER="Raspberry Pi" CONFIG_USB_SELF_POWERED=n CONFIG_I2C=y CONFIG_SENSOR=y
修正后的设备树overlay
/ { chosen { zephyr,console = &usb_cdc; }; }; &zephyr_udc0 { usb_cdc: usb_cdc_0 { compatible = "zephyr,cdc-acm-uart"; current-speed = <115200>; }; }; &i2c0 { status = "okay"; /* 先注释传感器节点验证USB功能,确认正常后再恢复 */ /* bme680: bme680@77 { compatible = "bosch,bme680"; label = "BME680"; reg = <0x77>; }; */ };
内容的提问来源于stack exchange,提问作者e0ne199

