我使用ch375做的一个电路板与pc通讯,使用demo里提供的初始化与中断设置,在不操作其它硬件的情况下,正常使用,当时一操作其它硬件,进入中断的时候读取中断状态的时候,ch375就断开,在中断中不操作ch375没问题,调试使用的ch372debug。exe,不知道什么原因
可以把你的代码贴出来看看,你这样做一下实验,当你读状态的时候,26,25引脚会不会有电平变化,有变化说明被复位了.
谢谢我先测一下电压
25,26脚的电压没有变化 下面是我的代码 /*USB设备的初始化 */ 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中断 */ }
/*USB的中断处理*/ void Ch375Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char i, length;
CH375_WR_CMD_PORT ( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 获取中断状态 */ IE0 = 0; 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( ); /* 接收数据包 */ delay2us(); /* 测试数据正确性,将接收到的命令包数据取反后返回给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; } case USB_INT_EP1_OUT: { /* 中断数据接受成功 */ break; } case USB_INT_EP1_IN: { /* 中断数据发送成功 */ bUsbSend = 0; // CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } default: { /* 其它中断,未用到,解锁后退出即可 */ // CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } } }
我的程序中还使用51的uart进行串口通讯,不知有影响没?
别光看呀,各位过路的同志提个建议先
所有的函数里面USB-ULOCK命令要全部打开,还有就是你需要读取数据,否则的话你发送一次完了之后后面没办法进行操作.
打开的情况我试了一下,还是出现问题,单独不操作其它硬件的情况下比如ad,串口,通讯正常是否与其他操作存在冲突,如存在,可能是哪里,是软件还是硬件
如果你只设置模式打开设备还失败的话,那你就需要检查下USB口上面是不是存在问题?包括共地性能,V3引脚的电容是多少?等等.
地址设置是否有冲突,在数据线和控制线共用的时候,操作其它器件的时候不能片选ch375,同样操作CH375的时候不能片选其他硬件
地址没有冲突的,v3电容也检查了,接地使用的覆铜接地
实际的器件地址如下: unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBFFF; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xB7FF; /* CH375数据端口的I/O地址 */
unsigned char volatile xdata XCMD_PORT _at_ 0xFAFF; /* x命令端口的I/O地址 */ unsigned char volatile xdata XDAT_PORT _at_ 0xF8FF; /* x数据端口的I/O地址 */ unsigned char volatile xdata YCMD_PORT _at_ 0xFEFF; /* y命令端口的I/O地址 */ unsigned char volatile xdata YDAT_PORT _at_ 0xFCFF; /* y数据端口的I/O地址 */
帮忙看看,
reti接的是0.47 v3电容0.01
单独的usb访问硬件并通讯没有问题,同时加入串口就出现问题,同时单独的串口通讯没有问题
那需要看下你加上串口之后的程序,你可以把程序发到我们的技术支持信箱:tech@wch.cn,我们帮您分析下看会是哪的问题