我上位机用DEBUG372.EXE,端点1我上传了几个数,端点2我也上传了几个具体的数是正常的。下传端点2是DEBUG372.EXE显示的发出的“数据个数”也是正常的。但是我想让端点2下传的数取反再上传,DEBUG372.EXE显示的个数和数据很多时候是不对的。您说这是不是端点2下传时出现问题?该怎么解决呢?
如果延时不对,会造成这种情况吗?
上位机调试软件是用的我们提供的DEBUG372.exe吗? 下位机程序参考我们的TEST.C程序,顺便把你的CH372的读写子函数贴出来看看
是参考的TEST。C。中断部分是这样的,用的是11.0592的晶振。
/* CH375中断服务程序INT3,使用寄存器组1 */ void mCh375Interrupt( ) interrupt 3using 1
{
unsigned char i; unsigned char InterruptStatus; unsigned char length; unsigned char xdata buffer[ 64 ]; Delay2us( ); CH375_CMD_PORT = CMD_GET_STATUS; /* 获取中断状态并取消中断请求 */ Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ InterruptStatus = CH375_DAT_PORT; /* 获取中断状态 */
switch ( InterruptStatus ){ case USB_INT_EP2_OUT: { /* 批量端点下传成功 */ Delay2us( ); CH375_CMD_PORT = CMD_RD_USB_DATA; /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ length = CH375_DAT_PORT; /* 首先读取后续数据长度 */ Delay2us( ); // Delay2us( ); for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_DAT_PORT; EX3 = 0; /* 测试数据正确性,将接收到的命令包数据取反后返回给PC机 */ CH375_CMD_PORT= CMD_WR_USB_DATA7 ; /* 向USB端点2的发送缓冲区写入数据块 */ Delay2us( ); CH375_DAT_PORT =length; /* 首先写入后续数据长度,回传刚接收到的数据长度 */ // Delay2us( ); for ( i = 0; i < length; i ++ ) { CH375_DAT_PORT= ~ buffer[ i ] ;} /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ //CH375_DAT_PORT = 3; /* 发送中断数据1 */ // CH375_DAT_PORT = 1; /* 发送中断数据2 */ EX3 = 1; /* 允许中断*/
EX3 = 0; CH375_CMD_PORT = CMD_WR_USB_DATA5; /* 向USB端点1的发送缓冲区写入数据块 */ Delay2us( ); CH375_DAT_PORT =3 ; /* 后续数据长度 */
CH375_DAT_PORT = 3; CH375_DAT_PORT = 3; /* 发送中断数据1 */ CH375_DAT_PORT = 1; /* 发送中断数据2 */ EX3 = 1; /* 允许中断*/
break; }
case USB_INT_EP2_IN: { /* 批量数据发送成功 */ CH375_CMD_PORT= CMD_UNLOCK_USB ; /* 释放当前USB缓冲区 */ break; } case USB_INT_EP1_IN: { /* 批量数据发送成功 */ CH375_CMD_PORT= CMD_UNLOCK_USB ; /* 释放当前USB缓冲区 */ break; } default: { /* 其它中断,未用到,解锁后退出即可 */ CH375_CMD_PORT= CMD_UNLOCK_USB ; /* 释放当前USB缓冲区 */ break; }
} } 我想想让端点2下传的数取反再上传,结果数据个数一下子老多,数也好多时候不对。
发数据的时候不要加空格。比如发送0XAA,0X55数据的时候,直接写AA55,另外你怎么判断你下传的数据没有问题的?建议你先监视一下下传的数据,然后在看看上传的是什么数据。
没有加空格,端点1和2如果用这个程序上传具体数的时候应用程序受到是正确的。但是我把端点2下传的数据取反 CH375_DAT_PORT =length; /* 首先写入后续数据长度,回传刚接收到的数据长度 */ // Delay2us( ); for ( i = 0; i < length; i ++ ) { CH375_DAT_PORT= ~ buffer[ i ] } /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ 取反上传到端点2,端点2上传是错误的。比如我端点2下传1个数据11,端点2出来十几个EE,有时是1个。有时数也不对。因为这个板子下传时还不能通过显示看数据,只能先用调试工具了。
所以我觉得是不是端点2下传时就有问题?
您说的监视是用专门的监视工具拦截数据吗?
用BUSHOUND软件可以看到上下位机的通讯数据,上位机软件是你自己写的还是在网站上下载的。 /* CH375中断服务程序INT3,使用寄存器组1 */ void mCh375Interrupt( ) interrupt 3 using 1
{
unsigned char i; unsigned char InterruptStatus; unsigned char length; unsigned char xdata buffer[ 64 ]; CH375_CMD_PORT = CMD_GET_STATUS; /* 获取中断状态并取消中断请求 */ Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ InterruptStatus = CH375_DAT_PORT; /* 获取中断状态 */
switch ( InterruptStatus ){ case USB_INT_EP2_OUT: { /* 批量端点下传成功 */ Delay2us( ); CH375_CMD_PORT = CMD_RD_USB_DATA; /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ length = CH375_DAT_PORT; /* 首先读取后续数据长度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_DAT_PORT; CH375_CMD_PORT= CMD_WR_USB_DATA7 /* 向USB端点2的发送缓冲区写入数据块 */ Delay2us( ); CH375_DAT_PORT =length; /* 首先写入后续数据长度,回传刚接收到的数据长度 */
for ( i = 0; i < length; i ++ ) { CH375_DAT_PORT= ~ buffer[ i ] } /* 数据取反后返回,由计算机应用程序测试数据是否正确 */
CH375_CMD_PORT = CMD_WR_USB_DATA5; /* 向USB端点1的发送缓冲区写入数据块 */ Delay2us( ); CH375_DAT_PORT =3 /* 后续数据长度 */ CH375_DAT_PORT = 3; CH375_DAT_PORT = 3; /* 发送中断数据1 */ CH375_DAT_PORT = 1; /* 发送中断数据2 */ break; }
case USB_INT_EP2_IN: { /* 批量数据发送成功 */ CH375_CMD_PORT= CMD_UNLOCK_USB /* 释放当前USB缓冲区 */ break; } case USB_INT_EP1_IN: { /* 批量数据发送成功 */ CH375_CMD_PORT= CMD_UNLOCK_USB /* 释放当前USB缓冲区 */ break; } default: { /* 其它中断,未用到,解锁后退出即可 */ CH375_CMD_PORT= CMD_UNLOCK_USB /* 释放当前USB缓冲区 */ break; }
} }
是我参考TEST。C然后修改的。我加了个端点1上传。然后延时什么的也没有细考虑。BUSHOUND软件从网站就能下是吗?
我们网站没有,到百度,GOOGLE....
刚理解错了,你说的上位机程序,我理解成下位机了。上位机用的就是咱们的DEBUG372.EXE,从咱们网站上下载的。CH272DEBUG。Zip里的那个可以进行端点2上下传,端点1上传的那个调试软件。
下传的数据可以通过串口发送出来,接收倒数据后,从串口发送,这样就可以监视你接收的数据是否正确了。 如果接收的数据正确则不存在上传的数据错误的现象,另外程序简单写,不要写这么复杂。 void mCh375Interrupt( ) interrupt 3 using 1
{
unsigned char i; unsigned char InterruptStatus; unsigned char length; unsigned char xdata buffer[ 64 ]; CH375_CMD_PORT = CMD_GET_STATUS; /* 获取中断状态并取消中断请求 */ Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ InterruptStatus = CH375_DAT_PORT; /* 获取中断状态 */
switch ( InterruptStatus ){ case USB_INT_EP2_OUT: { /* 批量端点下传成功 */ Delay2us( ); CH375_CMD_PORT = CMD_RD_USB_DATA; /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ length = CH375_DAT_PORT; /* 首先读取后续数据长度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_DAT_PORT; CH375_CMD_PORT= CMD_WR_USB_DATA7 /* 向USB端点2的发送缓冲区写入数据块 */ Delay2us( ); CH375_DAT_PORT =length; /* 首先写入后续数据长度,回传刚接收到的数据长度 */
for ( i = 0; i < length; i ++ ) { CH375_DAT_PORT= ~ buffer[ i ] } /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ break; }
case USB_INT_EP2_IN: { /* 批量数据发送成功 */ CH375_CMD_PORT= CMD_UNLOCK_USB /* 释放当前USB缓冲区 */ break; } case USB_INT_EP1_IN: { /* 批量数据发送成功 */ CH375_CMD_PORT= CMD_UNLOCK_USB /* 释放当前USB缓冲区 */ break; } default: { /* 其它中断,未用到,解锁后退出即可 */ CH375_CMD_PORT= CMD_UNLOCK_USB /* 释放当前USB缓冲区 */ break; }
} } 另外你用的MCU的型号是什么?有多少XRAM?
串口发出去的话,串口给显示程序吗?可是显示这部分这个板子用的比较复杂还没法用呢。 MCU的型号是W77EL58,1KB片上外部数据存储器。 刚用BUSHOUND软件可以看到下发的数据比如发送11,就显示11
是W77LE58,刚才写错了。
可是用调试工具感觉和DEBUG372.EXE效果一样的。发的数据和收的数据显示出来了。