- 打卡等级:偶尔看看I
- 打卡总天数:14
- 最近打卡:2026-02-14 08:49:40
中级会员
- 积分
- 248
|
发表于 2026-1-15 15:04:03
|
显示全部楼层
使用一个IO口,上电时判断高低电平,高电平程序使用USB通讯,低电平使用传统串口
使用传统串口下载程序,试了传统串口通讯,没有问题
可USB通讯,系统不能识别出USB-CDC
bit Detect_Ext_Port(void)
{
P33 = 1;
Delay1ms(1);
if (P33 == 1) return(1);
return(0);
}
void Init_COMM(void)
{
//串口1,与PC通讯,蓝牙
P_SW1 &= B00111111; //串口1在p3.0 p3.1
PCON &= B00111111; //速度不加倍
SCON = B01010000; //串口1,模式1,8位数据,可变波特率
AUXR |= B00000001; //串口1选择定时器2为波特率发生器
AUXR |= B00000100; //定时器2时钟为Fosc,即1T,
AUXR &= B11110111; //T2定时方式
T2L = 0xD8; //设定定时初值,250000,晶振40MHz
T2H = 0xFF;
AUXR |= B00010000; //启动定时器2,T2固定16位自动重装
//SBUF
RI = 0;
TI = 0;
REN = 1; //开放串口1接收
ES = 1; //串口1中断允许
//IP.4 IPH.4优先级
//0k
EA = 1;
}
void UART1_Routine(void) interrupt 4
{
unsigned char temp;
if (RI == 0) return;
temp = SBUF;
bb = temp;
RI = 0;
}
void Send_Byte_COM1(unsigned char chr)
{
TI = 0;
TB8 = 0;
NOP2();
SBUF = chr;
while(TI == 0);
TI = 0;
}
void main()
{
unsigned int aa, i;
bb=0;
Delay1ms(2000);
P_SW2 |= 0x80;
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
P3M1 = B00001000; //I/O口3模式控制器1,初始值=高阻输入,
P3M0 = B00000000;
P3PU = B00001000; //p33高阻输入,内部4.2k上拉
USB_Flag = Detect_Ext_Port();
if (USB_Flag==1)
{
P34 = 0;
Delay1ms(200);
P34 = 1;
Delay1ms(200);
P34 = 0;
usb_init(); //USB CDC 接口配置
}
if (USB_Flag==0)
{
P3M1 = B00000000; //I/O口3模式控制器1,初始值=高阻输入,
P3M0 = B00000010; //准双向口不能接上拉??
Init_COMM();
Delay1ms(100);
Send_Byte_COM1('1');
Send_Byte_COM1('2');
Send_Byte_COM1('3');
Send_Byte_COM1('4');
Send_Byte_COM1('5');
Send_Byte_COM1('6');
P34 = 0;
Delay1ms(200);
P34 = 1;
Delay1ms(200);
P34 = 0;
Delay1ms(200);
P34 = 1;
}
EA = 1;
//可有可无???可以主动发数据了
//if(DeviceState!=DEVSTATE_CONFIGURED); //如果USB配置没有完成,等待
aa=0x30;
while (1)
{
if (bb > 0)
{
Send_Byte_COM1(bb);
P34 = ~P34;
bb = 0;
}
if (bUsbOutReady)
{
if (UsbOutBuffer[0] == '1')
{
ff = 1;
}else
if (UsbOutBuffer[0] == '2')
{
ff = 0;
CDC_Buffer[2]=0x36;
CDC_Buffer[3]=0x37;
CDC_Buffer[4]=0x38;
CDC_Buffer[5]=0x39;
CDC_Buffer[6]=0x41;
CDC_Buffer[7]=0x42;
P36 = 0;
USB_SendData(CDC_Buffer,9);//22us,每字节2.5us,每秒400k字节
P36 = 1;
}else
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
usb_OUT_done();//当前包的数据处理完成
}
if (ff == 1)
{
CDC_Buffer[0]=0x55;
CDC_Buffer[1]=0xAA;
CDC_Buffer[2]=0x30;
CDC_Buffer[3]=0x31;
CDC_Buffer[4]=0x32;
CDC_Buffer[5]=0x33;
CDC_Buffer[6]=0x34;
CDC_Buffer[7]=0x35;
CDC_Buffer[8]=0x0D;
P36 = 0;
USB_SendData(CDC_Buffer,9);
P36 = 1;
}
}
}
使用传统串口下载如下程序,也不能识别USB
void main()
{
P_SW2 |= 0x80;
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init(); //USB CDC 接口配置
EA = 1;
while (1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
}
}
|
|