CH376检测不到U盘

在使用贵公司CH376评估板时,检测不到U盘.初始化376正常,但是到了检测U盘是否连接时,用DEBUG.C观察,一直输出 Start Wait Udisk/SD 这是什么原因了??或者我可以用什么办法进一步调试呢??本人新手,望不吝赐教,谢谢

使用的程序是参考贵公司提供的EXAM8,就改了硬件连接部分,初始化能成功,说明硬件应该没什么问题吧


单片机的RAM有没有溢出?


关于中断定义是否正确?和实际连接的是否一致? 当插入U盘后,中断引脚是否有中断输出?MCU是否能够检测到?


我用示波器测了一下INT#脚: 不连接U盘的情况下,是一个15ms宽周期两秒的正脉冲 连接U盘后,是一个15ms宽周期两秒的负脉冲 这是什么原因???连U盘跟不连U盘输出相反??


单片机RAM没有益处,我外扩了32K. 而且我用串口调试助手观察,一直输出Start Wait Udisk/SD,但是按照程序,他不是应该只输出一次Start Wait Udisk/SD就行了吗,然后等待U盘连接..我插上U盘,他还是输出Start Wait Udisk/SD


如果一直输出Start Wait Udisk/SD,那么程序应该是在复位,程序编译链接有没有异常警告阿


还是程序有点问题, 你把这部分贴出来看看,不应该老是输出的。


UINT8 s; UINT8 month, date, hour; UINT16 year, adc; P4SW=0x10; P4_4=0; Delayzz(100000); /*while(1) { P1_2=0;Delayzz(25000); P1_2=1;Delayzz(25000); }*/ P1_0=0; mDelaymS( 1000 ); /* 延时100毫秒 */ mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */ printf( "Start\n" );

s = mInitCH376Host( ); /* 初始化CH376 */ /*while(s==USB_INT_SUCCESS) {while(1) { P1_2=0;Delayzz(25000); P1_2=1;Delayzz(25000); }}*/ mStopIfError( s ); /* 其它电路初始化 */ while(1);//标志 谢谢SCM的提醒,但是我在主函数中加了一个while(1)测试,发现程序不在一直复位(若一直复位应该输出Start,但他只输出一次); 于是我把标志那一行换成了检查磁盘连接的函数CH376DiskConnect( ); 结果程序就一直复位,即一直输出Start, CH376DiskConnect( );函数对程序有什么影响吗?


而且此时INT#脚输出的是一个15ms宽周期两秒的正脉冲


CH376DiskConnect( );这个函数有原型,你找到这个代码看一下,就读了一下中断状态而已。没做什么。 因为老是重复执行s = mInitCH376Host( ); ,所以CH376不断的能检测到U盘连接,不断的产生中断。这就是不断产生中断的原因。 你把主函数所有的部分打包上传。你贴的函数很多地方是看不到的。 你把标注这一行换成 CH376DiskConnect( ); 后面要加while(1); 否则的话,程序执行完CH376DiskConnect( );后MCU不知道怎么执行了,PC值重新开始执行,你看到的现象就是一直复位。PC从0考试执行了 建议你直接用我们提供的CH376HFT.C,就不会有这种问题。


