CH573 USB 是否有办法分辨USB是否断开

你好,我想知道是否有方法分辨USB连接是否断开。我现在正在使用suspend的事件,但一旦遇到需要远程唤醒的时候,suspend和断开这两种事件就无法分开了。想请问一下是否有什么方法可以分辨这两种情况?


还有就是我这边正在尝试将蓝牙低功耗模式和USB一起使用,具体的方案是在检测到USB断开后就进入低功耗模式,而连接上后重新启用USB并不再进入低功耗模式。我现在使用的代码片段如下,这段代码在部分设备上可以正常工作而部分设备上无法正确识别USB设备,想请问一下代码逻辑是否正确?

static void before_lowpower()
{
    // Disable USB
    R8_UDEV_CTRL = 0;
    R8_USB_CTRL = 0;

    // 监听USB GPIO状态,如果接入则唤醒设备
    GPIO_ConfBit(USB_PIN, GPIO_ModeIN_PU);
    GPIO_ItBit(USB_PIN, GPIO_ITMode_FallEdge);
}

static void after_lowpower()
{
    // 检查USB是否接入,如果接入则尝试重新初始化USB
    if (!GPIO_ReadBit(USB_PIN)) {
        // Reset USB SIE
        R8_USB_CTRL |= RB_UC_RESET_SIE | RB_UC_CLR_ALL;
        R8_USB_CTRL &= ~(RB_UC_RESET_SIE | RB_UC_CLR_ALL);

        USB_DeviceInit();
    }
}
/**
 * @brief 处理LowPower事件
 * 
 * @param time 
 * @return uint32_t 
 */
uint32_t LowPowerHandler(uint32_t time)
{
    // 在USB工作的情况下,不能进入芯片的睡眠模式
    if (!usb_is_connected) {
        before_lowpower();
        uint32_t fail = CH57X_LowPower(time);
        // 睡眠后由于掉电,部分外设需要重新初始化。
        after_lowpower();
        return fail;
    }
    // 没有睡眠,ref: http://www.wch.cn/bbs/thread-73139-1.html
    return 1;
}


这个通过usb的状态寄存器是区分不了的。想要区分只能另外想办法,比如用io检测物理连接是否断开,比如检测usb口的vcc或者usb口是否接地,来进行辅助判断。


那么低功耗模式后恢复USB操作的方法是否正确呢?


执行逻辑没问题,不过函数参数有问题

image.png

睡眠模式后要加延时,等时钟稳定

image.png

image.png

image.png


你好,我这边尝试在睡眠模式后增加了延时,修改了LowPower_Sleep调用参数,如下:

uint32_t CH57X_LowPower(uint32_t time)
{
    // 前面省略...
    if (!RTCTigFlag) {
        LowPower_Sleep(RB_PWR_RAM2K | RB_PWR_RAM16K | RB_PWR_EXTEND);
#if (defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE)
        PWR_DCDCCfg(ENABLE);
#endif
        time += WAKE_UP_RTC_MAX_TIME;
        if (time > 0xA8C00000)
            time -= 0xA8C00000;
        RTC_SetTignTime(time);
        LowPower_Idle();
        HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
    } else {
        return 3;
    }
}
static void after_lowpower()
{
    // 检查USB是否接入,如果接入则尝试重新初始化USB
    if (!GPIO_ReadBit(USB_PIN)) {
        mDelaymS(5);
        
        // Reset USB SIE
        R8_USB_CTRL |= RB_UC_RESET_SIE | RB_UC_CLR_ALL;
        R8_USB_CTRL &= ~(RB_UC_RESET_SIE | RB_UC_CLR_ALL);
 
        USB_DeviceInit();
    }
}

但还是一样,在同一批芯片的部分设备上可以使用而部分设备上不行。抓包观察发现USB主机的Setup请求后没有ACK,抓包文件附上


icon_rar.gifDSLogic-la-210825-164741.zip



只有登录才能回复,可以选择微信账号登录