我用的单片机是spce061a。单步调试时测试通过,但是全速运行时没有通过。全速运行我测试返回的数据一直是0xff。我觉得问题的关键就出在CH376读写的时序上,测试命令和输入数据没有进去。但是单步调试时CH376读写是通过的。起初我以为全速运行时速度快,在读写子程序上加了500ms的延时再全速运行,还是不行。这是的读写子程序代码及CH376初始化:unsigned int mInitCH376Host( void ) /* 初始化CH376 */ { unsigned int res; CH376_PORT_INIT( ); /* 接口硬件初始化 */ xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 测试单片机与CH376之间的通讯接口 */ xWriteCH376Data( 0x01 ); res = xReadCH376Data( );

if ( res != 0xfe ) { LCD_Disp_char(0,1,(unsigned char)((res>>4)+0x30)); LCD_Disp_char(1,1,(unsigned char)((res&0x0f)+0x30)); return( ERR_USB_UNKNOWN ); /* 通讯接口不正常,可能原因有:接口连接异常,其它设备影响(片选不唯一),串口波特率,一直在复位,晶振不工作 */ } xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */ xWriteCH376Data( 0x06 ); Delay_n_us( 20 ); res = xReadCH376Data( );

if ( res == CMD_RET_SUCCESS ) { LCD_Disp_String(0,1,"mode_success"); return( USB_INT_SUCCESS ); } else { LCD_Disp_String(0,1,"err_mode"); return(ERR_USB_UNKNOWN ); /* 设置模式错误 */} } void CH376_PORT_INIT( void ) /* 工作于并口方式 */ { *P_IOB_Dir=0xFF0F; *P_IOB_Attrib=0xFF0F; *P_IOB_Data=CMD00_RESET_ALL; CH376_A0_1; CH376_CS_0; CH376_WR_0; Delay_n_ms(5); CH376_CS_1; CH376_WR_1; //必须为高电平 CH376_RD_1; CH376_A0_0; } void xWriteCH376Cmd( unsigned int mCmd ) /* 向CH376写命令 */ { *P_IOB_Dir=0xFF0F; *P_IOB_Data&=0x00ff; *P_IOB_Data|=(mCmd<<8); CH376_A0_1; CH376_CS_0; CH376_WR_0; /* 输出有效写控制信号, 写CH376芯片的命令端口 */ Delay_n_us(2); /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS */ CH376_WR_1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS_1; CH376_A0_0; Delay_n_us(2); /* 延时1.5uS确保读写周期大于1.5uS,或者用状态查询代替 */ } void xWriteCH376Data( unsigned int mData ) /* 向CH376写数据 */ { *P_IOB_Dir=0xFF0F; *P_IOB_Data&=0x00ff; *P_IOB_Data|=(mData<<8); CH376_A0_0; CH376_CS_0; CH376_WR_0; /* 输出有效写控制信号, 写CH376芯片的数据端口 */ Delay_n_us(2); /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS */ CH376_WR_1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS_1; Delay_n_us(1); /* 确保读写周期大于0.6uS */ } unsigned int xReadCH376Data( void ) /* 从CH376读数据 */ { unsigned int mData; Delay_n_us(1); /* 确保读写周期大于0.6uS */ *P_IOB_Dir=0x000F; CH376_A0_0; CH376_CS_0; CH376_RD_0; /* 输出有效读控制信号, 读CH376芯片的数据端口 */ Delay_n_us(2); /* 该操作无意义,仅作延时,CH376要求读写脉冲宽度大于40nS,强烈建议此处执行一条空指令延时以确保并口有足够时间输入数据 */ mData=(*P_IOB_Data&0xff00)>>8; /* 从CH376的并口输入数据 */ CH376_RD_1; /* 输出无效的控制信号, 完成操作CH376芯片 */ CH376_CS_1; return( mData ); }