[单片机][at32][填坑日记] [USB卡包] usb快速发包导致卡包(二)

发布者:来来去去来来最新更新时间:2022-09-26 来源: csdn关键字:单片机 手机看文章 扫描二维码
随时随地手机看文章

一、usb避免卡包全流程解释


上电初始化USB外设

// 针对带电池和不带电池的操作  不带电池则上电初始化,带电池则检测到USB_5V则初始化

#if BS_POWER_SWITCH

    static uint8_t bat_soc_tick = 0;

    if (get_sys_state() == SYS_STATE_POWER_ON)

    {

        main_send_signal(SIGNAL_SYS_POWER_ON);

    }

#else

    main_send_signal(SIGNAL_REFRESH_USB);

#endif

        

        

        if (event.value.signals & SIGNAL_REFRESH_USB)

        {

            // USB拔出时,清除当前USB消息队列

            if (!get_usb_state())

            {

                biz_usb_queue_init();

#if BS_POWER_SWITCH

                bat_soc_tick = 0;

#endif

            }

            else

            {

                os_delay(100);

                usb_init();

                // 激活USB_DP让PC重新枚举

                bsp_gpio_set_pin(BOARD_USB_DP_PORT, BOARD_USB_DP_PIN, BOARD_USB_DP_PRESS_LEVEL);

                // 判断是否需要开机

                if(get_sys_state() != SYS_STATE_POWER_ON)

                {

                    main_send_signal(SIGNAL_SYS_POWER_ON);

                }

#if BS_POWER_SWITCH

                bat_soc_tick = 0;

#endif

            }

            if (!get_usb_state() && !get_usb_device_status())

            {

                LOG_D(" [USB] usb_deinit!!!rn");

                bsp_gpio_set_pin(BOARD_USB_DP_PORT, BOARD_USB_DP_PIN, !BOARD_USB_DP_PRESS_LEVEL);

                usb_deinit();

#if !BS_POWER_SWITCH

                g_sys_run_times = 0;

#endif

            }


延时800ms再发送USB数据(通道0无视)

每包数据需要有时间间隔

main检测到空闲3ms-5ms,且USB_FIFO存在异常。则主动推送FIFO数据。(USB中断未能及时响应,则会造成FIFO数据无法发送)

/**

  * @brief  线程空闲处理函数

  */

static void idle_state_handle(void)

{

    static uint16_t g_usb_send_delay_tick = 1;     // 用于延时发送usb数据 (因为太快导致usb只能发送第一条)

    static uint16_t g_free_tick = 1;


    usb_state_changes_callback();

    if(g_sys_run_times == 10 && get_usb_state() == false)

    {

        set_usb_state(true);

        main_send_signal(SIGNAL_REFRESH_USB);

    }


    if (g_sys_run_times < 8)

    {

        return;

    }

    if (g_sys_run_times == 9)

    {

        biz_usb_queue_init();

        g_sys_run_times ++;

        g_key_trigger_flag = false;

        g_combined_key_val = 0;

        return;

    }

    g_free_tick++;

    g_usb_send_delay_tick++;

    if (g_free_tick % 10000 == 0 &&  g_free_tick != 0)

    {

        // 判断usb fifo是否卡包

        get_usb_fifo_state();

    }

    // 这边把按键和手写数据错开,防止出现黏包问题

    if (g_usb_send_delay_tick % 1600 == 0 && g_key_trigger_flag)

    {

        g_free_tick = 0;

        g_key_trigger_flag = false;

        biz_prot_hwic_usb_send_key_data(g_combined_key_val);

        sys_time_reset();

    }


    if (g_usb_send_delay_tick % 2200 == 0)

    {

        if (get_usb_device_status())

        {

            // 发送USB信息(将USB消息队列的内容,依次发送)

            if (biz_usb_data_dispose())

            {

                LOG_D(" [USB] send ok!!!rn");

                g_free_tick = 0;

                return;

            }

        }

        if (g_free_tick > 3000 && flash_write_sys_cfg())

        {

            return;

        }

        if (g_free_tick > 50000)

        {

            sys_sleep();

        }

    }

}


文件目录

在这里插入图片描述

文件下载:https://download.csdn.net/download/qq_29246181/63248624

关键字:单片机 引用地址:[单片机][at32][填坑日记] [USB卡包] usb快速发包导致卡包(二)

上一篇:[单片机框架][bsp层][AT32F415][bsp_gpio] GPIO配置和使用
下一篇:[单片机][at32][填坑日记] [USB卡包] usb快速发包导致卡包

推荐阅读最新更新时间:2024-10-26 00:14

[单片机][at32][填坑日记] [USB] usb上电过程中快速发包导致
现象:pc重启过程中,不断发送按键数据,导致pc未能应答,致使下位机数据出现卡包现象。 MCU发送’B’,PC显示’C’,MCU发送’E’,PC显示’B’ 原因造成如下: 串口外设优先级大于USB中断(USBOTG_IRQn),导致串口数据打断USB,致使PC或MCU丢包。 当PC请求usb设备描述符字符串时,USB的其他通道不能发送数据,不然会导致通道0数据异常,导致PC丢包。 系统只会请求字符串0-2,所以在此设置标志位即可。 USB整个发送逻辑 // 此处解决PC开机过程中usb数据卡包问题。因为当pc请求字符串时,其他通道的数据发送会导致异常。 if (get_usb_string_b
[单片机]
[<font color='red'>单片机</font>][<font color='red'>at32</font>][填坑日记] [<font color='red'>USB</font><font color='red'>卡</font><font color='red'>包</font>] <font color='red'>usb</font>上电过程中快速发包导致<font color='red'>卡</font><font color='red'>包</font>
[单片机][at32][填坑日记] [USB] usb快速发包导致
发送频率过快,导致pc或mcu未能及时应答每一包,造成缓存区遗留上一次数据。 usb频发拔插枚举,导致pc/mcu数据丢失,①mcu丢失数据,每次发送都只能发送上次内容。②pc丢失数据,每次接收只会处理上次内容。 重启电脑过程中,mcu频繁发送usb数据,导致pc端丢失应答数据,PC端卡包(缺一包应答),只能处理上次数据, 现象:按键数据一直发送,且无释放按键数据。 解决方案如下: 1. usb_dcd_int.c -- USB_device_handle_UsbReset_intsts() /** * @brief USB_device_handle_UsbReset_intsts * This interr
[单片机]
[<font color='red'>单片机</font>][<font color='red'>at32</font>][填坑日记] [<font color='red'>USB</font><font color='red'>卡</font><font color='red'>包</font>] <font color='red'>usb</font>快速发包导致<font color='red'>卡</font><font color='red'>包</font>
[单片机][at32][填坑日记] [USB] usb快速发包导致(二)
一、usb避免卡包全流程解释 上电初始化USB外设 // 针对带电池和不带电池的操作 不带电池则上电初始化,带电池则检测到USB_5V则初始化 #if BS_POWER_SWITCH static uint8_t bat_soc_tick = 0; if (get_sys_state() == SYS_STATE_POWER_ON) { main_send_signal(SIGNAL_SYS_POWER_ON); } #else main_send_signal(SIGNAL_REFRESH_USB); #endif if (event.value.signals & S
[单片机]
[<font color='red'>单片机</font>][<font color='red'>at32</font>][填坑日记] [<font color='red'>USB</font><font color='red'>卡</font><font color='red'>包</font>] <font color='red'>usb</font>快速发包导致<font color='red'>卡</font><font color='red'>包</font>(二)
基于雅特力AT32 MCU的多功能一体机应用方案
过去商务办公成立必不可少的四机设备,复印机、打印机、扫描机和传真机等,为缩短人力作业时间,提升工作效率,各种办公设备也逐步推出更符合人性化需求,多功能一体机也是其中一大变革之一。 多功能一体机主要是将打印、复印、扫描和传真等不同用途的机器整合为一机,并结合联网功能 。随着设备功能越多,信息安全及隐私外泄风险增加,微控制器作为一个可编程的集成电路芯片,具有处理和控制功能,能够执行复杂的指令集,管理各功能模块间通信和协同工作,以确保整个系统的高效稳定和安全运作。 雅特力高效能AT32F435/F437系列MCU具有高效数据处理能力, 以ARM® Cortex®-M4为内核,最高主频288MHz,支持最高4032KB Flash和高
[家用电子]
基于雅特力<font color='red'>AT32</font> <font color='red'>MCU</font>的多功能一体机应用方案
雅特力携高效能AT32 MCU亮相ICCAD 2020
2020年12月10日-11日,中国集成电路设计业2020年会暨重庆集成电路产业创新发展高峰论坛(ICCAD 2020)在重庆悦来国际会议中心隆重召开。雅特力作为重庆本土企业,携高效能AT32 MCU,包括AT32F403, AT32F413, AT32F415, AT32F403A,AT32F407, AT32F421等6大系列MCU产品,及多款终端应用产品和解决方案亮相此次高峰论坛,获得了业界人士、广大客户及众多媒体的广泛关注。 在同期举办的IP 与 IC 设计专题论坛上,雅特力业务处长陈佳延分享了题为“雅特力科技-国产高效能Cortex-M4 MCU的创新领导者”的
[嵌入式]
雅特力携高效能<font color='red'>AT32</font> <font color='red'>MCU</font>亮相ICCAD 2020
雅特力在车用电子领域再度突破,AT32 MCU大量应用于ADAS环视系统
随着城市化进程的迅猛发展,人民生活水平的日益提高,城市机动车数量飞速增长,道路交通安全问题也日益突出,这里面有很多时候是由于驾驶人员的安全意识、违规驾驶、路况、疲劳驾驶等原因,这种情况下如果有产品能够提醒驾驶员,则有助于降低交通事故发生的概率。 安全驾驶时代, ADAS 先火。ADAS(Advanced Driver Assistance Systems)是利用传感器收集车辆周围数据,进行物体的辨识、侦测与追踪等,能够让驾驶者在最快时间察觉潜在危险,提高安全性的主动安全技术。作为汽车从传统功能车向智能车升级的一项过渡技术, ADAS 近两年开始在量产车上广泛搭载,成为越来越多新车的“标配”。 企业供图,下同
[汽车电子]
雅特力在车用电子领域再度突破,<font color='red'>AT32</font> <font color='red'>MCU</font>大量应用于ADAS环视系统
雅特力AT32 MCU为ADAS汽车环视系统性能带来大幅提升
随着城市化进程的迅猛发展,人民生活水平的日益提高,城市机动车数量飞速增长,道路交通安全问题也日益突出,这里面有很多时候是由于驾驶人员的安全意识、违规驾驶、路况、疲劳驾驶等原因,这种情况下如果有产品能够提醒驾驶员,则有助于降低交通事故发生的概率。 安全驾驶时代,ADAS先火。ADAS(Advanced Driver Assistance Systems)是利用传感器收集车辆周围数据,进行物体的辨识、侦测与追踪等,能够让驾驶者在最快时间察觉潜在危险,提高安全性的主动安全技术。作为汽车从传统功能车向智能车升级的一项过渡技术,ADAS近两年开始在量产车上广泛搭载,成为越来越多新车的“标配”。
[嵌入式]
雅特力<font color='red'>AT32</font> <font color='red'>MCU</font>为ADAS汽车环视系统性能带来大幅提升
PIC单片机USB MSC的应用:用 MMC/SD 作为储存设备进行读写
单片机的USB接口,通常用法, 1)HID 是Human Interface Device的缩写,由其名称可以了解HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。 2)CDC 虚拟串口,可与PC机直接联机通讯,如同RS232。 3)USB MSC (Mass Storage class) MSC是一种计算机和移动设备之间的传输协议,它允许一个通用串行总线(USB)设备来访问主机的计算设备,使两者之间进行文件传输。设备包括:移动硬盘,移动光驱,U盘,SD、TF等储存卡读卡器,数码相机,手机等等。 .......... 注意: 每
[单片机]
PIC<font color='red'>单片机</font><font color='red'>USB</font> MSC的应用:用 MMC/SD <font color='red'>卡</font>作为储存设备进行读写
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved