求大家帮忙,51单片机不能通过CH375B向上位机传送数据

[size=4]文字[/size] 我在运行CH372EVT.zip中的test.c时,执行: Delay50ms( );/ CH375_Init( ); 初始化CH375成功,返回的数据也正确,指示灯亮起 EA = 1; /* 允许中断 */ while ( 1 ); 等待中断,但是返回的中断状态是:CMD_RET_SUCCESS 0x51,上位机打开CH375正确,也能向单片机发送数据,但是就是不能接收数据,因为向单片机返回的中断不是预计的USB_INT_EP2_OUT或USB_INT_EP2_IN:

附中断函数: /* 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; } } }

上位机使用什么软件调试的?建议使用CH372DBG,上传的时候要点击上传按钮。


1、CMD_RET_SUCCESS是操作状态,不是中断状态,这个状态有问题,现象准确么? 2、PC接收数据,需要先点击一下上传按钮


上位机的程序是PUB/TEST/WIN/Test.exe,返回的中断状态确实是51H(CMD_RET_SUCCESS),如果测试命令能够通过是不是就说明CH375B芯片能够正常工作呢?我现在不能确定是硬件的问题呢还是软件的问题,求大家再指点指点


附上位机程序: #include #include #include #include #include

#include "CH375DLL.H" // CH375的动态链接库

// 我们在计算机和单片机的应用程序之间约定下传数据的首字节是命令码 #define TEST_DATA 0x21 // 测试数据正确性

//程序入口 void main ( ) { int key; unsigned char mBuffer[100]; unsigned char mReadBuf[100]; unsigned long i, mLength, mTestCount, mErrCnt, mStep, mTotal;

printf( "\nCH372/CH375 Bulk Data Test Program V1.1 , Copyright (C) W.ch 2004.12\n" ); printf( "test data correctness \n" );

// 需要使用DLL则需要先加载,没有此句则会自动加载 printf( "*** Load DLL: CH375DLL.DLL \n" ); if ( LoadLibrary( "CH375DLL.DLL" ) == NULL ) return; // 加载DLL失败,可能未安装到系统中

printf( "*** CH375OpenDevice: 0# \n" ); if ( CH375OpenDevice( 0 ) == INVALID_HANDLE_VALUE ) return; /* 使用之前必须打开设备 */

CH375SetTimeout( 0, 5000, 5000 ); // 设置USB数据读写的超时,超过5000mS未完成读写将强制返回,避免一直等待下去

mErrCnt=0;

printf( "*** Step-1: test data correctness: 10000000 times, random length and data\n" ); for ( mTestCount=0; mTestCount<10000000; ++mTestCount ) // 循环测试 { mStep=mTestCount&0x03; switch( mStep ) { case 0: memset( mBuffer, 0x00, 64 ); // 发送全00H/返回全FFH break; case 1: memset( mBuffer, 0xff, 64 ); // 发送全FFH/返回全00H break; default: for ( i=0; i<64; i++ ) mBuffer[i]=(unsigned char)( rand() ); // 发送随机数/返回位反码 break; } mBuffer[0]=TEST_DATA; mTotal=rand(); // 随机数长度 mTotal=mTotal%100; if ( mTotal == 0 || mTotal > 64 ) mTotal=64; printf( "Cnt=%4ld, Len=%2ld, Data: %02XH,%02XH,%02XH,%02XH,%02XH,%02XH...\xd", mTestCount, mTotal, mBuffer[0], mBuffer[1], mBuffer[2], mBuffer[3], mBuffer[4], mBuffer[5] ); if ( kbhit() ) { key = getch( ); if ( key == 0x1b || key == 0x20 ) { // ESC键或者空格键终止循环 printf( "*** CH375CloseDevice by break: 0 \n" ); CH375CloseDevice( 0 ); exit(2); break; } } if ( CH375WriteData( 0, mBuffer, &mTotal ) ) // 发送成功 { mLength = 64; if ( mTestCount == 0 ) Sleep( 200 ); // 考虑到之前单片机准备上传的数据可能未被计算机取走,导致首次回传有可能直接读到之前的数据而不是本次数据的取反,所以首次回传先等待单片机准备好取反数据 if ( CH375ReadData( 0, mReadBuf, &mLength ) ) // 接收成功 { if ( mLength != mTotal || mLength==0 ) { // 长度错误 mErrCnt++; printf( "S1-T%0ld-C%ld return length error: %ld (%ld)\n", mStep, mTestCount, mLength, mTotal ); } else { for ( i=0; i if ( (mReadBuf[i]^0xff)!=mBuffer[i] ) { // 取反值比较错误 mErrCnt++; printf( "S1-T%0ld-C%ld return data error at %ld: %02XH (%02XH)\n", mStep, mTestCount, i, mReadBuf[i], mBuffer[i] ); } } } } else { // 读操作失败 mErrCnt++; printf( "S1-T%0ld-C%ld CH375ReadData return error, length=%ld\n", mStep, mTestCount, mTotal ); } } else { // 写操作失败 mErrCnt++; printf( "S1-T%0ld-C%ld CH375WriteData return error, length=%ld\n", mStep, mTestCount, mTotal ); } } if ( mErrCnt==0 ) printf( "*** passed \n" ); // 关闭CH375设备,如果不继续使用则必须关闭设备,就象读写完硬盘中的数据文件后要关闭一样 printf( "*** Total error = %ld \n", mErrCnt ); printf( "*** CH375CloseDevice: 0 \n" ); CH375CloseDevice( 0 );

printf( "\nExit.\n" ); getch(); }


版主出来帮帮忙吧!


下载CH372DBG.ZIP,test.c可以与其进行收发调试,分别验证收发通道


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