找回密码
 立即注册
查看: 100|回复: 3

开源 利用CDC直接收发数据——基于“试验箱 70-CDC协议范例源码”修改

[复制链接]
  • TA的每日心情
    开心
    2024-3-22 08:53
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    7

    主题

    37

    回帖

    251

    积分

    等待验证会员

    积分
    251
    发表于 2024-3-14 15:45:20 | 显示全部楼层 |阅读模式




    1、注释掉usb.c中的usb_uart_settings();

    2、增加接收数据字节数变量USB_RevDataLong,该变量在数据接收(USB_polling()中)时变化,数据处理完成后由程序清零。

    3、用以下代码替代  uart.c代码:



    //USB数据发送进程
    void USB_SendData(BYTE *buf,u16 bl)
    {
            BYTE num;
           
            while(bl)
            {
                    num=(bl>(EP1IN_SIZE-1)?EP1IN_SIZE:bl);
                    bl-=num;
                    while(num)
                    {
                            if(UsbInBusy) continue;
                            TxBuffer[TxWptr++] = *buf++;
                            num--;
                    }               
            }
    }


    //USB口收发监视进程。
    //通过USB_SendData()函数填充缓冲区,而后自动发送;
    //接收数据自动完成,数据填充到USB_RevDataBuf[]缓冲区;
    //数据长度为USB_RevDataLong,该参数在数据处理完成后由软件清零
    void USB_polling()               
    {
        BYTE cnt;

        if (DeviceState != DEVSTATE_CONFIGURED)
            return;

        if (!UsbInBusy && (TxRptr != TxWptr))
        {
            EUSB = 0;
            UsbInBusy = 1;
            usb_write_reg(INDEX, 1);
            cnt = 0;
            while (TxRptr != TxWptr)
            {
                usb_write_reg(FIFO1, TxBuffer[TxRptr++]);
                cnt++;
                if (cnt == EP1IN_SIZE) break;
            }
            usb_write_reg(INCSR1, INIPRDY);
            EUSB = 1;
        }

        while(RxRptr != RxWptr)
                    {
                            USB_RevDataBuf[USB_RevDataLong++] = RxBuffer[RxRptr++];
                    }                       

        if (UsbOutBusy)
        {
            EUSB = 0;
            if (RxWptr - RxRptr < 256 - EP1OUT_SIZE)
            {
                UsbOutBusy = 0;
                usb_write_reg(INDEX, 1);
                usb_write_reg(OUTCSR1, 0);
            }
            EUSB = 1;
        }
    }

    4、主程:


    #include "stc.h"
    #include "usb.h"

    void USB_polling();
    void USB_SendData(BYTE *buf,u16 bl);

    void Delay1000ms(void)        //@24MHz
    {
            unsigned long edata i;

            _nop_();
            _nop_();
            i = 5999998UL;
            while (i) i--;
    }

    void main()
    {
      
            WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
        EAXFR = 1; //扩展寄存器(XFR)访问使能
        CKCON = 0; //提高访问XRAM速度

        usb_init();
        EA = 1;
              
        while (1)
        {
                            USB_polling();
                   
    Delay1000ms();
                  //       USB_SendData("1234567890",10);       
                           
                            USB_SendData(USB_RevDataBuf,USB_RevDataLong);
                            USB_RevDataLong=0;
        }
    }





    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    13 小时前
  • 签到天数: 58 天

    [LV.5]常住居民I

    0

    主题

    182

    回帖

    358

    积分

    中级会员

    积分
    358
    发表于 2024-3-19 10:04:47 | 显示全部楼层
    不错,学习了
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 46 天

    [LV.5]常住居民I

    0

    主题

    157

    回帖

    357

    积分

    中级会员

    积分
    357
    发表于 2024-3-20 22:05:49 | 显示全部楼层
    赞一个
    回复 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 02:02
  • 签到天数: 68 天

    [LV.6]常住居民II

    4

    主题

    414

    回帖

    1122

    积分

    金牌会员

    积分
    1122
    发表于 2024-3-21 07:51:23 | 显示全部楼层
    回复 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-3 14:10 , Processed in 0.062346 second(s), 40 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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