最简单的CH375读U盘 问题! 管理员和高手请进 文字
#ifndef _CH375_H #define _CH375_H
#include
void CH375_WriteCmd(unsigned char cmd) // 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 { delay_us(2); // 2 CH375_OPEN_CMD_DDR; // A0=1 CH375_DATA_PORT=cmd; // 放好数据 CH375_DATA_PORT_OUT; // 方向输出 CH375_WRITE_CMD_OK; // A0=1 CS=0 WR=0 RD=1 delay_us(1); // 1 // 发出命令码前后应该各延时2uS,对于不快的单片机可以不需要延时 CH375_CLOSE; // CS=1 WR=1 RD=1 命令状态关闭 CH375_DATA_PORT_IN; // 数据方向输入 delay_us(1); // 1 }
void CH375_WriteData(unsigned char data) //向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 { CH375_DATA_PORT=data; // 放好数据 CH375_DATA_PORT_OUT; // 数据方向输出 CH375_WRITE_DATA_OK; // A0=0 CS=0 WR=0 RD=1 delay_us(5); // 1 CH375_CLOSE; //CS=1 WR=1 RD=1 命令状态关闭 CH375_DATA_PORT_IN; // 禁止数据输出 delay_us(1); // 1 // 延时 } unsigned char CH375_ReadData(void) //从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 { unsigned char d; delay_us(1); // 1 CH375_DATA_PORT_IN; // 数据输入 CH375_READ_DATA_OK; // A0=0 CS=0 WR=1 RD=0 delay_us(1); // 1 d=CH375_DATA_PIN; // 读引脚数据 CH375_CLOSE; // CS=1 WR=1 RD=1 命令状态关闭 return d;
}
unsigned char CH375_WaitInt( void ) //等待CH375中断并获取状态,主机端等待操作完成,返回操作状态 { unsigned char d; while(CH375_INT_PIN==0); CH375_WriteCmd(CMD_GET_STATUS); d=CH375_ReadData(); return d; }
unsigned char CH375_CheckData(unsigned char data) { CH375_WriteCmd(0x06); CH375_WriteData(data); data=CH375_ReadData(); return data; }
unsigned char CH375_CheckDisk(void) //等待U盘插入 产生中断 不停的检测状态 属于进入函数 { unsigned char Status; CH375_WriteCmd( CMD_SET_USB_MODE ); // 初始化CH375,设置USB工作模式 CH375_WriteData( 6 ); // 模式代码,自动检测USB设备连接 delay_ms(10); while ( CH375_WaitInt()!=USB_INT_CONNECT); // 等待U盘连接 CH375_WriteCmd(CMD_GET_STATUS); // 产生操作完成中断, 获取中断状态 Status=CH375_ReadData(); if ( Status != USB_INT_CONNECT ) return( Status ); //USB设备断开 return 0; }
unsigned char CH375_DiskIni( void ) // 初始化磁盘 { unsigned char Status; unsigned char i;
CH375_WriteCmd(CMD_DISK_INIT); // 初始化USB存储器 Status=CH375_WaitInt(); delay_ms(100) ; CH375_WriteCmd(CMD_DISK_SIZE); // 获取USB存储器的容量 Status=CH375_WaitInt(); if (Status !=USB_INT_SUCCESS) { for(i=0 ; i<10 ; i++) { CH375_WriteCmd( CMD_DISK_SIZE ); // 获取USB存储器的容量 Status=CH375_WaitInt(); if ( Status == USB_INT_SUCCESS) break; delay_ms(100) ; //这里很关键 必须延时 } } if ( Status !=USB_INT_SUCCESS ) return( Status ); //USB设备断开 return 0; }
endif
芯片的管脚 定义随便 我使用了 mega8 mega162 都可以读到255个扇区 [Emot]27[/Emot]