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;
准确的说是你发完第一包,第二包就开始错了
因为只拷贝了例程的RxWptr,用法完全不对。发送永远是数组头开始
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]