找回密码
 立即注册
查看: 424|回复: 4

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-04-23 15:28:46

19

主题

65

回帖

223

积分

等待验证会员

积分
223
发表于 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;
    }
}





回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:391
  • 最近打卡:2025-04-30 00:26:42

0

主题

336

回帖

1490

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:402
  • 最近打卡:2025-05-01 10:01:59

0

主题

170

回帖

955

积分

高级会员

积分
955
发表于 2024-3-20 22:05:49 | 显示全部楼层
{:5_332:}赞一个
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:394
  • 最近打卡:2025-05-01 03:26:07

16

主题

702

回帖

2470

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:34
  • 最近打卡:2025-04-27 20:46:14
已绑定手机

8

主题

22

回帖

204

积分

中级会员

积分
204
发表于 2025-4-10 17:31:57 | 显示全部楼层
学习了!多谢多谢!
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:07 , Processed in 0.157385 second(s), 81 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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