ch374芯片初始化老是出错,错误代码为0x81./* CH374硬件错误,可能需要复位CH374 */ 怎么解决呀?可能原因有哪些呀? 芯片的初始化程序是在所提供的了程序库里吧?
芯片的初始化时在CH374LibInit( )里面完成的,返回0x81 说明可能是硬件连接有问题,检查晶振是否起振,还有就是读写时序上面的问题。
晶振已经起振了,读写时序也没有错!
CH374Delayms这个函数怎么修改!! 晶振不一样延迟肯定不一样,使用这个函数就算CH374Delayms(1)都很慢啊
同样我的也错误!! 用CH374Reset进行复位都不管用,还是0x81! #define NO_DEFAULT_CH374_RESET 1/* 未调用CH374Reset程序故禁止以节约代码 */ 为什么例子程序把复位给屏蔽了?? 急急急急急急急
1、CH374DelaymS不需要用户修改,与用户关,问题不在这个地方 2、按2楼的建议,先检查晶振是否起振、硬件连接、接口程序,循环调用写函数,用示波器看看CH374各个信号脚的信号是否正确
返回0X81一般硬件错误,很可能是读写函数不正确,时序不对。 你怎么确定读写时序正确的?这样测试一下: 主函数开始延时50MS 读寄存器,看看读出的数据是不是复位后的值,如果是的,则标明读函数是正确的。 然后写0X40-0X7F这个区域,写0X55,0XAA,然后读出来看看,是否和写进去的数据一样。 很有可能是读写函数不正确。CH374LinInit,就要对读写函数进行测试,测试不正确就会返回0X81。 务必仔细检查!!!!
读REG_SYS_INFO(0x04)返回不对,位01应该返回01的,是00, 用示波器点上374U的数据口没发现有相应电平,就算是直接给01电平切换也测不到,是不是不能直接这样测,或是数据口要上拉或下拉电阻? 05H 位6 读出的数据无意义且必须写1, 相当于原BIT_CTRL_OE_POLAR 位必须置1 这句话什么意思?CH374Reset这个函数到底用不用啊? 为什么要屏蔽掉。
如果直接给01电平也测不到,这说明单片机的I/O的设置或取读取方式有问题,你用了什么单片机,硬件是怎么连接的,再把接口程序贴出来
初始化搞通了,现在的问题是磁盘未准备好,CH374DiskReady( )返回的值是0x2e,没查到有这个错误代码呀? CH374DiskStatus的值为2,已经连接上了.
单片机用的是ATMEGA64
那么需要你去看下你的RAM现在编译之后是多少?还有你的USB口上UD+和UD-对地的电压是多少?如果是正常的话,UD+对地电压是3.3V,UD-对地电压是0V
Wait Udisk
Ready? Ready? Ready? Ready? Ready? Ready? Ready? Ready? Ready? Ready? 未知USB设备 Take out
程序如下: if ( CH374DiskConnect( ) == ERR_SUCCESS ) { /* 查询方式: 检查磁盘是否连接并更新磁盘状态,返回成功说明连接 */ CH374DelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ /* 对于检测到USB设备的,最多等待100*50mS,主要针对有些MP3太慢,对于检测到USB设备 并且连接DISK_MOUNTED的,最多等待5*50mS,主要针对DiskReady不过的 */ for ( i = 0; i < 10; i ++ ) { /* 最长等待时间,100*50mS */ CH374DelaymS( 50 ); printf( "Ready?\n" ); //State = CH374DiskReady( ); //printf( "%x\n",(UINT16)State ); if ( CH374DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ //printf( "%x\n",CH374DiskStatus); if ( CH374DiskStatus < DISK_CONNECT ) { /* 检测到断开,重新检测并计时 */ Putchar('D'); break; /* 重新等待 */ } if ( CH374DiskStatus >= DISK_MOUNTED && i > 5 ) break; /* 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS */ if ( CH374DiskStatus == DISK_CONNECT ) { /* 有设备连接 */ if ( CH374vHubPortCount ) { /* 连接了一个USB-HUB,但可能没有U盘 */ printf( "No Udisk in USB_HUB\n" ); break; } else { /* 未知USB设备,有可能是U盘反应太慢,所以要再试试 */ } } } if ( CH374DiskStatus >= DISK_MOUNTED ) { /* 是U盘 */ break; /* 开始操作U盘 */ } if ( CH374DiskStatus == DISK_CONNECT ) { /* 多次尝试还是不行,估计不是U盘 */ if ( CH374vHubPortCount ) { /* 连接了一个USB-HUB,但可能没有U盘 */ /* 在while中等待HUB端口有U盘 */ } else { /* 未知USB设备,例如USB键盘、打印机等,而且已经试了很多次还不行 */ printf( "未知USB设备\n" ); goto UnknownUsbDevice; } } }
编译之后胡资源占用情况: Size after: main.elf : section size addr .data 354 8388864 .text 22348 0 .bss 2699 8389218 .noinit 0 8391917 .eeprom 0 8454144 .stab 876 0 .stabstr 132 0 .debug_aranges 20 0 .debug_pubnames 518 0 .debug_info 3153 0 .debug_abbrev 600 0 .debug_line 1914 0 .debug_str 1269 0 Total 33883 对于D0口,插上U盘后电压正常,能执行到printf( "未知USB设备\n" );U盘灯不亮 但是D1口不能识别,一直处于等待插入; U+U-电压都正常
来人解决啊
我的也老是U盘未准备好~ 红桃六来帮帮忙~