测试CH372是否正常工作

请问我是按CH372的规格书写的,但怎么都跟电脑通不了,是什么原因?

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

//-------------------creaed by hjb //---- USB_CS=0; //选通CH372 P2=0xFF; //USB_DATA_OUTPUT=0xFF; //拉高引脚 USB_A0=1; //USB_A0=USB_CMD_MODE;//命令模式 USB_WR=0;//准许写 P2=cmd; //USB_DATA_OUTPUT=cmd;//写数据 DelayNus(2); // DelayNus(3); USB_CS=1;//不选通CH372; P2=0xFF; //USB_DATA_OUTPUT=0xFF;//拉高引脚 USB_WR=1;//禁止写

}

void CH375_WR_DAT_PORT( unsigned char dat ) { ///* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */

USB_CS=0; //选通CH372 P2=0xFF;// USB_DATA_OUTPUT=0xFF; //拉高引脚 //covered by hjb USB_A0=0;//USB_A0=USB_DAT_MODE;//数据模式 //covered by hjb USB_WR=0;//准许写 P2=dat; //USB_DATA_OUTPUT=dat;//写数据

DelayNus(2);//DelayNus(3); //3uS USB_CS=1;//不选通CH372; P2=0xFF; //USB_DATA_OUTPUT=0xFF;//拉高引脚 USB_WR=1;//禁止写 }

unsigned char CH375_RD_DAT_PORT( void ) { ///* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */

//---------------Created by hjb unsigned char dat; //unsigned int dat;

USB_CS=0; //选通CH372 P2=0xFF; //USB_DATA_INTPUT=0xFF; //拉高引脚 USB_A0=0; //hjb// USB_A0=USB_DAT_MODE;//命令模式 USB_RD=0; //准许读 dat=P2; //dat=USB_DATA_INTPUT//读取数据

DelayNus(2);//DelayNus(3); USB_CS=1;//不选通CH372; USB_RD=1;//禁止读 P2=0xFF;// USB_DATA_INTPUT=0xFF;//拉高引脚 return dat; //返回读取到的数据 } //-----------------------------------------------------------------------

// CH375初始化子程序 void CH375_Init( ) { unsigned char i; // 测试CH375是否正常工作,可选操作,通常不需要 CH375_WR_CMD_PORT( CMD_CHECK_EXIST );// 测试CH375是否正常工作 0x06 CH375_WR_DAT_PORT( 0x55 ); // 写入测试数据

i = ~ 0x55; // 返回数据应该是测试数据取反 if ( CH375_RD_DAT_PORT( ) != i ) { // CH375不正常 for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL );// 多次重复发命令,执行硬件复位 CH375_RD_DAT_PORT( ); } CH375_WR_CMD_PORT( 0 ); Delay50ms( ); // 延时50ms }

// 设置USB工作模式, 必要操作 CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 2 );// 设置为使用内置固件的USB设备方式 for ( i=100; i!=0; i-- ) { // 等待操作成功,通常需要等待10uS-20uS if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } // if ( i==0 ) { CH372/CH375存在硬件错误 }; // 下述启用中断,假定CH375连接在INT0 IT0 = 0; // 置外部信号为低电平触发 IE0 = 0; // /* 清中断标志 */covered by hjb EX0 = 1; // /* 允许CH375中断 */ // EA=1;//HJB

}

// CH375中断服务程序,使用寄存器组1 void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char i, length; unsigned char data buffer[ 64 ];

CH375_WR_CMD_PORT( CMD_GET_STATUS ); // 获取中断状态并取消中断请求 InterruptStatus = CH375_RD_DAT_PORT( );// 获取中断状态

switch ( InterruptStatus ) { // 分析中断状态处理 case USB_INT_EP2_OUT: { // 批量端点下传成功 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); // 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区

length = CH375_RD_DAT_PORT( ); // 首先读取后续数据长度 for ( i = 0; i < length; i ++ )

buffer[ i ] = CH375_RD_DAT_PORT( ); // 接收数据包

// 测试数据正确性,将接收到的命令包数据取反后返回给PC机 CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 );// 向USB端点2的发送缓冲区写入数据块

CH375_WR_DAT_PORT( length ); // 首先写入后续数据长度,回传刚接收到的数据长度 for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( ~ buffer[ i ] ); // 数据取反后返回,由计算机应用程序测试数据是否正确 break; } case USB_INT_EP2_IN: { // 批量数据发送成功 CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); // 释放当前USB缓冲区 break; } default: { // 其它中断,未用到,解锁后退出即可 CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); // 释放当前USB缓冲区 break; } } }

main( ) { USB_A0=1; //USB_A0=USB_CMD_MODE;//命令模式 USB_WR=1; USB_CS=1;USB_RD=1;INT=1; //------------ Delay50ms( );// 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 CH375_Init( ); // 初始化CH375 EA = 1; // 允许中断 while ( 1 ); /// 以下指令开始工作循环,等待PC机命令进行操作 }

首先单片机端确保硬件连接没有问题,在CH375_Init( );函数中CMD_CHECK_EXIST和CMD_SET_USB_MODE能够正常通过。然后,你USB口连接电脑,设备管理器是否弹出未识别的设备。最后,需要安装我们的CH372DRV的驱动才能正常识别。


我硬件已经检查了,没发现什么问题,不知程序哪里有问题,哎 万事开头难,没想到这么难


如果硬件没有问题,你那检查一下并口的时序,首先确认你IO能够正常输入输出,必须确保测试命令正确通过,后面的调试简单了。


我用万用表量并口IO,但并口输出 并没有所谓命令取反(是不是用万用表量不准,变化太快或者....),但我接入电脑,电脑硬件有显示CH372/CH375,而且显示正常,用“DEBUG372调试设备,设备可以正常打开,而且有检测到CH372/CH375输入;但输入下传数据后,上传不了数据(按理上传取反);请问什么原因,项目紧迫,请多多指教,万分感谢!


测试命令你最好是先把CH372返回的值存起来,通过打印或者点灯的方式来看。因为单片机收到并口数据,CH372会进入下一个传输阶段,这时使用万用表的话是量不出来的。 从你描述的现象来看,计算机是识别了CH372设备,可以说明通讯接口没问题。上传数据的话需要提前准备好数据,然后点击上传按钮,会有中断产生,然后接收数据,你看一下有没有这个中断?


我用LED灯接单片机并口观察命令时,就无法识别CH372,把LED灯去掉,就能识别CH372,而且可以正常打开DEBUG372调试设备,只是下传数据后,上传不了,这样的话可不可以确定CH372测试命令是正常的吗? 还有,我目前开发的项目是跟外面对接的,我只是负责把按键开关量通过CH372传给电脑上位机就行,至于你是所说打印串口命令 一时搞不明白,刚接触CH372,很多都不懂,而项目又紧,还是请多多指教


还有,我用万用表量了一下A0端口 ,一直都是低电平,是否跟这有关


点上下传时,用万用表量中断口一直是高电平


关于LED灯:你做个判断,如果获取到的数据是你发下去数据的取反LED灯亮,否则LED不亮。 关于万用表测中断:我们中断产生到中断撤销都是us级,必须要用示波器观察,用万用表肯定都是高电平。


用示波器测试,中断正常,下传正常,但上传不了,是不是中断服务程序上传没写好,可给个例子吗?谢谢!


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