谢谢红桃六,我在CH376DiskConnect( );后面加了while(1);程序还是会出现复位 我贴的就是主函数了,就是按照CH376HFT.C来的 void main( ) { UINT8 s; UINT8 month, date, hour; UINT16 year, adc; P4SW=0x10; //这两句是我设置的P4口,与U盘连接无关 P4_4=0; Delayzz(100000); /延时 /*while(1) { P1_2=0;Delayzz(25000); P1_2=1;Delayzz(25000); }*/ P1_0=0; //标志灯,与U盘连接无关 mDelaymS( 1000 ); /* 延时100毫秒 */ mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */ printf( "Start\n" );

s = mInitCH376Host( ); /* 初始化CH376 */ /*while(s==USB_INT_SUCCESS) {while(1) { P1_2=0;Delayzz(25000); P1_2=1;Delayzz(25000); }}*/ //测试用,与U盘连接无关 mStopIfError( s ); /* 其它电路初始化 */ CH376DiskConnect( ); //用串口助手观察,执行到这程序就一直复位,曲调他就不会 while(1); while ( 1 ) { printf( "Wait Udisk/SD\n" ); s=CH376DiskConnect( ); printf( "Error: %02X\n", s ); //s=CH376DiskConnect( );mStopIfError( s ); while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) { /* 检查U盘是否连接,等待U盘插入,对于SD卡,可以由单片机直接查询SD卡座的插拔状态引脚 */ mDelaymS( 1000 ); } mDelaymS( 2000 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */

/* 对于检测到USB设备的,最多等待10*50mS */ for ( s = 0; s < 10; s ++ ) { /* 最长等待时间,10*50mS */ mDelaymS( 50 ); printf( "Ready ?\n" ); if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盘并测试磁盘是否就绪 */ } // s = CH376ReadBlock( buf ); /* 如果需要,可以读取数据块CH376_CMD_DATA.DiskMountInq,返回长度 */ // if ( s == sizeof( INQUIRY_DATA ) ) { /* U盘的厂商和产品信息 */ // buf[ s ] = 0; // printf( "UdiskInfo: %s\n", ((P_INQUIRY_DATA)buf) -> VendorIdStr ); // }

/* 检查U盘或者SD卡的剩余空间 */ printf( "DiskQuery: " ); s = CH376DiskQuery( (PUINT32)buf ); /* 查询磁盘剩余空间信息,扇区数 */ mStopIfError( s ); // printf( "free cap = %ld MB\n", *(PUINT32)buf * DEF_SECTOR_SIZE / 1000000 ); /* 未用扇区数乘以扇区大小后,除以1M换算为兆字节单位 */ printf( "free cap = %ld MB\n", *(PUINT32)buf / ( 1000000 / DEF_SECTOR_SIZE ) ); /* 上面一行的计算可能会溢出,换个顺序计算 */

/* 如果MY_ADC.TXT文件已经存在则添加数据到尾部,如果不存在则新建文件 */ printf( "Open\n" ); s = CH376FileOpen( "/MY_ADC.TXT" ); /* 打开文件,该文件在根目录下 */ if ( s == USB_INT_SUCCESS ) { /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */ NewSize = CH376GetFileSize( ); /* 读取当前文件长度,如果没有零头数据,那么文件长度是DEF_SECTOR_SIZE的倍数 */ printf( "File size = %ld\n", NewSize ); printf( "Locate tail\n" ); s = CH376SecLocate( 0xFFFFFFFF ); /* 以扇区为单位移到文件尾部,如果文件尾部有不足一个扇区的零头数据则被忽略,如果不做处理那么零头数据将可能被写入数据覆盖 */ mStopIfError( s ); total = NewSize & ( DEF_SECTOR_SIZE - 1 ); /* 上次保存文件时如果尾部有零头数据,那么先取得零头字节数,不满扇区长度的零碎数据 */ printf( "Read last tail = %d Bytes\n", total ); if ( total ) { /* 原尾部有零头数据,那么先调入内存,以便接着添加数据 */ s = CH376SecRead( FileDataBuf, 1, NULL ); /* 从文件读取尾部零头数据 */ mStopIfError( s ); s = CH376SecLocate( 0xFFFFFFFF ); /* 重新回到原文件的尾部,下面如果写入数据将覆盖原尾部零头数据,不过原零头数据刚才已经被读入内存,所以请放心 */ mStopIfError( s ); } } else if ( s == ERR_MISS_FILE ) { /* 没有找到文件,必须新建文件 */ printf( "Create\n" ); s = CH376FileCreate( NULL ); /* 新建文件并打开,如果文件已经存在则先删除后再新建,不必再提供文件名,刚才已经提供给CH376FileOpen */ mStopIfError( s ); total = 0; /* 此前没有零头数据 */ NewSize = 0; } else mStopIfError( s ); /* 打开文件时出错 */ printf( "Write begin\n" ); total += sprintf( FileDataBuf + total, "在本次添加数据之前,该文件已有数据的长度是 %ld 字节\xd\xa", NewSize ); /* 将新数据添加到缓冲区的尾部,累计缓冲区内的数据长度 */ mFlushBufferToDisk( 0 ); /* 自动刷新缓冲区,检查缓冲区是否已满,满则写盘 */ printf( "Write ADC data\n" ); TR0=1; /* 用定时器0的计数值代替ADC数据 */ for ( month = 1; month != 12; month ++ ) { /* 因为测试板上没有实时时钟芯片,所以用循环方式模拟月份 */ for ( date = 1; date != 30; date ++ ) { /* 因为测试板上没有实时时钟芯片,所以用循环方式模拟日期 */ year = 2004; /* 假定为2004年 */ hour = TL1 & 0x1F; /* 因为测试板上没有实时时钟芯片,所以用定时器1的计数代替进行演示 */ /* adc = get_adc_data( ); */ adc = ( (UINT16)TH0 << 8 ) | TL0; /* 因为测试板上没有ADC,所以用定时器0的计数代替ADC数据演示 */ total += sprintf( FileDataBuf + total, "Year=%04d, Month=%02d, Date=%02d, Hour=%02d, ADC_data=%u\xd\xa", year, (UINT16)month, (UINT16)date, (UINT16)hour, adc ); /* 将二制制数据格式为一行字符串 */ if ( month == 6 && ( date & 0x0F ) == 0 ) mFlushBufferToDisk( 1 ); /* 强制刷新缓冲区,定期强制刷新缓冲区,这样在突然断电后可以减少数据丢失 */ else mFlushBufferToDisk( 0 ); /* 自动刷新缓冲区,检查缓冲区是否已满,满则写盘 */ printf( "Current total is %d\n", total ); /* 用于监控检查 */ } } printf( "Write end\n" ); total += sprintf( FileDataBuf + total, " ********************************* " ); /* 将新数据添加到缓冲区的尾部,累计缓冲区内的数据长度 */ total += sprintf( FileDataBuf + total, "这次的ADC数据到此结束,程序即将退出\xd\xa" ); /* 将新数据添加到缓冲区的尾部,累计缓冲区内的数据长度 */ mFlushBufferToDisk( 1 ); /* 强制刷新缓冲区,因为系统要退出了,所以必须强制刷新 */ printf( "Close\n" ); s = CH376FileClose( FALSE ); /* 关闭文件,扇区模式通常不自动更新文件长度,因为强制刷新缓冲区时已经更新了文件长度,所以这里不需要自动更新文件长度 */ mStopIfError( s );

printf( "Take out\n" ); while ( CH376DiskConnect( ) == USB_INT_SUCCESS ) { /* 检查U盘是否连接,等待U盘拔出 */ mDelaymS( 100 ); } mDelaymS( 200 ); } } 因为还没调到后面,所以才没贴出来 现在连U盘都没连接到...


