找回密码
 立即注册
查看: 119|回复: 2

USB_CDC 每发送256字节数据会移位 | 已解决

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:456
  • 最近打卡:2026-03-19 22:16:37
已绑定手机

39

主题

326

回帖

938

积分

高级会员

积分
938
发表于 2026-1-8 17:25:31 | 显示全部楼层 |阅读模式
基于USB-CDC  单串口例程修改

  1. void USB_Send(char*p, char len)
  2. {
  3.         unsigned char n;
  4.         
  5.         if (DeviceState != DEVSTATE_CONFIGURED)        return;
  6.         
  7.          if(!UsbInBusy)
  8.     {
  9.         IE2 &= ~0x80;   
  10.         UsbInBusy = 1;
  11.         usb_write_reg(INDEX, 1);
  12.                
  13.                 for(n=0; n<len; n++)        
  14.             usb_write_reg(FIFO1, *p++);
  15.                      
  16.         usb_write_reg(INCSR1, INIPRDY);
  17.         IE2 |= 0x80;
  18.     }
  19. }
  20. void USB_Read(void)
  21. {
  22.         if (UsbOutBusy)
  23.     {        
  24.      /*   IE2 &= ~0x80;  
  25.         if (RxWptr - RxRptr < 256 - EP1OUT_SIZE)
  26.         {
  27.             UsbOutBusy = 0;
  28.             usb_write_reg(INDEX, 1);
  29.             usb_write_reg(OUTCSR1, 0);
  30.         }        
  31.         IE2 |= 0x80;  
  32.                 */
  33.                 UsbOutBusy = 0;
  34.                 USB_Send(USB_CDC_Buff, UsboutLen);        
  35.                
  36.     }        
  37. }
  38. #ifdef EN_EP1OUT
  39. void usb_out_ep1()
  40. {
  41.     BYTE csr;
  42.     BYTE cnt;
  43.     usb_write_reg(INDEX, 1);
  44.     csr = usb_read_reg(OUTCSR1);
  45.     if (csr & OUTSTSTL)
  46.     {
  47.         usb_write_reg(OUTCSR1, OUTCLRDT);
  48.     }
  49.     if (csr & OUTOPRDY)
  50.     {
  51.                 cnt = 0;               
  52.                 UsboutLen =0;
  53.                
  54.         cnt = usb_read_reg(OUTCOUNT1);
  55.                 UsboutLen = cnt;
  56.         while (cnt--)
  57.         {
  58.             USB_CDC_Buff[RxWptr++] = usb_read_reg(FIFO1);
  59.         }
  60.                 UsbOutBusy = 1;
  61.                
  62.      //   if (RxWptr - RxRptr >= 256 - EP1OUT_SIZE)
  63.      //   {
  64.      //       UsbOutBusy = 1;
  65.      //   }
  66.       //  else
  67.      //   {
  68.             usb_write_reg(OUTCSR1, 0);
  69.      //   }
  70.     }
  71. }
  72. #endif
  73. BYTE xdata USB_CDC_Buff[64];
复制代码



截图202601081723447041.jpg

12-CDC(Communication Device Class)协议范例 - USB-CDC转单串口.zip

378.79 KB, 下载次数: 1

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:481
  • 最近打卡:2026-03-21 18:48:59
已绑定手机

104

主题

4193

回帖

9269

积分

荣誉版主

无情的代码机器

积分
9269
发表于 2026-1-8 18:04:03 | 显示全部楼层
准确的说是你发完第一包,第二包就开始错了

截图202601081802532993.jpg
因为只拷贝了例程的RxWptr,用法完全不对。发送永远是数组头开始
截图202601081803164960.jpg
截图202601081803589585.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:456
  • 最近打卡:2026-03-19 22:16:37
已绑定手机

39

主题

326

回帖

938

积分

高级会员

积分
938
发表于 2026-1-9 09:04:43 | 显示全部楼层
erci*** 发表于 2026-1-8 18:04
准确的说是你发完第一包,第二包就开始错了

感谢,没注意! 修复后好了。因为要做IAP升级 中断偏移用不了库函数,只能照着改
  1. void usb_out_ep1()
  2. {
  3.     BYTE csr;
  4.     BYTE cnt;
  5.     usb_write_reg(INDEX, 1);
  6.     csr = usb_read_reg(OUTCSR1);
  7.     if (csr & OUTSTSTL)
  8.     {
  9.         usb_write_reg(OUTCSR1, OUTCLRDT);
  10.     }
  11.     if (csr & OUTOPRDY)
  12.     {
  13.                 cnt = 0;               
  14.                 UsboutLen =0;
  15.                 csr = 0;
  16.                
  17.         cnt = usb_read_reg(OUTCOUNT1);
  18.                 UsboutLen = cnt;
  19.         while (cnt--)
  20.         {
  21.             USB_CDC_Buff[csr++] = usb_read_reg(FIFO1);
  22.         }
  23.                 UsbOutBusy = 1;
  24.                
  25.      //   if (RxWptr - RxRptr >= 256 - EP1OUT_SIZE)
  26.      //   {
  27.      //       UsbOutBusy = 1;
  28.      //   }
  29.       //  else
  30.      //   {
  31.             usb_write_reg(OUTCSR1, 0);
  32.      //   }
  33.     }
  34. }
复制代码


截图202601090905353738.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-22 03:28 , Processed in 0.105791 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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