logo

CH376检测U盘插入和拔出的问题?

    CH376_RST = 1;        /* 复位 */
    delay_ms( 20 );
    CH376_RST = 0;        /* 禁止复位 */
    delay_ms( 100 );        /* 延时100毫秒 */
    while(mInitCH376Host( ) != USB_INT_SUCCESS){

    }

/* 检查U盘是否连接,等待U盘插入,对于SD卡,可以由单片机直接查询SD卡座的插拔状态引脚 */ 
    while ( CH376DiskConnect( ) != USB_INT_SUCCESS ){ 
        delay_ms( 100 );
    }

    delay_ms( 200 );    /* 对于检测到USB设备的,最多等待100*50mS,主要针对有些MP3太慢,对于检测到USB设备
                            并且连接DISK_MOUNTED的,最多等待5*50mS,主要针对DiskReady */ 
    for ( i = 0; i < 100; i ++ ){  
        delay_ms( 50 );
        s = CH376DiskMount( );              /* 初始化磁盘并测试磁盘是否就绪 */  
        if ( s == USB_INT_SUCCESS ){        /* 准备好 */
            break;
        }else if ( s == ERR_DISK_DISCON ){      /* 检测到断开,重新检测并计时 */
            break;
        } 
        if ( CH376GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 ){
        break;}             /* 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS */
    }         
    if ( s == ERR_DISK_DISCON ){
        /* 检测到断开,重新检测并计时 */ 
    }  
    if ( CH376GetDiskStatus( ) < DEF_DISK_MOUNTED ){
        /* 未知USB设备,例如USB键盘、打印机等 */
    }
/* 获取出厂信息 */
    i = CH376ReadBlock( buf );          /* 如果需要,可以读取数据块CH376_CMD_DATA.DiskMountInq,返回长度 */
    if ( i == sizeof( INQUIRY_DATA ) ){  /* U盘的厂商和产品信息 */     
        buf[ i ] = 0;
    }
    s = CH376DiskQuery( (PUINT32)buf ); /* 查询磁盘剩余空间信息,扇区数 */
    strcpy( (char *)TarName, "\\AAAAAAAA.TXT" ); /* 目标文件名 */
    s = CH376FileCreatePath( TarName );   /* 新建多级目录下的文件,支持多级目录路径,输入缓冲区必须在RAM中 */
    strcpy((char *)buf, "兄弟们那个加油哇 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵" );
    s = CH376ByteWrite( buf, strlen((const char *)buf), NULL ); /* 以字节为单位向当前位置写入数据块 */
    s = CH376FileClose( TRUE );   /* 关闭文件,对于字节读写建议自动更新文件长度 */

    while ( CH376DiskConnect( ) == USB_INT_SUCCESS ){  /* 检查U盘是否连接,等待U盘拔出 */

        delay_ms( 100 );
    }




UINT8 mInitCH376Host( void )
{
UINT8 res;
       
    DelayMS(50);                            /* 1.上电延时50mS */

    CH376_PORT_INIT( );                     /* 取消片选 + 上拉中断 */
    xWriteCH376Cmd( CMD11_CHECK_EXIST );    /* 2.发送命令CMD11_CHECK_EXIST(0x06) */
    xWriteCH376Data( 0x55 );                /* 2.发送数据0x55 */               
    res = xReadCH376Data( );                /* 2.读取返回数据 */

    xEndCH376Cmd( );
    if ( res != 0xAA ){                     /* 2.正确返回0xAA,其他错误。 */
        return( ERR_USB_UNKNOWN );          /* 2.检测硬件连接、复位、晶振等 */
    }                                      
    xWriteCH376Cmd( CMD11_SET_USB_MODE );   /* 3.发送命令0x15,即设备USB工作模式。 */
    xWriteCH376Data( 0x06 );                /* 3.发送数据0x06,即U盘模式。0x03为SD卡模式。 */
    DelayUS(20);
    res = xReadCH376Data( );

    xEndCH376Cmd( );

    if ( res == CMD_RET_SUCCESS ){         
        return( USB_INT_SUCCESS );          /* 3.返回0x51,USB事务或者传输操作成功  */
    }else {
        return( ERR_USB_UNKNOWN );          /* 3.设置模式错误 */
    }       
}




CH376S芯片,硬件SPI连接,软件CS片选,使用INT#引脚查询。初始化mInitCH376Host函数返回值是正确的,

但是,CH376DiskConnect()不管U盘插入还是拔出,返回值都是0x14,即USB_INT_SUCCESS。插入U盘不是应该0x15,拔出是0x16吗?这是为什么?



这人很懒,什么都没留下

找到原因,是硬件的问题,没有完全按照PDF的硬件电路。

这人很懒,什么都没留下
只有登录才能回复,可以选择微信和github账号登录