查看: 5476|回复: 13

[其他] USB CDC的发送部分

[复制链接]

该用户从未签到

57

主题

531

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1356
最后登录
2016-12-5
发表于 2016-10-8 09:06:30 | 显示全部楼层 |阅读模式
请问有用过K22或者K64系列芯片的大神吗?
小弟先用USB CDC类的虚拟串口,但是在发送数据的时候,想监测一下USB端口的寄存器是不是把数据发送完,
即发送完了在转存下一帧数据给Sendbuf []。不然如果之前的数据没发送完就放新的数据进去,会导致丢帧。
但是找不到相关的可查询的寄存器,或者相关的其他地方。
请论坛内的大神指点一下
我知道答案 目前已有13人回答
回复

使用道具 举报

该用户从未签到

57

主题

531

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1356
最后登录
2016-12-5
 楼主| 发表于 2016-10-8 09:07:46 | 显示全部楼层
有没有咱们这套芯片的USB相关的寄存器的资料呢?
回复 支持 反对

使用道具 举报

该用户从未签到

17

主题

32

帖子

0

注册会员

Rank: 2

积分
85
最后登录
2018-6-13
发表于 2016-10-8 09:28:47 | 显示全部楼层
帮顶
回复

使用道具 举报

  • TA的每日心情
    开心
    2017-8-1 11:36
  • 签到天数: 96 天

    连续签到: 1 天

    [LV.6]常住居民II

    2

    主题

    670

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1543
    最后登录
    2017-11-16
    发表于 2016-10-8 11:49:47 | 显示全部楼层
    这个没深入搞过,也不是大神。。。
    签到。。。。。。。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    734

    主题

    6393

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    26041
    最后登录
    2025-10-28
    发表于 2016-10-8 13:36:22 | 显示全部楼层
    楼主你好!
    关于这个问题,你可以参考USB stack的做法,比如KSDK2.0-FRDM-K64的USB CDC代码,在代码的发送程序中有相关检测,是否已经发送完成了。
            if (s_sendSize)
            {
                uint32_t size = s_sendSize;
                s_sendSize = 0;

                error = USB_DeviceCdcAcmSend(s_cdcVcom.cdcAcmHandle, USB_CDC_VCOM_BULK_IN_ENDPOINT, s_currSendBuf, size);

                if (error != kStatus_USB_Success)
                {
                    /* Failure to send Data Handling code here */
                }
            }

    DeviceCdcAcmSend 函数,你可以具体debug跟下,看看官方例程的实现方式。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    57

    主题

    531

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1356
    最后登录
    2016-12-5
     楼主| 发表于 2016-10-8 14:09:49 | 显示全部楼层
    小恩GG 发表于 2016-10-8 13:36
    楼主你好!
    关于这个问题,你可以参考USB stack的做法,比如KSDK2.0-FRDM-K64的USB CDC代码,在代码的发送 ...

        uint8_t error;
        uint32_t size = g_send_size;
        if (g_send_size)//串口数据发送
        {
            g_send_size = 0;
           {
                    error = USB_Class_CDC_Send_Data(g_app_handle, DIC_BULK_IN_ENDPOINT,     
                                    g_curr_send_buf, size);
      
    //                if (error != USB_OK)
    //                        {
    //                       sendNum ++ ;
                                    /* Failure to send Data Handling code here */
    //                        }
           }
        }
    我参考的例程和版主你发的这个结构是一样的:但是丢帧的时候 error返回的不是success,发送函数内部过程中丢帧
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    57

    主题

    531

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1356
    最后登录
    2016-12-5
     楼主| 发表于 2016-10-8 14:13:16 | 显示全部楼层
    小恩GG 发表于 2016-10-8 13:36
    楼主你好!
    关于这个问题,你可以参考USB stack的做法,比如KSDK2.0-FRDM-K64的USB CDC代码,在代码的发送 ...

    版主,是不是这样,如果  g_send_size =0的时候,写数据给g_curr_send_buf,但是如果上一帧还没发完,那就会覆盖掉, 我改一下结构,当error=USB_Ok的时候在将g_send_size =0,然后当g_send_size =0的时候,在将数据给g_curr_send_buf,这样试一下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    57

    主题

    531

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1356
    最后登录
    2016-12-5
     楼主| 发表于 2016-10-8 14:35:26 | 显示全部楼层
    小恩GG 发表于 2016-10-8 13:36
    楼主你好!
    关于这个问题,你可以参考USB stack的做法,比如KSDK2.0-FRDM-K64的USB CDC代码,在代码的发送 ...

    版主,这个  static uint32_t g_send_size;
    为什么可以这么用  if(g_send_size) { dosomethingg}  
    那我可以这么用吧  if(0==g_send_size)  {dosomething}
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    734

    主题

    6393

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    26041
    最后登录
    2025-10-28
    发表于 2016-10-8 14:55:52 | 显示全部楼层
    LuoR 发表于 2016-10-8 14:13
    版主,是不是这样,如果  g_send_size =0的时候,写数据给g_curr_send_buf,但是如果上一帧还没发完,那 ...

    你好!
    你可以在你那边丢帧的时候像你说的那样试下,看看是否还有问题。
    if(g_send_size) { dosomethingg}
    是有数据需要发送的时候,做发送任务。
    如果需要发送的数据为0, 就不用发送了。
    你把那个数据清0放在发送成功里面试下,如果还有问题,欢迎继续交流。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    57

    主题

    531

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1356
    最后登录
    2016-12-5
     楼主| 发表于 2016-10-8 16:38:10 | 显示全部楼层
    小恩GG 发表于 2016-10-8 14:55
    你好!
    你可以在你那边丢帧的时候像你说的那样试下,看看是否还有问题。
    if(g_send_size) { dosomething ...

    版主,OS_Task_create(Task_Start       , NULL, 9L, 1000L, "task_start", NULL);
    这个TASK系统一直在调用,这个调用的周期可以设置吗?可以查看是多少Ms调用一次吗?
    咱们这个有没有一个规定
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-10-28 19:44 , Processed in 0.107150 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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