各位大侠,我利用CH375的设备方式与PC进行通信,控制器是STC89C52,利用IO口模拟的方式编写的下位机程序,程序运行后,设置CH375内部固件模式成功,电脑能够正常识别硬件,利用那个CH372里的TEST.EXE和DEBUG.EXE工具给下位机发数据时,发现一直收不到回来的数据,并且死机,检测了一下INT#电平发现,设置模式成功时,为高电平,打开DEBUG.EXE软件,点端点2的下传命令后,INT#就变为低电平,之后一直是低,并且没有收到返回数据,请各位大侠看看,这是什么问题,非常感谢!
估计是程序没有进入中断,读取中断状态。如果没有读取中断状态,INT#会一直处于低电平
同上,主程序没开中断吧?
主程序已经开中断了, 通过串口测试发现, H375_WR_CMD_PORT(CMD_GET_STATUS); 这条命令执行后,并没有让INT#引脚变高电平,而且,status = CH375_RD_DAT_PORT(); 获取的中断状态也不正确,我发到串口上一看,数据是 0x51,也就是 CMD_RET_SUCCSESS 的值,并不是获取的CH375中断的值,所以下面一直没法执行了,这个不知道怎么回事啊?请教给位大侠!
你说的现象应该不会存在的,你检查你的中断,看是不是其它什么地方进入的中断,而不是下传的中断
大侠,下面是程序,请帮忙看看,执行完那个获取中断状态后,获取的值是0x51,现在也没调试通,谢谢! #include "config.h" #include #include "CH375INC.H" #include #include #include #include #include #include
#define USBDevice 0x02 // 定义USB设备种类 #define USBBuffer_MaxLen 64 // USB设备的缓冲区地址
extern uchar USBBuffer[64]; // 缓冲数组 extern bit USBRecFlag; // USB接收标志 extern uchar USBData_Len; // 字节长度
/********************************************/ //*与硬件相关,需要根据自己的硬件来更改
sbit CH375_Read = P1^0 ; //RD sbit CH375_Write = P1^1; //WR sbit CH375_CS = P1^2; //CS sbit CH375_1Cmd_0Data = P1^3; //A0 //sbit USB_INT0 = P1^4;
#define CH375Port P2 //P2 Port // INT#====INT0
/*******************************************/ bit USBRecFlag=0; //USB接收到数据包后的标志位 bit flag_1 = 0; uchar USBBuffer[64]={0}; //USB接收数据缓冲区 uchar USBData_Len=0; //USB数据包长度
/*************************************************************** * 函数名称: Delay() * 功能描述:短延迟 * 输入参数: ui * 返回参数: 无 // 2--延时2us; // 8--延时50us; // 16-延时100us; // 180--延时1ms *****************************************************************/ void Delay(unsigned int ui) { while(ui--); }
/*************************************************************** * 函数名称: CH375_Disable() * 功能描述: * 输入参数: 无 * 返回参数: 无 *****************************************************************/ void CH375_Disable(void) { CH375_CS=1; CH375_Read=1; CH375_Write=1; CH375_1Cmd_0Data=0; }
/*************************************************************** * 函数名称: CH375初始化 * 功能描述: 初始化顺序:硬件复位,自测试(循环),写模式,开中断 * 输入参数: 无 * 返回参数: 无 *****************************************************************/ void CH375_Initial(void) { EA = 0; //Disable all interrupt EX1 = 0; CH375_Disable(); Delay(9000); // 延时50ms CH375_WriteCmd(CMD_RESET_ALL); // 执行硬件复位 Delay(9000); // 延时50ms // 执行测试命令 if(!CH375_SelfTest()) { send_strs_com("CH375-Error!\n"); } Delay(9000); // 延时50ms // 执行工作模式设置 CH375_Write_Mode(USBDevice); // 已启用的设备方式并且使用内置固件模式 send_strs_com("Wrtie mode!\n"); IT0 = 0; // 置外部信号为低电平触发 IE0 = 0; // 清中断标志 EX0 = 1; // 允许CH375中断 }
/*************************************************************** * 函数名称: CH375_SelfTest() * 功能描述: CH375自测试 * 输入参数: 无 * 返回参数: 无 * 补充说明: 测试数据:0XAA,0--自测试失败 ,1--自测试成功 *****************************************************************/ bit CH375_SelfTest(void) { uchar DataTest; CH375_WriteCmd(CMD_CHECK_EXIST); /* 测试工作状态 */ Delay(20); CH375_WriteData(0XAA); Delay(20); DataTest= CH375_ReadData(); if(DataTest == 0X55) { //send_strs_com(" USB Self Test OK!"); return 1; } else { send_strs_com(" USB Self Test Error!"); return 0; } }
/*************************************************************** * 函数名称: CH375_WriteCmd * 功能描述: CH375写命令函数 * 输入参数: 命令控制字 * 返回参数: 无 * 补充说明: *****************************************************************/ void CH375_WriteCmd(uchar CH375Command) { uchar Command_Temp; Command_Temp = CH375Command; CH375_CS = 0; CH375_1Cmd_0Data = 1; CH375Port = Command_Temp; Delay(2); CH375_Write=0; Delay(1); CH375_Write=1; CH375_Disable(); }
/*************************************************************** * 函数名称: CH375_WriteData * 功能描述: CH375写数据 * 输入参数: 命令控制字 * 返回参数: 无 * 补充说明: /* 2009.07.27 : V2.0: 从子程序中去除CH375Disable(),在连续写数据过程中不能将CS变高,移到写完整个数据块后在Disable *****************************************************************/
void CH375_WriteData(uchar CH375Data) { uchar CH375Data_Temp; CH375Data_Temp = CH375Data; CH375_CS=0; CH375_1Cmd_0Data = 0; CH375Port = CH375Data_Temp; Delay(2); CH375_Write=0; Delay(1); CH375_Write=1; } /*************************************************************** * 函数名称: CH375_ReadData * 功能描述: CH375读数据 * 输入参数: 命令控制字 * 返回参数: 无 * 补充说明: /*2009.07.27 , V2.0 :在子程序中去出了CH375Disable()函数 /* 原因:在批量数据读取时,CS线不能变低。将这部分功能移动到了数据读取完后再进行Disable *****************************************************************/ uchar CH375_ReadData(void) { uchar USBData; CH375_CS=0; CH375_1Cmd_0Data = 0; CH375Port=0XFF; CH375_Read=0; CH375Port=0XFF; Delay(2); USBData=CH375Port; Delay(1); CH375_Read=1; return USBData; }
/*************************************************************** * 函数名称: CH375Write_Mode * 功能描述: CH375写模式 * 输入参数: 命令控制字 * 返回参数: 无 * 补充说明: *****************************************************************/ void CH375_Write_Mode(uchar CH375Mode) { uchar CH375Mode_Temp; CH375Mode_Temp = CH375Mode; CH375_WriteCmd(CMD_SET_USB_MODE); // 设置USB工作模式 Delay(2); CH375_WriteData(CH375Mode_Temp); Delay(2); while(CH375_ReadData()!=CMD_RET_SUCCESS) //命令操作成功 { //send_strs_com("CH375-MODE-Error!\n"); //CH375_WriteData(CH375Mode_Temp); } //send_strs_com("CH375-MODE-OK!\n"); CH375_Disable(); }
/*************************************************************** * 函数名称: USB_Buffer_Reset * 功能描述: CH375缓冲区复位 * 输入参数: 命令控制字 * 返回参数: 无 * 补充说明: 长度清零、缓冲区清零 *****************************************************************/ void USB_Buffer_Reset(void) { uchar Count_Temp; for( Count_Temp=0;Count_Temp { USBBuffer[Count_Temp]=0; } USBData_Len = 0; } /*************************************************************** * 函数名称: USB_Send_Data * 功能描述: CH375发送数据 * 输入参数: 数据以及数据包的长度 * 返回参数: 无 * 补充说明: 长度清零、缓冲区清零 *****************************************************************/ void USB_Send_Data(uchar *USBSendBuffer,uchar SendBuffer_Len) { //add uchar Count_Temp; CH375_WriteCmd(CMD_WR_USB_DATA7); // 向USB端点2或者主机端点的发送缓冲区写入数据块 Delay(2); CH375_WriteData(SendBuffer_Len); Delay(2); for(Count_Temp=0;Count_Temp { CH375_WriteData(*(USBSendBuffer+Count_Temp)); } CH375_Disable(); } /*************************************************************** * 函数名称: USB_int * 功能描述: CH375中断 * 输入参数: 数据以及数据包的长度 * 返回参数: 无 * 补充说明: /* 中断源:INT1 /* 缓冲区:USBBuffer[] /* 长度 :USBData_Len ,Maxlen=64 // CH375中断服务程序,使用寄存器组1 *****************************************************************/ void USB_int() interrupt 0 using 1 { //add uchar USBStatus; // USB中断状态 uchar Count_Temp;
CH375_WriteCmd(CMD_GET_STATUS); // 获取中断状态并取消中断请求 Delay(200); USBStatus = CH375_ReadData(); send_char_com(USBStatus) ; // 程序在这里出错误,发到串口上是0X51 Delay(2); switch(USBStatus) { case USB_INT_EP2_OUT: /* USB端点2的OUT *//* 批量端点下传成功 */ { CH375_WriteCmd(CMD_RD_USB_DATA); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */
说明,设置工作模式成功,电脑可以识别,利用DEBUG372上位机下传数据后,可以进入中断,发送的串口数据为:0x51 【 send_char_com(USBStatus) 】
在你发送获取中断状态之后,也就是你获取的状态为51H的时候。中断引脚是高还是低?
中断引脚是高电平的,因为获取的状态是51H,所有没法执行下面的程序,上位机也就无法收到数据了
那可能读取数据函数有问题,建议你做测试命令的时候先发0XAA数据,读取回来的数据位0X55 在发0X55数据,读取回来的数据应该为0XAA。你看下这样测试命令是否可以。
大侠,我已经做过测试了,上面就是那个源程序,测试没有问题
/*************************************************************** * 函数名称: CH375_ReadData * 功能描述: CH375读数据 * 输入参数: 命令控制字 * 返回参数: 无 * 补充说明: /*2009.07.27 , V2.0 :在子程序中去出了CH375Disable()函数 /* 原因:在批量数据读取时,CS线不能变低。将这部分功能移动到了数据读取完后再进行Disable *****************************************************************/ uchar CH375_ReadData(void) { uchar USBData; CH375_CS=0; CH375_1Cmd_0Data = 0; CH375Port=0XFF; CH375_Read=0; CH375Port=0XFF; Delay(2); USBData=CH375Port; Delay(1); CH375_Read=1; CH375DISABLE(); return USBData; }
大侠,加入 CH375DISABLE();语句后,调试了一下,还是那个问题,原来的 CH375_ReadData()函数是没问题的,要不设置工作模式的时候就不会成功,真是奇怪,还请大侠帮忙再分析一下,谢谢!
如果你单片机IO口不需要设置方向的话时序是没有什么问题的。不知道你单片机的晶振有多快,也不知道你的单片机是不是12个时钟周期为一个机器周期,但我想最慢的6M晶振下函数Delay(9000)延迟也没有50MS。还有检查:1、硬件是不是按照我们手册给的标准接的2、检查芯片是不是工作在并口模式下3、检查你的你的中断引脚有没有可能是被别的什么拉低了,还有你在执行CH375_WriteCmd(CMD_GET_STATUS)后PC端还能看到设备么?
1、大侠,晶振频率22.1184MHZ,单片机是STC89C52,比51快一些,利用示波器测试 Delay(180) 大约1ms,Delay(9000)延时50ms是没有问题的。 2、硬件是按照平口模式连接的,采用IO模拟时序的方法。硬件测试命令和设置工作模式命令都可以成功执行,电脑能够识别CH372/375设备,不过电脑端是 "外部接口" ch372/375设备, 没有在USB总线适配器下面。 3、源程序见上面,没有其它地方的干扰呢,在执行CH375_WriteCmd(CMD_GET_STATUS)后,PC端还是能看到设备的。 4、利用DEBUG372发送下传数据,第一次后,产生中断,串口发51H,然后DEBUG372软件就假死了,打开设备按钮没反应,也没法关闭软件,除非把375硬件设备拔掉,然后重新插上才可以识别,调试了一周了,没有结果,真的不知道哪里出错了,感谢大侠们的指导!非常感谢!
你可以尝试用我们公司提供的TEST.C程序测试,是不是存在你上面的问题