关于INT信号不变低的问题

我用ch375+44b0实现从功能,pc可以识别到它了,但是当pc不停的向下发数据的时候,INT始终没有拉低,用示波器测不到INT信号,我的程序进不了中断。采用查询也是没有变低,请问有谁遇到类似问题吗?是硬件还是软件问题呢?

附上程序,请高手指教 #include"44b.h" #include "CH375INC.H" #include #include "def.h"

char CH375Interrupt( void ) { /* 清中断 */ rINTPND = 0x00000000; /* 清除所有未决的中断*/ rI_ISPC = 0x03FFFFFF; xWriteCH375Cmd( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ CH375IntStatus = xReadCH375Data( ); /* 获取中断状态 */ return(CH375IntStatus); // if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 检测到USB设备断开事件 */ // else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* */ }

/* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ void xWriteCH375Cmd( UINT8 mCmd ) { Delay(2);/* 至少延时1uS */ CH375_CMD_PORT = mCmd; Delay(2); /* 至少延时2uS */ } /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ void xWriteCH375Data( UINT8 mData ) { CH375_DAT_PORT = mData ; Delay(2); /* 至少延时1.2uS */ } /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ UINT8 xReadCH375Data( void ) { UINT8 mData; Delay(2); /* 至少延时1.2uS */ mData = (UINT8)CH375_DAT_PORT; return( mData ); }

/* 延时指定毫秒时间,根据主频调整,不精确 */ void mDelaymS( UINT32 ms ) { UINT32 i; while ( ms -- ) for ( i = 4000; i != 0; i -- ); }

/* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ while ( 1 ) { mDelaymS( 100 ); } }

/*375自测*/ void CH375_check(void) { unsigned char i,check_value; /* 测试CH375是否正常工作,可选操作,通常不需要 */ xWriteCH375Cmd( CMD_CHECK_EXIST ); /* 测试CH375是否正常工作 */ Delay(5); xWriteCH375Data( 0x55 ); /* 写入测试数据 */ // i = ~ 0x55; /* 返回数据应该是测试数据取反 */ Delay(5); if (xReadCH375Data( )==0xaa) {check_value=xReadCH375Data( );} else { /* CH375不正常 */ for ( i=80; i!=0; i-- ) { xWriteCH375Cmd( CMD_RESET_ALL ); /* 多次重复发命令,执行硬件复位 */ xReadCH375Data( ); } xWriteCH375Cmd( 0 ); mDelaymS(100); /* 延时350ms */ while(1); } }

/* 设置USB工作模式, 必要操作 */ void ch375_mode_set() { unsigned short i; unsigned char value; xWriteCH375Cmd( CMD_SET_USB_MODE ); Delay(5); xWriteCH375Data(0x02 ); /* 设置为使用内置固件的USB设备方式 */ Delay(5); for ( i=2000; i!=0; i-- ) {/* 等待操作成功,通常需要等待10uS-20uS */ value=xReadCH375Data( ); if ( value == CMD_RET_SUCCESS ) break; } if ( i==0 ) { //CH372/CH375存在硬件错误 while(1); }; }

void Main(void) {

UINT8 i,length=0;

UINT8 buffer[64]; while(1); Port_Init();

/* CH375 复位 */ // CH375Reset( ); // Delay(50000); /* 延时50ms */

/* 初始化CH375程序库和CH375芯片,操作成功返回0 */ // i = CH375LibInit( ); // mStopIfError( i );

CH375_check( ); CH375_PORT_INIT( );

while ( 1 ) { /* 查询CH375中断并更新中断状态,等待U盘插入 */ while(!(rPDATG&0x2)); ch375_mode_set(); Delay( 100000 ); switch ( CH375IntStatus ) { /* 分析中断状态处理 */ case USB_INT_EP2_OUT: { /* 批量端点下传成功 */ xWriteCH375Cmd( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ length = xReadCH375Data( ); /* 首先读取后续数据长度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = xReadCH375Data( ); /* 接收数据包 */ /* 测试数据正确性,将接收到的命令包数据取反后返回给PC机 */ xWriteCH375Cmd( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ xWriteCH375Data( length ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ for ( i = 0; i < length; i ++ ) xWriteCH375Data( ~ buffer[ i ] ); /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ break; } case USB_INT_EP2_IN: { /* 批量数据发送成功 */ xWriteCH375Cmd( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } default: { /* 其它中断,未用到,解锁后退出即可 */ xWriteCH375Cmd( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } } } }


/* CH375 复位 */ CH375Reset( ); Delay(50000); /* 延时50ms */ /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ i = CH375LibInit( ); mStopIfError( i ); 请问上面的复位和初始化是否一定要,为什么沁恒的库里没有提供函数实体???


反正我知道初始化是一定要的~~


但是它的子程序库里没有初始化的函数实体,尤其是UINT8 CH375Init( void ) /* 初始化CH375 */ 这个函数,就一个外部申明,我该怎么写呢? 能不能发个给我 个人信息保护,已隐藏


void CH375_INT( ) { 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( 6); /* 设置为使用主机模式 */ for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break;} }


UINT8 CH375LibInit( void ) /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ { CH375LibConfig = LIB_CFG_VALUE; /* CH375程序库配置值 */ DISK_BASE_BUF[0] = 0; /* 该操作无意义,只是为了防止编译器优化时不产生DISK_BASE_BUF缓冲区 */ if ( CH375GetVer( ) < CH375_LIB_VER ) return( 0xFF ); /* 获取当前子程序库的版本号,版本太低则返回错误 */ return( CH375_Init( ) ); /* 初始化CH375 */ } CH375_Init( )函数是有返回值的,你的函数好像没有返回值啊。那 i = CH375LibInit( ); mStopIfError( i );就编译不过了


我测到中断信号了,获得状态是对的,但是读取的长度还是不对为0


我用CH375做从模式,调通很久了。但运行一直不太稳定。真晕。


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