CH372上下位机数据传输的问题

我采用了上位机软件用:CH372DBG.ZIP\DEBUG372\Release\DEBUG372.EXE, 下位机用:CH372EVT.ZIP\PUB\TEST\MCU\TEST.C,先进行简单调试。 我采用了这样一种方式来进行调试的,因为我的硬件有所不同,所以对test.c程序进行了一些改动,问题是:中断程序进去不了,利用release的上位机界面下传数据的时候,“数据端点2”下传长度和数据我分别填写了“1”“55”,点击确定后,没有反应,再次点击就不能继续了。

如何让INT拉低电平而进入中断函数里面啊???

附上我的程序:请高手给予意见啊,谢谢

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

sbit CH375_A0 = P3^7; /*地址线输入A0,A0=1时写命令,A0=0时读写数据*/ sbit CH375_RD = P3^5; /*读选通输入,低电平有效*/ sbit CH375_WR = P3^4; /*写选通输入,低电平有效*/ sbit CH375_INT_WIRE = P3^3; /*中断请求输出,低电平有效*/

#define CH375_D0_D7 P1 /*端口的IO地址*/ file://volatile unsigned char rd_dat;

void delay50ms(void); void delay2s(void);

void CH375_WR_CMD_PORT( unsigned char cmd ); void CH375_WR_DAT_PORT( unsigned char dat ); unsigned char CH375_RD_DAT_PORT(void);

void set_usb_mode( unsigned char mode ); void CH375_Init( void );

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

/* 延时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; // ******************** 注释中是用普通I/O引脚模拟8位并口的时序,CH375_CS引脚是可选的,可以一直接GND强制片选 CH375_D0_D7 = cmd; CH375_A0 = 1; /*选择CH375的命令口*/ // CH375_D0_D7_DIR = output; /*对于标准双向I/O,请在此设置为输出方向*/ CH375_RD = 1; /*如果I/O默认电平是高电平,那么这是可选操作*/ // CH375_CS = 0; CH375_WR = 0; // CH375_CS = 0; 对于高速单片机,该指令用于延时,以便向CH375_WR产生宽度至少为80nS的低电平脉冲 CH375_WR = 1; // CH375_CS = 1; CH375_A0 = 0; // CH375_D0_D7_DIR = input; /*对于标准双向I/O,请在此设置为输入方向*/ CH375_D0_D7 = 0xFF; /*对于准双向I/O,请在此设置输出全高电平*/ file://******************** delay2us(); }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ // CH375_DAT_PORT=dat; // ******************** 注释中是用普通I/O引脚模拟8位并口的时序 CH375_D0_D7 = dat; // CH375_D0_D7_DIR = output; /*对于标准双向I/O,请在此设置为输出方向*/ // CH375_CS = 0; CH375_WR = 0; // CH375_CS = 0; 对于高速单片机,该指令用于延时,以便向CH375_WR产生宽度至少为80nS的低电平脉冲 CH375_WR = 1; // CH375_CS = 1; // CH375_D0_D7_DIR = input; /*对于标准双向I/O,请在此设置为输入方向*/ CH375_D0_D7 = 0xFF; /*对于准双向I/O,请在此设置输出全高电平*/ file://******************** // delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */ }

unsigned char CH375_RD_DAT_PORT(void) { unsigned char rev_data; CH375_D0_D7 = 0xFF; CH375_A0 = 0; /* 数据 */ CH375_WR = 1; CH375_RD = 0;

rev_data = CH375_D0_D7; CH375_RD = 1; return( rev_data ); }

void set_usb_mode( unsigned char mode ) { unsigned char i; unsigned char RD_Data1; CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( mode ); for( i=100; i!=0; i-- ) /* 等待设置模式操作完成,不超过30uS */ { RD_Data1=CH375_RD_DAT_PORT(); if( RD_Data1 == CMD_RET_SUCCESS ) return; /* 成功 */ } }

/* CH375初始化子程序 */ void CH375_Init( void ) { unsigned char i,k; unsigned char RD_Data2; CH375_D0_D7 = 0xFF; CH375_INT_WIRE = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; /* 测试CH375是否正常工作 */ for( k=100; k!=0; k-- ) { CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 测试CH375是否正常工作 */ i = 0x55; CH375_WR_DAT_PORT( i ); /* 写入测试数据 */ i = ~i; /* 返回数据应该是测试数据取反 */ RD_Data2 = CH375_RD_DAT_PORT(); if ( RD_Data2 != i ) /* CH375不正常 */ { for ( i=5; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重复发命令,执行硬件复位 */ } delay50ms(); /* 延时50ms */ } else break; } /* 设置USB工作模式, 必要操作 */

set_usb_mode( 2 ); file://内部固件模式

/* if ( i==0 ) { CH372/CH375存在硬件错误 }; */ /* 下述启用中断,假定CH375连接在INT1*/ IT1 = 0; /* 置外部信号为低电平触发 */ IE1 = 0; /* 清中断标志 */ EX1 = 1; /* 允许CH375中断 */ }

/* CH375中断服务程序,使用寄存器组1 */ void mCh375Interrupt( ) interrupt 2 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; } } }

main( ) { int i; Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */ CH375_Init( ); /* 初始化CH375 */ EA = 1; /* 允许中断 */ while ( 1 ); }

如果计算机可以找到新的硬件的话,那么,你用我们的372DEBUG下传数据的话,那么,372的中断引脚会变低的。你可以按照上面的步骤,你观测下中断引脚有没有变低


我按照完整的步骤来操作的,中断引脚没有变低。我的程序有问题吗?

“数据端点2”下传数据的格式怎么写?长度为1 数据为55 这样符合要求吗?


计算机管理器中一直能看到USB CH372/375吗? 会不会是其他引脚将它拉高了,你将中断INT#引脚翘起来,在往下发数据时看一下CH372的INT#引脚有没有拉低。


我的CH372能下传数据,但不能上传数据,这是怎么回事啊 ?


你可以这样做下,在下传数据成功之后,在上传数据看下可以不可以。


计算机管理器中一直能看到USB CH372/375吗? 会不会是其他引脚将它拉高了,你将中断INT#引脚翘起来,在往下发数据时看一下CH372的INT#引脚有没有拉低 --------------- 在设备管理器里面可以一直看到USB CH372的 我将INT#翘起来了的,用debug往下发送数据,测得CH372的INT# 引脚仍旧是高的

我该怀疑这个芯片坏了吗?


我感觉好像是芯片有问题, 那你的CH372能上传数据吗? 看看上传数据时1脚有没有中断?


hcn 正如你所说的,先下传数据成功后,再上传数据,按照这样的顺序能上传数据, 这是程序的问题吗?

是不是在CH372上电后延时一段时间啊,再对CH372进行操作啊? 那延时多长时间?

请指点 谢谢了


372上电延时的时间在50-100MS之间,这个不是程序的问题,在USB协议里面,所有的数据传输都是由USB主机来发起的,对于372芯片来说,是做设备的,所以在设备首先想传输数据的时候,需要通知主机设备有没有准备好,所以,在372想首先发起数据传输的时候,需要发送一个命令来通知主机,如果你需要的话,可以发一个E-MAIL到:tech@wch.cn,我们给你发一个首先由372传输数据的例子程序给你.


是不是你用了INT1的问题?你留着INT0干什么用啊?


INT0脚悬空在,这个,和外界的哪一个INT没有关系吧? 在程序里面体现一下就好了对吧? 关键是CH372的INT#老是不能拉低,甚是头疼


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