- 打卡等级:初来乍到
- 打卡总天数:9
- 最近打卡:2025-04-23 15:28:46
等待验证会员
- 积分
- 223
|
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;
}
}
|
|