[求助,急]关于CH372的下传,麻烦各位大侠指点

中断服务程序如下所示,使用外部中断1,选用内置固件模式。程序接收PC发来的数据,然后将数据长度返回给PC。其中usbLength和usbBuffer[]为全局变量,已定义。 中断服务程序如下: void mCH375Interrupt( void ) interrupt 2 using 1 //INT1对应中断号2 { unsigned char i; unsigned char IntStatus; CH372_WR_CMD_PORT( CMD_GET_STATUS ); //获取中断状态并取消中断请求 IntStatus = CH372_RD_DAT_PORT( ); //获取中断状态 IE1 = 0; //清INT1中断标志 if ( IntStatus == USB_INT_EP2_OUT ) //批量端点下传成功,接收到命令包 { CH372_WR_CMD_PORT( CMD_RD_USB_DATA ); //从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 usbLength = CH372_RD_DAT_PORT( ); //首先读取后续数据流的长度 for(i=0;i usbBuffer[i] = CH372_RD_DAT_PORT( ); //接收命令包的数据 CH372_WR_CMD_PORT( CMD_WR_USB_DATA7 ); //向USB端点2的发送缓冲区写入数据块 CH372_WR_DAT_PORT( 1 ); CH372_WR_DAT_PORT(usbLength);//返回usbBuffer的数据长度 } else if ( IntStatus == USB_INT_EP2_IN ) //批量数据发送成功,状态包已发送 { CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); } else return; //内置固件的USB方式下不应该出现其它中断状态 } 当下传的数据的长度大于等于64时,显示的数据长度正确;当下传的数据长度大于64时,返回的数据长度不正确,比如长度为65到73时,返回长度是1;再往上时,是除以64所得到余数

这点令我很是奇怪,是固件程序除了问题,,还是别的什么问题 上位机程序是组内另一个同事编写的,参照提供的例子程序,各位大侠麻烦帮忙看看是什么问题引起的?

你可以这样,先不要用你同事写的上位机程序,你直接用我们的CH375DUG的上位机调试工具来调试你的数据是不是正确,如果正确的话,那就说明你的下位机程序没问题,如果有问题的话那就是下位机程序有问题,象你这种情况在出现长度大于64的时候,应该出现2次中断,先传64字节,接着在传剩下的字节数,还有就是你程序里面的CH372_WR_CMD_PORT( CMD_WR_USB_DATA7 ); 之后你写了个命令是CH372_WR_DAT_PORT( 1 );什么意思??


之后的CH372_WR_DAT_PORT( 1 );命令是写入数据长度,因为只返回从上位机接收的数据长度,故为1


这样的话,你用我们的CH372DUG来调试看下是不是你要得到的数据,我刚才用CH372DEBUG试了我自己改的程序,是没有错的,你拿这段程序试下看可以不可以: #pragma NOAREGS #include #include #include "CH375INC.H" /* 头文件,在网上下载的CH372或者CH375评估板资料中有 */

unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375数据端口的I/O地址 */

/* 延时2微秒,不精确 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); /* 根据单片机的时钟选择初值 */ }

/* 基本操作 */

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

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

}

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

return( CH375_DAT_PORT ); }

/* 延时50毫秒,不精确 */ void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }

/* CH375初始化子程序 */ void CH375_Init( ) { unsigned char i; /* 测试CH375是否正常工作,可选操作,通常不需要 */ CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 测试CH375是否正常工作 */ 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; /* 清中断标志 */ EX0 = 1; /* 允许CH375中断 */ }

/* 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( 1 ); /* 向USB端点2的发送缓冲区写入数据块 */ CH375_WR_DAT_PORT( length ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ 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( ) { Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */ CH375_Init( ); /* 初始化CH375 */ EA = 1; /* 允许中断 */ while ( 1 ); /* 以下指令开始工作循环,等待PC机命令进行操作 */ }


hcn,我看你程序中用的是CH375_WR_CMD_PORT( 1 ); 应该是写数据CH372_WR_DAT_PORT( 1 );吧,还是两者都可以? 我试了下两者出现的现象是一样的,很奇怪


应该是CH372_WR_DAT_PORT( 1 );,不好意思错拉,你试了还是这种问题吗?? 还有就是有时候在A0为1的时候也是可以传送数据的,也就是说你将你的A0始终为1的话也是可以操作的,但是这种情况不是很保险,所以我们建议用户用A0=1来表示命令,A0=0表示数据


哦,这样啊 明白,多谢 我试了多次还是同样的情况,用你们的提供的上位机调试程序DEBUG372也是这样的,很奇怪


不会啊!我用了CH375DEBUG的调试工具,用我自己的程序试了,没有问题啊!!输入的数据应该是16进制数据


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