导致复位还有可能是RAM溢出,请检查,看门狗复位,有没有启动看门狗? 如果外部导致复位的话,无非就是复位引脚导致的。其他应该不会有什么原因了。


谢谢红桃六的提醒,这些我都查过了 主要是我前面说的,加上CH376DiskConnect( )才出现复位..不加就不会

另外,我在UINT8 CH376GetIntStatus( void ) /* 获取中断状态并取消中断请求 */ { UINT8 s; xWriteCH376Cmd( CMD01_GET_STATUS ); s = xReadCH376Data( ); printf( "Error: %02X\n", s );//加上的 xEndCH376Cmd( ); return( s ); }中加了一句用作调试,发现输出的s为150B, 好象是说明能检测的U盘连接吧??而且能发现USB总线复位? 但是连上U盘后一直输出 Start Wait Udisk/SD Error: 150B //Error是我自己加上的,为了看s的值 不连U盘一直输出 Start Wait Udisk/SD


问题解决了 单片机老是复位是因为这个警告*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL 我在file_sys.c中没有定义 xEndCH376Cmd( ); 虽然这个#define xEndCH376Cmd( ) /* 结束CH376命令,仅用于SPI接口方式 */ 但是如果在file_sys.c中不定义宏,会导致单片机找不到宏定义而一直复位,不知道我分析的对不对 我在file_sys.c中加上宏定义#define xEndCH376Cmd( ) 1 ,就好了 谢谢贵公司技术支持人员提供的调试建议~~~以后还请多帮助


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