小坤 发表于 2026-1-8 17:25:31

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

基于USB-CDC单串口例程修改


void USB_Send(char*p, char len)
{
      unsigned char n;
      
      if (DeviceState != DEVSTATE_CONFIGURED)      return;
      
         if(!UsbInBusy)
    {
      IE2 &= ~0x80;   
      UsbInBusy = 1;
      usb_write_reg(INDEX, 1);
               
                for(n=0; n<len; n++)      
            usb_write_reg(FIFO1, *p++);
                     
      usb_write_reg(INCSR1, INIPRDY);
      IE2 |= 0x80;
    }
}

void USB_Read(void)
{
      if (UsbOutBusy)
    {      
   /*   IE2 &= ~0x80;
      if (RxWptr - RxRptr < 256 - EP1OUT_SIZE)
      {
            UsbOutBusy = 0;
            usb_write_reg(INDEX, 1);
            usb_write_reg(OUTCSR1, 0);
      }      
      IE2 |= 0x80;
                */
                UsbOutBusy = 0;
                USB_Send(USB_CDC_Buff, UsboutLen);      
               
    }      
}
#ifdef EN_EP1OUT
void usb_out_ep1()
{
    BYTE csr;
    BYTE cnt;

    usb_write_reg(INDEX, 1);
    csr = usb_read_reg(OUTCSR1);
    if (csr & OUTSTSTL)
    {
      usb_write_reg(OUTCSR1, OUTCLRDT);
    }
    if (csr & OUTOPRDY)
    {
                cnt = 0;               
                UsboutLen =0;
               
      cnt = usb_read_reg(OUTCOUNT1);
                UsboutLen = cnt;
      while (cnt--)
      {
            USB_CDC_Buff = usb_read_reg(FIFO1);
      }
                UsbOutBusy = 1;
               
   //   if (RxWptr - RxRptr >= 256 - EP1OUT_SIZE)
   //   {
   //       UsbOutBusy = 1;
   //   }
      //else
   //   {
            usb_write_reg(OUTCSR1, 0);
   //   }
    }
}
#endif

BYTE xdata USB_CDC_Buff;



ercircle 发表于 2026-1-8 18:04:03

准确的说是你发完第一包,第二包就开始错了


因为只拷贝了例程的RxWptr,用法完全不对。发送永远是数组头开始


小坤 发表于 2026-1-9 09:04:43

ercircle 发表于 2026-1-8 18:04
准确的说是你发完第一包,第二包就开始错了



感谢,没注意! 修复后好了。因为要做IAP升级 中断偏移用不了库函数,只能照着改{:ciya:}
void usb_out_ep1()
{
    BYTE csr;
    BYTE cnt;

    usb_write_reg(INDEX, 1);
    csr = usb_read_reg(OUTCSR1);
    if (csr & OUTSTSTL)
    {
      usb_write_reg(OUTCSR1, OUTCLRDT);
    }
    if (csr & OUTOPRDY)
    {
                cnt = 0;               
                UsboutLen =0;
                csr = 0;
               
      cnt = usb_read_reg(OUTCOUNT1);
                UsboutLen = cnt;
      while (cnt--)
      {
            USB_CDC_Buff = usb_read_reg(FIFO1);
      }
                UsbOutBusy = 1;
               
   //   if (RxWptr - RxRptr >= 256 - EP1OUT_SIZE)
   //   {
   //       UsbOutBusy = 1;
   //   }
      //else
   //   {
            usb_write_reg(OUTCSR1, 0);
   //   }
    }
}

页: [1]
查看完整版本: USB_CDC 每发送256字节数据会移位 | 已解决