找回密码
 立即注册
查看: 1045|回复: 9

关于STC8H8K64U的USB主动挂起

[复制链接]

该用户从未签到

3

主题

6

回帖

92

积分

注册会员

积分
92
发表于 2023-11-14 19:37:52 | 显示全部楼层 |阅读模式
     有个设备需要USB通讯,但20秒内无按键时需要进入低功耗状态。在仅使用USB充电器供电时(未有D+、D-通讯线),设备可以进入掉电功耗状态,LED灯不闪烁,测量功率为uA级别;但设备接电脑USB口供电时,设备无法进入低功耗状态(设备有进入低功耗状态,LCD背光都灭了),LED运行灯一直闪烁,应该是USB一直有握手,处于未挂起状态,该如何让设备主动挂起呢?

     然后我模拟了充电器供电状态,把USB的D+和D-线接到继电器,设备休眠时断开D+和D-线,发现USB任然无法进入挂起状态,工作LED灯闪,但是HID设备已被电脑弹出了。我按键后,设备正常工作,电脑同时也识别到了HID设备。依据USB协议,USB Full Speed设备3ms内没接收到握手帧就应该进入挂起的,搞不清楚这个工作机制。
     有没高手指点下,先感谢。
回复 送花

使用道具 举报

  • TA的每日心情
    开心
    7 天前
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    16

    主题

    711

    回帖

    2528

    积分

    超级版主

    积分
    2528
    发表于 2023-11-14 20:02:52 | 显示全部楼层
    USB的挂起模式之前确实没有使用过
    明天先研究一下,后续有进展再一起讨论
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    7 天前
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    16

    主题

    711

    回帖

    2528

    积分

    超级版主

    积分
    2528
    发表于 2023-11-16 11:51:11 | 显示全部楼层
    抱歉,昨天有点忙,今天才得空研究了一下

    首先说结论:
    STC8H8K64U/STC32G12K128的USB模块都支持主动挂起被动挂起/如USB电脑主机进入休眠

    下面分别进行说明

    主动挂起:
    所谓主动挂起,是指USB主机一直保持和USB设备的连接,但USB设备由于自身原因,需要挂起USB进入STOP模式

    需要主动挂起USB,最重要的设置是:当满足需要挂起条件时(比如20秒没有按键),
    在进入STOP模式前,一定要先关闭USB功能

    测试代码需进行如下设置:
    1、初始化定时器,定时器产生100ms中断
    截图202311161100407080.jpg

    2、使能INT0(P3.2口)中断,按键功能,同时用于唤醒CPU
    截图202311161101302624.jpg

    3、进入STOP模式前和唤醒后的必要设置
    截图202311161220239679.jpg



    被动挂起,如电脑进入休眠时USB电脑主机休眠
    所谓被动挂起,是指USB主机进入休眠时,强制USB设备进入SUSPEND状态,再设置CPU进入STOP模式

    要使能设备被动挂起,首先程序中必须使能USB的挂起检测功能,同时还需要处理USB的挂起中断
    另外还有重要的一点,如果需要使用USB的RESUME信号唤醒CPU,必须借助P3.0口的INT4中断才能实现
    因为进入STOP模式后,USB模块的时钟会停止,此时如果USB总线上产生了RESUME信号,没有时钟的
    USB模块无法解析此信号,这里就必须借助D-(P3.0)口上的INT4的下降沿中断来实现唤醒CPU

    测试代码需进行如下设置:

    1、定义一个被动挂起标志位
    截图202311161123417658.jpg

    2、使能挂起中断,以及使能USB挂起信号检测功能
    截图202311161125067617.jpg

    3、在USB复位中断中需要重新使能挂起中断,以及使能USB挂起信号检测功能
    截图202311161127003746.jpg

    4、在USB恢复中断和USB挂起中断中设置/清除挂起标志位
    截图202311161134582823.jpg

    5、检测到需要被动挂起进入STOP时,需要使能INT4中断
    截图202311161136342783.jpg


    下面是测试代码,请参考!(注:上面的图片是从STC32G系列代码中抓取的)




    stc_usb_hid_sus(STC8H8K64U).zip

    292.59 KB, 下载次数: 22

    stc_usb_hid_sus(STC32G12K128).zip

    84.7 KB, 下载次数: 18

    点评

    我想获取主机是否睡眠的状态,测试被动挂起的“在USB复位中断中需要重新使能挂起中断,以及使能USB挂起信号检测功能”功能好用,我想知道的是挂起中断和挂起信号检测为何会在此时(void usb_reset())与初始化值不同  详情 回复 发表于 2024-2-12 21:59
    回复 支持 1 反对 0 送花

    使用道具 举报

    该用户从未签到

    3

    主题

    6

    回帖

    92

    积分

    注册会员

    积分
    92
     楼主| 发表于 2023-11-16 22:49:29 | 显示全部楼层
    感谢版主的解答,在STC8H8K64U代码上做了测试,没有问题了。通过这次USB的调试,对USB的理解更深刻了,本来打算如果无法满足客户的要求,就要换个MCU来解决的,后续一如既往的支持STC,再次感谢。

    点评

    感谢信任,一起前行  详情 回复 发表于 2023-11-16 22:51
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9328

    回帖

    1万

    积分

    管理员

    积分
    13928
    发表于 2023-11-16 22:51:03 | 显示全部楼层
    古人来者_昌 发表于 2023-11-16 22:49
    感谢版主的解答,在STC8H8K64U代码上做了测试,没有问题了。通过这次USB的调试,对USB的理解更深刻了,本来 ...

    感谢信任,一起前行
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-4-26 08:20
  • 签到天数: 69 天

    [LV.6]常住居民II

    1

    主题

    63

    回帖

    300

    积分

    中级会员

    积分
    300
    发表于 2023-12-1 09:45:26 | 显示全部楼层
    USB挂起,是进入芯片休眠了吗? 还是说只是USB功能处于休眠状态,其他功能都是正常工作的呀?

    点评

    USB HID 键盘正常工作时是中断传输的,主机会在一定时间(由描述符确定)之内查询设备是否有数据需要传输,示波器也能看到一直有信号,挂起后就不再查询了,示波器看也没有信号了,USB功能处于休眠状态,而芯片休眠  详情 回复 发表于 2024-2-12 22:15
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    3

    主题

    6

    回帖

    92

    积分

    注册会员

    积分
    92
     楼主| 发表于 2023-12-2 15:30:41 | 显示全部楼层
    USB进入休眠状态,同时芯片也处于省电模式状态。如果USB不进入休眠,芯片是无法进入省电模式。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-30 00:51
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    0

    主题

    44

    回帖

    138

    积分

    注册会员

    积分
    138
    发表于 2023-12-11 09:57:20 来自手机 | 显示全部楼层
    👍
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 10:35
  • 签到天数: 112 天

    [LV.6]常住居民II

    25

    主题

    304

    回帖

    1037

    积分

    荣誉版主

    Cyber Hamster

    积分
    1037
    发表于 2024-2-12 21:59:24 | 显示全部楼层
    zhp 发表于 2023-11-16 11:51
    抱歉,昨天有点忙,今天才得空研究了一下

    首先说结论:

    我想获取主机是否睡眠的状态,测试被动挂起的“在USB复位中断中需要重新使能挂起中断,以及使能USB挂起信号检测功能”功能好用,我想知道的是挂起中断和挂起信号检测为何会在此时(void usb_reset())与初始化值不同,它们是何时被修改的,看了几遍手册没能发现硬件修改它们的机制。
    (=・ω・=)
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 10:35
  • 签到天数: 112 天

    [LV.6]常住居民II

    25

    主题

    304

    回帖

    1037

    积分

    荣誉版主

    Cyber Hamster

    积分
    1037
    发表于 2024-2-12 22:15:16 | 显示全部楼层
    有你才恋家 发表于 2023-12-1 09:45
    USB挂起,是进入芯片休眠了吗? 还是说只是USB功能处于休眠状态,其他功能都是正常工作的呀? ...

    USB HID 键盘正常工作时是中断传输的,主机会在一定时间(由描述符确定)之内查询设备是否有数据需要传输,示波器也能看到一直有信号,挂起后就不再查询了,示波器看也没有信号了,USB功能处于休眠状态,而芯片休眠指单片机CPU不再工作,进入低功耗状态,USB设备一般通过USB线供电,非电池供电的可移动设备,对功耗不敏感,单片机进入低功耗状态是可选的,一般的应用是单片机识别电脑是否睡眠,电脑睡眠,主机会挂起USB总线,比如电脑正常工作,单片机接的LED是流水灯,电脑睡眠,流水灯变成呼吸灯,由于呼吸灯需要由单片机控制,此时单片机就不能进入低功耗模式了
    (=・ω・=)
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-6 00:42 , Processed in 0.084296 second(s), 69 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表