昨天请教了下U盘存在的状态切换,使用DISK_CONNECT,可行。 现在我想U盘拔下,CH376进入低功耗睡眠状态。本来写出这样 weak( );//低功耗 { xWriteCH376Cmd(CMD_ENTER_SLEEP);//进入低功耗状态 while(1) { puts("U盘已经拔出\r\n"); delay_ms(1000); if(CH376DiskConnect()==USB_INT_SUCCESS)//说明U盘插上 { delay_ms(1000);//防止误操作 延时1s再查询是否有U盘 if(CH376DiskConnect()==USB_INT_SUCCESS)//说明U盘的确插上 { flag=1; //确实有U盘 置标志位为1,跳动U盘插入函数执行 break; } } } } 但看说明书上写:单片机向CH376写新命令会退出睡眠状态,所以里面的查询函数不能用,我换成下面的代码,当U盘插入,产生中断,查询中断状态 week()//低功耗 { xWriteCH376Cmd(CMD_ENTER_SLEEP);//进入低功耗状态 while(1) { if( Query376Interrupt( ) )//查询中断状态 出现中断返回1 if(CH376GetIntStatus( )== USB_INT_WAKE_UP) //通常情况下,CH376 芯片从低功耗状态退出并恢复到正常工作状态需要几毫秒的唤醒时间, //当完全恢复到正常工作状态后,CH376 将产生 USB_INT_WAKE_UP 事件中断。 { flag=1;//切换到正常状态 break; } } } 可是实际测试,U盘插入退出不了,不知道怎么回事
估计你没有进入睡眠模式,在发了睡眠命令之后,应该去等CH376的中断引脚是否拉低,拉低之后在去读取中断状态,你主程序明显的有往CH376写命令的操作,怎么可能回进睡眠呢?
我的主程序就一条写命令操作:xWriteCH376Cmd(CMD_ENTER_SLEEP); if( Query376Interrupt( ) ) 这个用来判断 中断引脚是否拉低的
你实际测试 1:是否可以进入睡眠状态? 2:U盘插入后,能否产生中断?中断状态是什么?
好的 1;我给CH376发睡眠命令,用示波器看晶振是否有波形 2:U盘直接插入返回的中断,与CH376在睡眠状态产生的中断是否一样?
CMD_ENTER_SLEEP 该命令使CH376 芯片进入低功耗睡眠挂起状态。进入低功耗状态后,CH376芯片的时钟停振,从 而节约电能,直到检测到以下两种情况之一才退出低功耗状态:一是检测到USB 总线有信号(例如 USB 主机启动传输或者USB 设备插拔事件);二是单片机向CH376 芯片写入新的命令(没有输入数据 的命令,例如CMD_GET_IC_VER 或CMD_ABORT_NAK 命令)。对于SPI 通讯接口方式,SCS片选有效也将 导致CH376退出低功耗状态,所以单片机在发出CMD_ENTER_SLEEP命令后,应该立即使SCS 片选无效。 通常情况下,CH376芯片从低功耗状态退出并恢复到正常工作状态需要几毫秒的唤醒时间,当完 全恢复到正常工作状态后,CH376 将产生USB_INT_WAKE_UP 事件中断