我用贵公司的CH375B做U盘读取,测试命令返回值正常,也可以连接到U盘但是初始化U盘的时候返回值仍是0X15,请问这是为什么,用的U盘是金士顿2G 下面是代码 #include #define CMD_TEST_CONNECT 0x16 #define CMD_DISK_INIT 0x51 #define CMD_DISK_RESET 0x52 #define CMD_DISK_SIZE 0x53 #define CMD_DISK_READ 0x54 #define CMD_RESET_ALL 0x05 #define CMD_CHECK_EXIST 0x06 #define CMD_SET_USB_MODE 0x15 #define CMD_GET_STATUS 0x22 #define USB_INT_SUCCESS 0x14 #define USB_INT_CONNECT 0x15
#define uint8 unsigned char
sbit CH375_INT=P0^0; sbit CH375_A0 = P0^3; sbit CH375_CS = P0^4; sbit CH375_WR = P0^1; sbit CH375_RD = P0^2;
void Init_Ser(void) { //中断允许 EA = 1; ES = 1; // EX0 = 1;
//定时器T1设置,波特率9600,11.0592M TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd;
//通讯模式设置 SM0 = 0; SM1 = 1; REN = 1;
//启动定时器 TR1 = 1;
//配合printf函数 // TI = 1; }
void SendStr(uint8 *p) { while(*p!='\0') { SBUF = (*p); while(!TI); TI = 0; p++; } }
void Inter_Ser (void) interrupt 4 { }
void mDelay1_2uS( ) /* 至少延时1.2uS,根据单片机主频调整 */ { return; } void delay(unsigned int a) { unsigned char i; while(a--) { for(i=0;i<125;i++); } }
void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { CH375_CS = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; P2 = 0xFF; /* 并口输入 */ }
void xWriteCH375Cmd( unsigned char mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { //*(UINT8XV *)0XBDF1 = mCmd; //return; mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ P2 = mCmd; /* 向CH375的并口输出数据 */ CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的命令端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; CH375_A0 = 0; P2 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时2uS */ }
void xWriteCH375Data( unsigned char mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { //*(UINT8XV *)0XBCF0 = mData; //return; P2 = mData; /* 向CH375的并口输出数据 */ CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; P2 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); /* 至少延时1.2uS */ }
unsigned char xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { unsigned char mData; //return( *(UINT8XV *)0XBCF0 ); mDelay1_2uS( ); /* 至少延时1.2uS */ P2 = 0xFF; /* 输入 */ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 输出有效写控制信号, 读CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = P2; /* 从CH375的并口输入数据 */ CH375_RD = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; return( mData ); } /*unsigned char Wait_Inter(void) { unsigned char a; CH375_INT = 1; while(CH375_INT); xWriteCH375Cmd(CMD_GET_STATUS); delay(10); a= xReadCH375Data(); return a; } */ void InitDisk() { unsigned char status; SendStr("Start to connect U disk...\n"); while(status != USB_INT_CONNECT) { xWriteCH375Cmd(CMD_TEST_CONNECT); status = xReadCH375Data(); P1=status; delay(1000); P1=0XFF; } SendStr("U disk is inserted\n"); while(status != USB_INT_SUCCESS) { CH375_INT = 1; xWriteCH375Cmd(0x51); // 初始化USB存储器 delay(10); xWriteCH375Cmd(0x51); delay(10); xWriteCH375Cmd(0x51); delay(10); xWriteCH375Cmd(0x51); delay(10); while(CH375_INT==1); xWriteCH375Cmd(CMD_GET_STATUS); status=xReadCH375Data(); P1 =status; // 等待中断并获取状态 delay(1000); P1=0XFF; } SendStr("Init U disk successfully!\n");
} main() {
P1=0x00; delay(250); delay(250); Init_Ser(); CH375_PORT_INIT( ); xWriteCH375Cmd(0X05);//CH375执行复位
delay(100); xWriteCH375Cmd(0X06);//执行测试函数 xWriteCH375Data(0x11);//写入任意数据,输出数据为此数据取反 P1=xReadCH375Data(); delay(1000); xWriteCH375Cmd(0x15); delay(10); xWriteCH375Data(0x06); delay(10); InitDisk();
while(1); } [Emot]27[/Emot]