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!='\0')

{

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[i]);

}

}


 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!\r\n");  //检测数据是否取反

print("Chek OK\r\n");

Wr_cmd(0x15); //设置USB工作模式

Wr_Data(0x01);//设置外部固件模式

for(;;)

{

Rd_Data(&i);

print("USB work type:");

print_8x(i);

print("\r\n");

if(i == 0x51)

{

break;

}

}

print("Set mode OK\r\n");

while(1)

{

i =poll_interrput();//获取中断状态 

print("INT = ");

print_8x(i);

print("\r\n");

switch(i)

{

case 0x0c:

Wr_cmd(0x28);

Rd_Data(&i);

print("Length = ");

print_8x(i);

print("\r\n");

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("\r\n");


print("SETUP = ");

print_8x(bRequest);

print("\r\n");

switch(bRequest)

{

case 0x00:

break;

case 0x06:

break;

}


}

break;

default:

if((i&0x03)==0x03)

{

print("bus rest!\r\n");

}

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;


您好,之前有回过您这个问题,怀疑还是并口的问题。

用CHECK_EXIST,单片机发送0x00,应该返回0xff,单片机发送0xff,应该返回0x00.

请测试一下这两个取反数据是否正确。


只有登录才能回复,可以选择微信账号登录