[求助]CH375作为设备模式不能上传数据

CH375工作在内置固件模式下,连接到计算机有提示,并且安装了驱动。用公司给的CH375/372调试软件调试时,通过端点2上传数据,点完之后调试软件就一直没有反应了。 我的程序如下所示,请大家帮忙看看,不胜感激~~ #include #include"CH375INC.H"

typedef unsigned char UINT8; typedef unsigned short UINT16; typedef unsigned long UINT32;

sbit A0=P3^3;

/* 延时2微秒,不精确,需要根据硬件实际情况调整 */ void Delay2us( ) { UINT8 i; for ( i=1000; i!=0; i-- );

} void Delay5ms() { UINT8 j; for (j=1000;j!=0;j--) { Delay2us(); }

}

//写命令函数 void CH375_WR_CMD_PORT( UINT8 cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ Delay2us(); A0=1; RD=1; WR=0; P1=cmd; WR=1; Delay2us(); } //写数据函数 void CH375_WR_DAT_PORT( UINT8 dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ A0=0; RD=1; WR=0; P1=dat; WR=1; Delay2us(); /* 如果是MCS51单片机,因其较慢,所以实际上无需延时 */

} ////读数据 函数 UINT8 CH375_RD_DAT_PORT(){ UINT8 USBData; //P1=0xff;// 端口数据清零 A0=0; WR=1; RD=0; RD=0; Delay2us(); USBData=P1; Delay2us(); RD=1; return USBData ;

}

//初始化CH375 选择内置固件 模式

void CH375_Init(){

/* 设置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 2 ); /* 设置为使用内置固件的USB设备方式 */; IT0 = 0; /* 置外部信号为低电平触发 */ IE0 = 0; /* 清中断标志 */ EX0 = 1; /* 允许CH372中断,假定CH372的INT#引脚连接到单片机的INT0 */

}

UINT8 UsbLength; /* USB数据缓冲区中数据的长度 */ UINT8 UsbBuffer[ CH375_MAX_DATA_LEN ]={'1','2','3','4','5','6','7','8'};/* USB数据缓冲区 */ //CH375_MAX_DATA_LEN =60

// 中断函数 /* CH375中断服务程序,假定CH375的INT#引脚连接到单片机的INT0,使用寄存器组1 */ void CH375Interrupt( void ) interrupt 0 using 1 {

UINT8 IntStatus; UINT8 cnt; UINT8 *buf; EX0=0;//关外部中断 CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ Delay2us(); IntStatus = CH375_RD_DAT_PORT( ); /* 获取中断状态 */

