WCH沁恒单片机
直播中

h1654155275.5669

7年用户 1028经验值
私信 关注
[问答]

CH375B返回标准请求错误怎么处理?

下面是运用串口进行模块调试返回的数据。
Chek OK
USB work type:51
Set mode OK
INT = 0F
bus rest!
INT = 0F
bus rest!
INT = 0C
Length = 08
Quest = 0x80 0x86 0x80 0x81 0x80 0x80 0xC0 0x80
SETUP = 86


调试 RESET_ALL 实现硬件复位  CHECK_EXIST 测试工作状态 OK
设置 USB 工作模式 51H CMD_RET_SUCCESS 操作成功
但是当插上 USB 数据线后获取上位机机的标准请求码,数据不正常?
0x80 0x86 0x80 0x81 0x80 0x80 0xC0 0x80
最高位为0x80 不知道,请教一下这是哪里出了问题。


下面是代码:
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define haltif(cmp,msg) if(cmp){print(msg);halt_}
#define halt_ for(;;){}




sbit INT = P3^2;
sbit A0 = P2^1;
sbit CS = P2^0;
sbit Read = P3^7;
sbit Write = P3^6;




void Delay10ms()//@11.0592MHz
{
unsigned char i, j;


i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}




void Wr_cmd( unsigned char cmd)
{  /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */


P0 = 0xFF;
_nop_();
_nop_();
CS = 0;
A0 = 1;
Write = 0;
P0 = cmd;
_nop_();
_nop_();_nop_();
Write = 1;
A0 = 0;
_nop_();
P0 = 0xFF;
_nop_();
}


void Wr_Data( unsigned char dat)
{  /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */
P0 = 0xFF;
_nop_();_nop_();
_nop_();_nop_();
CS = 0;
Write = 0;
P0 = dat;
_nop_();_nop_();
_nop_();_nop_();
Write = 1;
CS = 1;
_nop_();
P0 = 0xFF;
}


void Rd_Data(uchar *dat)
{  /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */
P0 = 0xFF;
_nop_();_nop_();
_nop_();_nop_();
CS = 0;
Read = 0;
_nop_();
_nop_();
_nop_();_nop_();
*dat = P0;
Read = 1;
CS = 1;
A0 = 1;
_nop_();_nop_();
_nop_();_nop_();
P0=0xFF;


}


void SendOneByte(unsigned char c)   
{
SBUF = c;           //把数据送往寄存器
while(!TI);         //等待发送完成TI=0时一直发送,直到TI=1,发送后硬件自动置1
TI = 0;             //发送完成标志
}
void print(unsigned char *p)
{
while(*p!='')
{
SendOneByte(*p++);
}
}
void print_8x(uchar c)
{
uchar String1[2];
uchar Str1[16]={"0123456789ABCDEF"};
uchar cH,cL,i;
cH = (c>>4)&0x0f;
cL = c & 0x0f;
String1[0] = Str1[cH];
String1[1] = Str1[cL];
for(i=0;i<2;i++)
{
SendOneByte(String1);
}
}


void UART_Init(void)
{
                //单片机初始化//通信设置,串行口中断
TMOD = 0x20;
SCON = 0x50;
TL1 = 0xFD;//设置定时初始值
TH1 = 0xFD;//设置定时初始值
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;    //定时器中断1
IT0 = 1;    //外部中断0下降沿触发方式
EX0 = 1;    //开外部中断0
}


void CH375_Init()
{
Read = 1;
Write = 1;
A0  = 0;
}


uchar poll_interrput()//获取中断状态
{
uchar i;
while(INT);
Wr_cmd(0x22);
Rd_Data(&i);
return i;
}


uchar bRequest = 0;


void main(void)
{
uchar buf[8];//用于接受标准请求
   uchar i,tem,j;
CH375_Init();//初始化Ch375
INT = 1;
UART_Init();
Delay10ms();
Wr_cmd(0x05); //执行硬件复位
Delay10ms(); //延时40us
Delay10ms();
Delay10ms();
Delay10ms();
Wr_cmd(0x06);//检测工作状态
Wr_Data(0xA5);//写入数据
Rd_Data(&i);
tem = ~0x0A5;
haltif(i != tem,"Chek exits error!rn");  //检测数据是否取反
print("Chek OKrn");
Wr_cmd(0x15); //设置USB工作模式
Wr_Data(0x01);//设置外部固件模式
for(;;)
{
Rd_Data(&i);
print("USB work type:");
print_8x(i);
print("rn");
if(i == 0x51)
{
break;
}
}
print("Set mode OKrn");
while(1)
{
i =poll_interrput();//获取中断状态
print("INT = ");
print_8x(i);
print("rn");
switch(i)
{
case 0x0c:
Wr_cmd(0x28);
Rd_Data(&i);
print("Length = ");
print_8x(i);
print("rn");
if(i==8)
{
for(j=0;j<8;j++)
{
Rd_Data(buf + j);
}
bRequest = buf[1];
print("Quest = ");
for(j=0;j<8;j++)
{
print("0x");
print_8x(buf[j]);
print(" ");
}
print("rn");


print("SETUP = ");
print_8x(bRequest);
print("rn");
switch(bRequest)
{
case 0x00:
break;
case 0x06:
break;
}


}
break;
default:
if((i&0x03)==0x03)
{
print("bus rest!rn");
}
Wr_cmd(0x23);
Rd_Data(&i);
break;
}
}
}


void int0(void) interrupt 0   //外部0中断服务
{
EX0 = 0;
INT = 1;
EX0 = 1;  
}


void UARTInterrupt(void) interrupt 4  //4号串行中断
{
  RI = 0;
}


回帖(1)

周芳卿

2022-7-8 09:41:58
您好,之前有回过您这个问题,怀疑还是并口的问题。
用CHECK_EXIST,单片机发送0x00,应该返回0xff,单片机发送0xff,应该返回0x00.
请测试一下这两个取反数据是否正确。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分