运行环境:STC51 1T单片机 22.1184M晶振 (建议使用STC12C5A60S2 或 STC89C58)
代码介绍:
一:此程序首先将CH375程序库及CH375芯片进行初始化,随后开始检测U盘是否已经插入,U盘插入后,读取U盘的物理总容量,单位为扇区,即一共有多少个扇区。然后获取U盘的格式化容量、剩余容量及文件系统类型。
二:此程序进行一些初始化的操作及基本参数的获取。后面在根目录下创建一个TEST.TXT文件,创建成功后,获取此文件的相关信息并输出。
三:此程序进行一些初始化的操作及基本参数的获取。后面对根目录下的所有文件进行列举。然后更改test.txt的一些信息,如创建时间,文件属性等。
四:此程序进行一些初始化的操作及基本参数的获取。后面先定位文件的偏移量,然后读取根目录下的test.txt的从偏移量开始的40个字节(如果实际长度小于40,就读取实际长度),最后向文件中写入数据。
五:CH375对U盘的扇区级文件操作。
电路原理图如下:
单片机源程序如下:
- #include "ch375.h"
- #include "myfun.h"
- /***********************************************************
- +-----------------------------------------------+
- | 振南电子 高级外设程序模块 CH375 部分 [IO方式] |
- | 【此程序与视频教程中有出入,主要是为了程序兼容|
- | 性与稳定性,有些代码借鉴沁恒官方源码】 |
- +-----------------------------------------------+
- 此源码版权属 振南 全权享有,如欲引用,敬请署名并告知
- 严禁随意用于商业目的
- 振南电子
- WW:yzn07
- 注:本程序为IO方式,即使用单片机的IO模拟时序来驱动CH375
- IO方式便于移植。其实IO在模拟外部总线的时序,对于没有
- 外部总线的单片机,可以参考此程序。模拟时序,在速度上
- 不及硬件的外部总线。在操作U盘的时候,对操作速度有一定
- 要求。
- 这是振南在长期对CH375的研究中,得到的经验,请借鉴!!
- ***********************************************************/
- /******************************************************************
- - 功能描述:向CH375写入命令
- - 隶属模块:CH375模块
- - 函数属性:内部
- - 参数说明:cmd:要写入的命令码
- - 返回说明:无返回
- ******************************************************************/
- void CH375_Write_Cmd(unsigned char cmd) //写命令
- {
- delay(DELAYTIME); //稍作延时
- CH375_CS=0; //打开片选
- CH375_A0=1; //命令模式
- DATA_PORT=cmd; //输出命令码
- CH375_WR=0; //打开写使能
- delay(DELAYTIME); //稍作延时
- CH375_WR=1; //关闭写使能
- CH375_CS=1; //关闭片选
- CH375_A0=1; //恢复A0为高电平
- delay(DELAYTIME); //稍作延时
- }
- /******************************************************************
- - 功能描述:向CH375写入数据
- - 隶属模块:CH375模块
- - 函数属性:内部
- - 参数说明:dat:是要写入到CH375中的一个字节的数据
- - 返回说明:无返回
- ******************************************************************/
- void CH375_Write_Dat(unsigned char dat) //写数据
- {
- delay(DELAYTIME); //稍作延时
- CH375_CS=0; //打开片选
- CH375_A0=0; //数据模式
- DATA_PORT=dat; //输出数据
- CH375_WR=0; //打开写使能
- delay(DELAYTIME); //稍作延时
- CH375_WR=1; //关闭写使能
- CH375_CS=1; //关闭片选
- CH375_A0=1; //恢复A0为高电平
- delay(DELAYTIME); //稍作延时
- }
- /******************************************************************
- - 功能描述:从CH375读取一个字节
- - 隶属模块:CH375模块
- - 函数属性:内部
- - 参数说明:无
- - 返回说明:读到的字节
- ******************************************************************/
- unsigned char CH375_Read_Dat() //读数据
- {
- unsigned char temp;
- CH375_CS=0; //打开片选
- CH375_A0=0; //数据模式
- CH375_RD=0; //打开读使能
- DATA_PORT=0xff; //51单片机IO作输入,先置高
- delay(DELAYTIME); //稍作延时
- temp=DATA_PORT; //读取端口上的数据
- CH375_RD=1; //关闭读使能
- CH375_CS=1; //关闭片选
- CH375_A0=1; //恢复A0为高电平
- return temp; //返回读到的值
- }
- /******************************************************************
- - 功能描述:等待CH375的中断,并获取中断状态
- - 隶属模块:CH375模块
- - 函数属性:内部
- - 参数说明:无
- - 返回说明:中断状态码 返回0说明操作成功
- ******************************************************************/
- unsigned char CH375_Wait_Int() //等待中断信号,即INT引脚上产生低电平,并获取中断状态码,获取后INT恢复高电平,以产生下一次中断信号
- {
- CH375_INT=1; //IO作输入先置高
- while(CH375_INT); //等待中断
- CH375_Write_Cmd(CMD_GET_STATUS); //产生操作完成中断,获取中断状态
- return CH375_Read_Dat();
- }
- /******************************************************************
- - 功能描述:初始化CH375芯片
- - 隶属模块:CH375模块
- - 函数属性:外部,供用户调用
- - 参数说明:无
- - 返回说明:执行结果
- ******************************************************************/
- unsigned char CH375_Init()
- {
- unsigned char i=0;
- CH375_Write_Cmd(CMD_GET_IC_VER); /* 获取芯片及固件版本 */
- i=CH375_Read_Dat(); /* 版本 */
- if(i<0xA2) return 1; /* 不支持该芯片 */
- CH375_Write_Cmd(CMD_SET_USB_MODE); /* 设置USB工作模式 */
- CH375_Write_Dat(6); /* 模式代码,自动检测USB设备连接 */
- for(i=0;i<250;i++)
- { /* 等待操作成功,通常需要等待10uS-20uS */
- delay(10);
- if(CH375_Read_Dat()==CMD_RET_SUCCESS )
- return 0; /* 操作成功 */
- }
- return 1; /* CH375出错,例如芯片型号错或者处于串口方式或者不支持 */
- }
- /******************************************************************
- - 功能描述:初始化磁盘
- - 隶属模块:CH375模块
- - 函数属性:外部,供用户调用
- - 参数说明:无
- - 返回说明:操作结果,0表示初始化磁盘成功
- 1表示初始化磁盘失败
- - 注:在使用U盘之前,先要调用此函数,此函数将进行判断
- 磁盘是否连接,初始化是否成功等操作
- ******************************************************************/
- unsigned char CH375_InitDisk()
- {
- unsigned char status,i,j=0;
- status=CH375_Wait_Int();
- if(status==USB_INT_DISCONNECT) return 1; /* USB设备断开 */
- while(1)
- {
- CH375_Write_Cmd(CMD_DISK_INIT); /* 初始化USB存储器 */
- status=CH375_Wait_Int(); /* 等待中断并获取状态 */
- if(status==USB_INT_SUCCESS)
- break;
- }
- while(1) //以下代码均源自沁恒的官方U盘初始化函数,借用它可以提高对U盘的兼容性!
- {
- j++;
- CH375_Write_Cmd(CMD_DISK_SIZE); /* 获取USB存储器的容量 */
- status=CH375_Wait_Int(); /* 等待中断并获取状态 */
- if(status==USB_INT_SUCCESS)
- break;
- else
- {
- delay(1000);
- CH375_Write_Cmd(CMD_DISK_R_SENSE); /* 获取USB存储器的容量 */
- status=CH375_Wait_Int(); /* 等待中断并获取状态 */
- if(status==USB_INT_SUCCESS) /* 出现错误 */
- continue;
- else
- return 1;
- }
- if(j==5)
- return 1;
- }
- for(i=0;i!=5;i++)
- {
- CH375_Write_Cmd( CMD_DISK_READY ); /* 获取USB存储器的容量 */
- status=CH375_Wait_Int(); /* 等待中断并获取状态 */
- if(status==USB_INT_SUCCESS)
- return 0; /* U盘已经成功初始化 */
- }
- return 1;
- }
- /******************************************************************
- - 功能描述:读取U盘的扇区
- - 隶属模块:CH375模块
- - 函数属性:外部,供用户调用
- - 参数说明:addr:扇区地址
- pbuf:指向数据缓冲区的指针
- - 返回说明:返回操作结果,如果为0说明操作成功,
- 如果为1说明操作失败
- ******************************************************************/
- unsigned char CH375_Read_Sector(unsigned long addr,unsigned char *pBuf)
- {
- unsigned char i=0,j=0,k=0;
- unsigned char status,len;
- unsigned int counter=0;
- for(k=0;k<4;k++)
- {
- counter=0;
- CH375_Write_Cmd(CMD_DISK_READ);//磁盘读取命令
- CH375_Write_Dat(addr);
- CH375_Write_Dat(addr>>8);
- CH375_Write_Dat(addr>>16);
- CH375_Write_Dat(addr>>24); //送入32位扇区地址
- CH375_Write_Dat(1); //送入扇区数
- for(i=0;i<8;i++) //CH375的数据缓冲区为64字节,所以读取一个扇区要读8次
- {
- status=CH375_Wait_Int(); //等待CH375中断信号,读取状态码
- if(status==USB_INT_DISK_READ) //如果状态码是USB_INT_DISK_READ,就开始读取数据,否则发生错误
- {
- CH375_Write_Cmd(CMD_RD_USB_DATA); //送入读数据的命令
- delay(4);
- len=CH375_Read_Dat(); //先读到的是数据的长度
- do //把随后CH375送过来的数据放入pBuf中
- {
- pBuf[counter++]=CH375_Read_Dat();
- }while(--len);
- CH375_Write_Cmd(CMD_DISK_RD_GO); //送入继续读数据的命令,CH375会将下面64个字节放入缓冲区,等待单片机来读
- }
- else
- {
- return 1; //发生错误,返回状态码
- }
- }
- status=CH375_Wait_Int(); //读取8次以后,最后一次送入继续读数据的命令,等待CH375产生中断信号,并读取状态
- if(status==USB_INT_SUCCESS) //如果状态码为USB_INT_SUCCESS,说明读取扇区成功,返回0
- {
- return 0;
- }
- else
- if(status==USB_INT_DISK_ERR )
- {
- delay(1000);
- CH375_Write_Cmd(CMD_DISK_R_SENSE); /* 获取USB存储器的容量 */
- status=CH375_Wait_Int(); /* 等待中断并获取状态 */
- if(status!=USB_INT_SUCCESS) /* 出现错误 */
- return 1;
- }
- }
- }
- /******************************************************************
- - 功能描述:写U盘的扇区
- - 隶属模块:CH375模块
- - 函数属性:外部,供用户调用
- - 参数说明:addr:扇区地址
- pbuf:指向数据缓冲区的指针
- - 返回说明:返回操作结果,如果为0说明操作成功,
- 如果为1说明操作失败
- ******************************************************************/
- unsigned char CH375_Write_Sector(unsigned long addr,unsigned char *pBuf)
- {
- unsigned char i=0;
- unsigned char status,len;
- CH375_Write_Cmd(CMD_DISK_WRITE);//磁盘写 命令
- CH375_Write_Dat(addr);
- CH375_Write_Dat(addr>>8);
- CH375_Write_Dat(addr>>16);
- CH375_Write_Dat(addr>>24); //写入32位的扇区地址,先送低字节
- CH375_Write_Dat(1); //送入扇区数
- for(i=0;i<8;i++)
- {
- status=CH375_Wait_Int();
- if(status==USB_INT_DISK_WRITE)
- {
- CH375_Write_Cmd(CMD_WR_USB_DATA7);
- len=64;
- CH375_Write_Dat(len);
- do
- {
- CH375_Write_Dat(*pBuf);
- pBuf++;
- }while(--len);
- CH375_Write_Cmd(CMD_DISK_WR_GO);
- }
- else
- {
- return 1;
- }
- }
- status=CH375_Wait_Int();
- if(status==USB_INT_SUCCESS) //如果状态码为USB_INT_SUCCESS,说明写扇区成功,返回0
- {
- return 0;
- }
- else
- {
- return 1;
- }
- }
复制代码
全部资料51hei下载地址:
U盘例程+电路图.rar
(2.05 MB, 下载次数: 403)
|