switch( IntStatus ) { /* 分析中断状态 */

case USB_INT_EP2_OUT: /* 批量端点下传成功,接收到数据 */

CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ /* 如果使用CMD_RD_USB_DATA0命令码,那么读取数据块后不会自动释放缓冲区,需要CMD_UNLOCK_USB命令后才释放 */ UsbLength = cnt = CH375_RD_DAT_PORT( ); /* 首先读取后续数据长度 */ if ( cnt ) { /* 接收到数据放到缓冲区中 */ buf = UsbBuffer; /* 指向缓冲区 */ do { *buf = CH375_RD_DAT_PORT( ); /* 接收命令包的数据 */ buf ++; } while ( -- cnt ); } else break; /* 长度为0,没有数据,在某些应用中也可以将长度0定义为一种特殊命令 */

/* 分析接收到的数据并处理,此处略去,下面示回传数据 */

CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ cnt = UsbLength; CH375_WR_DAT_PORT( cnt ); /* 首先写入后续数据长度 */ if ( cnt ) { /* 将缓冲区中的数据发出 */ buf = UsbBuffer; /* 指向缓冲区 */ do { CH375_WR_DAT_PORT( *buf ); /* 写入数据到CH375 */ buf ++; } while ( -- cnt ); } break;

case USB_INT_EP2_IN: /* 批量端点上传成功,数据发送成功 */ /* 如果还有数据需要接着发送,可在此通过CMD_WR_USB_DATA7命令写入,参考前面的回传 */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ cnt = 10; CH375_WR_DAT_PORT( cnt ); /* 首先写入后续数据长度 */ if ( cnt ) { /* 将缓冲区中的数据发出 */ buf = UsbBuffer; /* 指向缓冲区 */ do { CH375_WR_DAT_PORT( *buf ); /* 写入数据到CH375 */ buf ++; } while ( -- cnt ); } CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区,收到上传成功中断后,必须解锁USB缓冲区,以便继续收发 */ break; case USB_INT_EP1_IN: /* 中断端点上传成功,中断数据发送成功 */ /* 中断端点可以用于单片机及时通知计算机端,本程序未用到 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; case USB_INT_EP1_OUT: /* 辅助端点下传成功,接收到辅助数据 */ /* 辅助端点可以用于计算机端向单片机端发送包,本程序未用到,辅助数据的接收可以参考批量端点 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break;

///////////////*暂时还不懂的部分 ///////////////////////////////////////////////////////////// #ifdef ENABLE_USB_SUSPEND /* 默认情况下不会出现这些中断状态,只有当执行相应的命令后才会出现这些状态,根据需要处理 */ case USB_INT_USB_SUSPEND: /* USB总线挂起事件,只有当执行过CMD_CHK_SUSPEND命令后才可能出现该中断状态 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ CH375_WR_CMD_PORT( CMD_ENTER_SLEEP ); /* 这是可选操作,进入低功耗睡眠挂起状态 */ break;

case USB_INT_WAKE_UP: /* 从睡眠中被唤醒事件,只有当执行过CMD_ENTER_SLEEP命令后才可能出现该中断状态 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; #endif default: /* 内置固件的USB方式下不应该出现其它中断状态,如果启用USB总线挂起检查,那么还要处理USB总线挂起和睡眠唤醒事件 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } }

main(){ Delay5ms();//延时5ms CH375_Init(); IT0=1;//负电平中断 EX0=1; //外部中断开 EA=1;//CPU开中断

}

这个程序是先下传数据,在设备接收到数据之后在把接收到的数据返回给计算机,在计算机端要取到数据的话,必须先发数据下来,DEBUG软件也需要按照这个来操作才能取到数据。 还有找到设备并不代表单片机和CH372硬件连线没问题。建议你在设置模式之前做一个测试命令来确认单片机和CH372之间的连线无问题。


CH372往上传什么数据呢?你根本就没写数据。 你要先写数据,CH372才会传数据。


请问红桃六老师,有没有数据上传的程序可以参考的捏?感觉思路还有点不清楚


谢谢hcn老师,我按照先下传数据,显示成功后,再点的上传数据按钮,但还是没有收到数据。 由于没有仿真器,不知道该怎么查看测试的返回数据,请老师指点


这个程序已经被你修改了,你应该明白这个意思你才能修改。 CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ cnt = UsbLength; CH375_WR_DAT_PORT( cnt ); /* 首先写入后续数据长度 */ if ( cnt ) { /* 将缓冲区中的数据发出 */ buf = UsbBuffer; /* 指向缓冲区 */ do { CH375_WR_DAT_PORT( *buf ); /* 写入数据到CH375 */ buf ++; } while ( -- cnt ); } 你修改的这里就是上传啊。 你先下传几个数据后,在点击上传 另外主函数: main(){ Delay5ms();//延时5ms CH375_Init(); IT0=1;//负电平中断 EX0=1; //外部中断开 EA=1;//CPU开中断

while(1);

}


我参考TEST.C程序修改了上面的程序,然后用TEST.EXE软件来做测试,存在着 return length error:0(0)的问题。这是什么原因造成的啊?


TSET.C的程序是PC发出去的数据,然后MCU按位取反后在传给PC。


首先,问你个问题,你前面有没有做测试命令,既: 程序上电之后延时50MS之后做下面操作 CMD = 0X06 DAT = 0X55 i = DATA i应该为0XAA,如果不是的话,那么麻烦你去查下单片机和CH372的并口连接是否有问题。 其次,在你的程序里面加点监控措施,例如你使用DEBUG372发送数据下来,那么,CH372有没有产生中断,你有没有读取到数据等等。来判断通信是否有异常。


各位老师能不能帮我解释下#pragma NOAREGS在程序中的用法。 我把这句加到我的程序以后,就可以收发数据了


#pragma NOAREGS 这个是命令是禁止绝对寄存器寻址方式,也就是单片机可以使用8051单片机的所以寄存器组。


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