CH376S测试U盘CH376DiskMount( )返回0x2c
CH376DiskConnect( )返回0x14,成功,测试磁盘就绪不成功,求助
CH376S测试U盘CH376DiskMount( )返回0x2c
CH376DiskConnect( )返回0x14,成功,测试磁盘就绪不成功,求助
/* CH376芯片 软件模拟8位并口连接的硬件抽象层 V1.0 */ /* 提供I/O接口子程序 */
#include "HAL.H"
#define UWR_CLR PORTD &= ~(1 <<4) //UWR置低 #define UWR_SET PORTD |= (1 <<4) //UWR置高
#define URD_CLR PORTD &= ~(1 <<5) //URD置低 #define URD_SET PORTD |= (1 <<5) //URD置高
#define UA0_CLR PORTD &= ~(1 <<6) //UA0置低 #define UA0_SET PORTD |= (1 <<6) //UA0置高
void mDelayuS( UINT8 us ) { while ( us -- ) ; }
#define CH376_INT_WIRE ((PIND&0X02)>>1) /* 假定CH376的INT#引脚,如果未连接那么也可以通过查询状态端口实现 */
void CH376_PORT_INIT( void ) /* 由于使用通用I/O模拟并口读写时序,所以进行初始化 */ { DDRD=0Xf0; UWR_SET; URD_SET; UA0_CLR; DDRC=0X00; /* 设置并口输入 */ mDelayuS(10); }
UINT8 xReadCH376Status( void ) /* 从CH376读状态,仅用于并口方式 */ { UINT8 mData; mDelayuS(200); UA0_SET; UWR_SET; URD_SET; mDelayuS(10);
DDRC=0X00; mDelayuS(10);
URD_CLR; /* 输出有效读控制信号, 读CH376芯片的状态端口 */ mDelayuS(10); mData =PINC; /* 从CH376的并口输入数据 */ URD_SET; UWR_SET; UA0_CLR; return( mData ); }
UINT8 xReadCH376Data( void ) /* 从CH376读数据 */ { UINT8 mData; mDelayuS(200); UA0_CLR; UWR_SET; URD_SET; mDelayuS(10);
DDRC=0X00; mDelayuS(10);
URD_CLR; /* 输出有效读控制信号, 读CH376芯片的状态端口 */ mDelayuS(10); mData =PINC; /* 从CH376的并口输入数据 */ URD_SET; UWR_SET; UA0_CLR; return( mData ); }
void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376写命令 */ {
UA0_SET; UWR_SET; URD_SET; mDelayuS(10); DDRC=0XFF; mDelayuS(10); UWR_CLR; /* 输出有效写控制信号, 写CH376芯片的命令端口 */ mDelayuS(10);
PORTC=mCmd ; mDelayuS(10); UWR_SET; URD_SET; mDelayuS(10); }
void xWriteCH376Data( UINT8 mData ) /* 向CH376写数据 */ {
UA0_CLR; UWR_SET; URD_SET; mDelayuS(10); DDRC=0XFF; mDelayuS(10); UWR_CLR; /* 输出有效写控制信号, 写CH376芯片的命令端口 */ mDelayuS(10);
PORTC=mData; mDelayuS(10); UWR_SET; URD_SET; mDelayuS(10); }
/* 查询CH376中断(INT#低电平) */ UINT8 Query376Interrupt( void ) { #ifdef CH376_INT_WIRE return( CH376_INT_WIRE ? FALSE : TRUE ); /* 如果连接了CH376的中断引脚则直接查询中断引脚 */ #else return( (xReadCH376Status( ) & PARA_STATE_INTB) ? FALSE : TRUE ); /* 如果未连接CH376的中断引脚则查询状态端口 */ #endif }
UINT8 mInitCH376Host( void ) /* 初始化CH376 */ { UINT8 res; CH376_PORT_INIT( ); /* 接口硬件初始化 */ xWriteCH376Cmd( CMD_CHECK_EXIST ); /* 测试单片机与CH376之间的通讯接口 */ xWriteCH376Data( 0x57 ); res = xReadCH376Data( ); if ( res != 0xa8 ) return( ERR_USB_UNKNOWN ); /* 通讯接口不正常,可能原因有:接口连接异常,其它设备影响(片选不唯一),串口波特率,一直在复位,晶振不工作 */ xWriteCH376Cmd(0x15); /* 设备USB工作模式 */ xWriteCH376Data( 0x06 ); mDelayuS(200); res = xReadCH376Data( ); if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS ); else return( ERR_USB_UNKNOWN ); /* 设置模式错误 */ }
/* 检查操作状态,如果错误则显示错误代码并停机,应该替换为实际的处理措施,例如显示错误信息,等待用户确认后重试等 */ void mStopIfError( UINT8 iError ) { if ( iError == USB_INT_SUCCESS ) return; /* 操作成功 */ }
#define xEndCH376Cmd( )
主程序:
delay_ms( 100 ); /* 延时100毫秒 */ //开启全局中断 //总中断允许 s = mInitCH376Host( ); /* 初始化CH376 */
mStopIfError( s ); /* 其它电路初始化 */
while ( 1 ) { while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) { /* 检查U盘是否连接,等待U盘插入,对于SD卡,可以由单片机直接查询SD卡座的插拔状态引脚 */ delay_ms( 100 ); } delay_ms( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ /* 对于检测到USB设备的,最多等待10*50mS */ for ( s = 0; s < 10; s ++ ) { /* 最长等待时间,10*50mS */ delay_ms( 50 ); if (CH376DiskMount( ) ==USB_INT_SUCCESS ){ break; } /* 初始化磁盘并测试磁盘是否就绪 */ } delay_ms( 200 );
CH376DiskMount( )返回值是0x2c,为什么呢?求大侠指点
void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376写命令 */ {
UA0_SET; UWR_SET; URD_SET; mDelayuS(10); DDRC=0XFF; PORTC=mCmd ; mDelayuS(10); UWR_CLR; /* 输出有效写控制信号, 写CH376芯片的命令端口 */ mDelayuS(10);
mDelayuS(10); UWR_SET; URD_SET; mDelayuS(10); }
写命令按照我这样。你那样写可能会出问题的。
这样还是不行的,初始化测试通信的时候是没问题的,按位取反正常。 xWriteCH376Cmd( CMD_CHECK_EXIST ); /* 测试单片机与CH376之间的通讯接口 */ xWriteCH376Data( 0x55 ); res = xReadCH376Data( ); res返回值是0xaa.
USB工作模式 也是正确的,可以检测到设备连接,CH376DiskConnect()返回值是0x14,但是CH376DiskMount( )错误,返回值是0x16,以及CH376GetDiskStatus( )返回值是0x02
怎么解决啊?求指导
求助
你检查一下USB口那边VCC、UD-、UD+电压是多少?另外,发完命令要等待数据发完后才能查询中断。
VCC、UD-、UD+分别为5v,0v,3v
FILE_SYS.C文件没有做任何修改的
这是原理图,并口方式,cs一直选通
没有人遇到这种问题吗?
那你拿示波器看下UD+和UD-在发送完成DISKMOUNT命令之后是否有信号出来。XI端的20P的电容去掉。
问题终于解决,12M晶振是坏的!!标注的12M,测量竟然是4M。。。。感谢你的帮助
您好我这ch375芯片工作正常,但是usb存储器初始化之后返回值也是0x2c 麻烦您看看是不是硬件问题