当前位置:文档之家› 单片机U盘读写参考程序

单片机U盘读写参考程序

/*******************************************************/#include"reg52.h"#include"stdio.h"#include "string.h"#include "intrins.h"#include"CH375INC.H"/*******************************************************/#define uchar unsigned char#define uint unsigned int/*******************************************************/sbit CH375_INT=P3^3;sbit CH375_A0=P3^4;sbit CH375_RD=P3^5;sbit CH375_WR=P3^6;sbit CH375_CS=P3^7;/*******************************************************/uchar xdata my_buf[512];/*******************************************************/void uart_init(){TMOD=0X20;TH1=TL1=0XFD;TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=1;}/*******************************************************/void uart_send_pc(uchar *s) //串口监视//void uart_send_pc(uchar a[20]) { //{uchar len=strlen(s); // uchar i;uchar i; // for(i=0;i<20;i++)for(i=0;i<len;i++) // {{ // ES=0;ES=0; // SBUF=a[i];SBUF=s[i]; // while(!TI);while(!TI); // TI=0;TI=0; // ES=1;ES=1; // }} //}}/*******************************************************/void Delay2us() //@11.0592MHz{unsigned char i;_nop_();_nop_();i = 2;while (--i);}//********************1ms延时函数*************void delay1ms(unsigned int z){unsigned int x,y;for(x=z;x>0;x--)for(y=845;y>0;y--);}/*******************************************************/ void ch375_write_datcmd(uchar dat_cmd,uchar k) //写数据、命令{Delay2us();CH375_CS=0;CH375_A0=k; // 0:data 1:cmdP2=dat_cmd;CH375_WR=0;CH375_WR=1;CH375_CS=1;CH375_A0=1;Delay2us();}uchar ch375_read_dat() //读数据{uchar dat;CH375_CS=0;CH375_A0=0;P2=0XFF;CH375_RD=0;// P2=0XFF;dat=P2;CH375_RD=1;CH375_CS=1;CH375_A0=1;return dat;}/************************等待获取状态并取消中断操作*******************************/uchar ch375_wait_int(){CH375_INT=1;while(CH375_INT);ch375_write_datcmd(CMD_GET_STATUS,1); //获取状态并取消中断return ch375_read_dat();}/************************获取U盘容量操作*******************************/ unsigned long* get_volume(){unsigned long volume[2];uchar status,i;ch375_write_datcmd(CMD_DISK_SIZE,1);status=ch375_wait_int();if(status==USB_INT_SUCCESS){ch375_write_datcmd(CMD_RD_USB_DA TA,1);i=ch375_read_dat();for(i=0;i<4;i++){volume[0]=volume[0]<<8;volume[0]=volume[0]+ch375_read_dat();delay1ms(1);}for(i=0;i<4;i++){volume[1]=volume[1]<<8;volume[1]=volume[1]+ch375_read_dat();delay1ms(1);}}return volume;}/************************U盘初始化操作*******************************/uchar ch375_init(){uchar status;// uart_send_pc("请插入U盘:\n");status=ch375_wait_int(); //等待插入,并获取状态if(status!=USB_INT_CONNECT){uart_send_pc("U盘插入错误!\n");}else{// uart_send_pc("U盘已插入!\n");}ch375_write_datcmd(CMD_DISK_INIT,1); //磁盘初始化status=ch375_wait_int();if(status!=USB_INT_SUCCESS){uart_send_pc("磁盘初始化失败!\n");}else{// uart_send_pc("磁盘初始化成功!\n");}return 0;}/*******************************************************//**********************读扇区操作*********************************/uchar read_section(unsigned long addr){uchar i,k,status,length;ch375_write_datcmd(CMD_DISK_READ,1); //发送读扇区命令ch375_write_datcmd(addr,0);ch375_write_datcmd(addr>>8,0);ch375_write_datcmd(addr>>16,0);ch375_write_datcmd(addr>>24,0); //发送地址,先低后高ch375_write_datcmd(1,0); //送入读取扇区数for(i=0;i<8;i++) //缓冲区为64个字节,512/64=8,所以要读8次{status=ch375_wait_int(); //等待,并获取状态if(status==USB_INT_DISK_READ) //读数据块{ch375_write_datcmd(CMD_RD_USB_DA TA,1);length=ch375_read_dat();for(k=0;k<length;k++){my_buf[k+i*64]=ch375_read_dat(); //每次获取length个数ES=0; // SBUF=a[i];SBUF=my_buf[k+i*64]; // while(!TI);while(!TI); // TI=0;TI=0; // ES=1;ES=1;}}ch375_write_datcmd(CMD_DISK_RD_GO,1);}status=ch375_wait_int();if(status!=USB_INT_SUCCESS){return status;}return 0;}/*******************************************************/void main(){uart_init();delay1ms(40);ch375_write_datcmd(CMD_SET_USB_MODE,1); //设置USB模式ch375_write_datcmd(0x07,0); //自检测,复位usb总线delay1ms(1);ch375_write_datcmd(CMD_SET_USB_MODE,1); //设置USB模式ch375_write_datcmd(0x06,0); //自检测,并且产生sop包if(ch375_init()==0){// uart_send_pc("初始化完成!\n");}delay1ms(1);if(read_section(96+0x3a19)==0){// uart_send_pc("已读到扇区!\n");}while(1){}}void t1() interrupt 4{RI=0; }。

相关主题