[求助]ch375传送数据出错了?

我用CH375当设备传送数据出错了,但不知道怎么改,请帮我看看程序,谢谢了!这是我下位机的程序. /* ; CH375/CH372 Bulk Data Test ; U2(AT89C51) Program ; 本程序测试数据传输的正确性,可以用于长时间连续测试,对应的计算机端的测试程序为TEST.EXE ; 方法: 下传随机长度的随机数据包,被单片机接收并将数据按位取反后返回,最终由计算机程序接收后比较数据是否正确 ; ; Website: http://winchiphead.com ; Email: 个人信息保护,已隐藏 ; Author: W.ch 2003.09 */

/* MCS-51单片机C语言的示例程序,用于其它单片机时一般只要修改前面几个接口子程序及硬件定义 */

#pragma NOAREGS #include #include #include #include

#include "CH375INC.H" /* 头文件,在网上下载的CH372或者CH375评估板资料中有 */

unsigned char volatile xdata CH375_CMD_PORT _at_ 0x7FF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0x7FF0; /* CH375数据端口的I/O地址 */ unsigned char flag = 0xff; #define INT16U unsigned int #define INT8U unsigned char //**********I/O口定义**********// #define LCD_DB P1 sbit LCD_RS = P3^4; sbit LCD_RW = P3^4; sbit LCD_E = P3^3; sbit LCD_RET = P2^5; //**********缓存区定义**********// xdata INT8U GrapTemp_X[64] ; xdata INT8U GrapTemp_Y[64] ; INT8U count = 0; //**********函数定义**********// void Delay(INT16U j); void Ini_SYSCLK(void); void Ini_PORT(void); void Ini_LCD(void); void ClrGrap_LCD(void); void LCD_P_Ready(void); void LCD_P_W_Command(INT8U Command); void LCD_P_W_Data(INT8U Data); void Point_LCD(void);

/***********************************************************

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

/* 延时1微秒,不精确,因为MCS51单片机较慢所以实际上无需延时 */ //void delay1us( ) //{ // unsigned char i; // for ( i = 1; 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; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 获取中断状态 */ switch ( InterruptStatus ) { /* 分析中断状态处理 */

case USB_INT_EP2_IN: { /* 批量数据发送成功 */

CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ if( 0xff == flag ) { flag = 0; length = 64; 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( GrapTemp_Y[i] ); } CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ } else { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ } break; } default: { /* 其它中断,未用到,解锁后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } } }

main( ) { INT8U i, length;

EA = 0; Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */ CH375_Init( ); /* 初始化CH375 */ Ini_LCD(); length = 64; memset(GrapTemp_X, 0x00, 64); memset(GrapTemp_Y, 0x00, 64); Delay(50000); GrapTemp_X[64] = {8,8,8,8,5,8,10,5,6,8,11,4,5,8,12,4,8,12,13,3,8,13,14,2,8,14,15,1,8,14,8,8,8,6,8,7} GrapTemp_Y[64] = {1,2,3,4,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,12,13,14,15,15,16} ///////////////////////////////////////ch375传送数据///////////////////////// CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ CH375_WR_DAT_PORT( 64 ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ for( i = 0; i < 64; i ++ ) { CH375_WR_DAT_PORT( GrapTemp_X[i] ); } /////////////////////////////////////////////////////////////////////////// LCD_P_W_Command(0x36); EA = 1; /* 允许中断 */ while ( 1 ); /* 以下指令开始工作循环,等待PC机命令进行操作 */ }

上传的数据出错?你只要根据硬件改下端口定义就可以了,其它不需要修改的,直接用TEST.C 你程序中释放当前USB缓冲区过多,多了或少了都会出错. 用下面程序试下: case USB_INT_EP2_IN: { /* 批量数据发送成功 */

CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ if( 0xff == flag ) { flag = 0; length = 64; 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( GrapTemp_Y[i] ); } //CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ }

else { //CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ } break; } default: { /* 其它中断,未用到,解锁后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } } } main( ) { unsigned char i,c; Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */ CH375_Init( ); /* 初始化CH375 */ while(1){ /*用来确定主机是否准备好*/ Delay50ms(); CH375_WR_CMD_PORT(0x0a);//GET_TOGGLE命令 CH375_WR_DAT_PORT(0x20); c=CH375_RD_DAT_PORT(); if((c&0x20)==0x20)break; } Delay50ms(); CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ CH375_WR_DAT_PORT( 64 ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ for( i = 0; i < 64; i ++ ) { CH375_WR_DAT_PORT( GrapTemp_X [i]); }

EA = 1; /* 允许中断 */ while ( 1 ); /* 以下指令开始工作循环,等待PC机命令进行操作 */ }


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