8051f CH375 优盘---ch375.c

//ch375.h
/* ********************************************************************************************************************* */
/* 硬件特性 */

#define CH375_MAX_DATA_LEN 0x40    /* 最大数据包的长度,内部缓冲区的长度 */

/* ********************************************************************************************************************* */
/* 命令代码 */

#define CMD_RESET_ALL   0x05    /* 执行硬件复位 */

#define CMD_CHECK_EXIST   0x06    /* 测试工作状态 */
/* 输入: 任意数据 */
/* 输出: 输入数据的按位取反 */

#define CMD_SET_USB_ID   0x12    /* 设置USB厂商VID和产品PID */
/* 输入: 厂商ID低字节, 厂商ID高字节, 产品ID低字节, 产品ID高字节 */

#define CMD_SET_USB_ADDR 0x13    /* 设置USB地址 */
/* 输入: 地址值 */

#define CMD_SET_USB_MODE 0x15    /* 设置USB工作模式 */
/* 输入: 模式代码 */
/*       00H=未启用的设备方式, 01H=已启用的设备方式并且使用外部固件模式, 02H=已启用的设备方式并且使用内置固件模式, */
/*       04H=未启用的主机方式, 05H=已启用的主机方式, 06H=已启用的主机方式并且自动产生SOF包, 07H=已启用的主机方式并且复位USB总线 */
/* 输出: 状态 */

#define CMD_SET_ENDP2   0x18    /* 设置USB端点0的接收器 */
/* 输入: 工作方式 */
/*           位7为1则位6为同步触发位, 否则同步触发位不变 */
/*           位3~位0为事务响应方式: 0000~1000-就绪ACK, 1101-忽略, 1110-正忙NAK, 1111-错误STALL */

#define CMD_SET_ENDP3   0x19    /* 设置USB端点0的发送器 */
/* 输入: 工作方式 */
/*           位7为1则位6为同步触发位, 否则同步触发位不变 */
/*           位3~位0为事务响应方式: 0000~1000-就绪ACK, 1101-忽略, 1110-正忙NAK, 1111-错误STALL */

#define CMD_SET_ENDP4   0x1A    /* 设置USB端点1的接收器 */
/* 输入: 工作方式 */
/*           位7为1则位6为同步触发位, 否则同步触发位不变 */
/*           位3~位0为事务响应方式: 0000~1000-就绪ACK, 1101-忽略, 1110-正忙NAK, 1111-错误STALL */

#define CMD_SET_ENDP5   0x1B    /* 设置USB端点1的发送器 */
/* 输入: 工作方式 */
/*           位7为1则位6为同步触发位, 否则同步触发位不变 */
/*           位3~位0为事务响应方式: 0000~1000-就绪ACK, 1101-忽略, 1110-正忙NAK, 1111-错误STALL */

#define CMD_SET_ENDP6   0x1C    /* 设置USB端点2/主机端点的接收器 */
/* 输入: 工作方式 */
/*           位7为1则位6为同步触发位, 否则同步触发位不变 */
/*           位3~位0为事务响应方式: 0000~1000-就绪ACK, 1101-忽略, 1110-正忙NAK, 1111-错误STALL */

#define CMD_SET_ENDP7   0x1D    /* 设置USB端点2/主机端点的发送器 */
/* 输入: 工作方式 */
/*           位7为1则位6为同步触发位, 否则同步触发位不变 */
/*           位3~位0为事务响应方式: 0000~1000-就绪ACK, 1101-忽略, 1110-正忙NAK, 1111-错误STALL */

#define CMD_GET_TOGGLE   0x0A    /* 获取OUT事务的同步状态 */
/* 输入: 数据1AH */
/* 输出: 同步状态 */
/*           位4为1则OUT事务同步, 否则OUT事务不同步 */

#define CMD_GET_STATUS   0x22    /* 获取中断状态并取消中断请求 */
/* 输出: 中断状态 */

#define CMD_UNLOCK_USB   0x23    /* 释放当前USB缓冲区 */

#define CMD_RD_USB_DATA   0x28    /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */
/* 输出: 长度, 数据流 */

#define CMD_WR_USB_DATA3 0x29    /* 向USB端点0的发送缓冲区写入数据块 */
/* 输入: 长度, 数据流 */

#define CMD_WR_USB_DATA5 0x2A    /* 向USB端点1的发送缓冲区写入数据块 */
/* 输入: 长度, 数据流 */

#define CMD_WR_USB_DATA7 0x2B    /* 向USB端点2的发送缓冲区写入数据块 */
/* 输入: 长度, 数据流 */

/* 以下命令用于USB主机方式 */

#define CMD_SET_BAUDRATE 0x02    /* 设置串口通讯波特率 */
/* 输入: 波特率分频系数, 波特率分频常数 */
/* 输出: 状态 */

#define CMD_ABORT_NAK   0x17    /* 主机方式: 放弃当前NAK的重试 */

#define CMD_SET_RETRY   0x0B    /* 主机方式: 设置USB事务操作的重试次数 */
/* 输入: 数据25H, 重试次数 */
/*                    位7为1则收到NAK时无限重试, 位3~位0为超时后的重试次数 */

#define CMD_ISSUE_TOKEN   0x4F    /* 主机方式: 发出令牌,执行事务 */
/* 输入: 事务属性 */
/*           低4位是令牌, 高4位是端点号 */
/* 输出中断 */

#define CMD_CLR_STALL   0x41    /* 主机方式: 控制传输-清除端点错误 */
/* 输入: 端点号 */
/* 输出中断 */

#define CMD_SET_ADDRESS   0x45    /* 主机方式: 控制传输-设置USB地址 */
/* 输入: 地址值 */
/* 输出中断 */

#define CMD_GET_DESCR   0x46    /* 主机方式: 控制传输-获取描述符 */
/* 输入: 描述符类型 */
/* 输出中断 */

#define CMD_SET_CONFIG   0x49    /* 主机方式: 控制传输-设置USB配置 */
/* 输入: 配置值 */
/* 输出中断 */

#define CMD_DISK_INIT   0x51    /* 主机方式: 初始化USB存储器 */
/* 输出中断 */

#define CMD_DISK_RESET   0x52    /* 主机方式: 复位USB存储器 */
/* 输出中断 */

#define CMD_DISK_SIZE   0x53    /* 主机方式: 获取USB存储器的容量 */
/* 输出中断 */

#define CMD_DISK_READ   0x54    /* 主机方式: 从USB存储器读数据块(以扇区512字节为单位) */
/* 输入: LBA扇区地址(总长度32位,低字节在前), 扇区数(01H~FFH) */
/* 输出中断 */

#define CMD_DISK_RD_GO   0x55    /* 主机方式: 继续执行USB存储器的读操作 */
/* 输出中断 */

#define CMD_DISK_WRITE   0x56    /* 主机方式: 向USB存储器写数据块(以扇区512字节为单位) */
/* 输入: LBA扇区地址(总长度32位,低字节在前), 扇区数(01H~FFH) */
/* 输出中断 */

#define CMD_DISK_WR_GO   0x57    /* 主机方式: 继续执行USB存储器的写操作 */
/* 输出中断 */

/* ********************************************************************************************************************* */
/* 操作状态 */

#define CMD_RET_SUCCESS   0x51    /* 命令操作成功 */
#define CMD_RET_ABORT   0x5F    /* 命令操作失败 */

/* ********************************************************************************************************************* */
/* USB中断状态 */

/* 以下状态代码0XH用于USB设备方式 */
/*   内置固件模式下只需要处理: USB_INT_EP1_IN, USB_INT_EP2_OUT, USB_INT_EP2_IN */
/*   位7-位4为0000 */
/*   位3-位2指示当前事务, 00=OUT, 10=IN, 11=SETUP */
/*   位1-位0指示当前端点, 00=端点0, 01=端点1, 10=端点2, 11=USB总线复位 */

#define USB_INT_EP0_SETUP 0x0C    /* USB端点0的SETUP */
#define USB_INT_EP0_OUT   0x00    /* USB端点0的OUT */
#define USB_INT_EP0_IN   0x08    /* USB端点0的IN */
#define USB_INT_EP1_OUT   0x01    /* USB端点1的OUT */
#define USB_INT_EP1_IN   0x09    /* USB端点1的IN */
#define USB_INT_EP2_OUT   0x02    /* USB端点2的OUT */
#define USB_INT_EP2_IN   0x0A    /* USB端点2的IN */
/* USB_INT_BUS_RESET 0x0000XX11B */   /* USB总线复位 */
#define USB_INT_BUS_RESET1 0x03    /* USB总线复位 */
#define USB_INT_BUS_RESET2 0x07    /* USB总线复位 */
#define USB_INT_BUS_RESET3 0x0B    /* USB总线复位 */
#define USB_INT_BUS_RESET4 0x0F    /* USB总线复位 */

/* 以下状态代码1XH用于USB主机方式的操作状态代码 */

#define USB_INT_SUCCESS   0x14    /* USB事务或者传输操作成功 */
#define USB_INT_CONNECT   0x15    /* 检测到USB设备连接事件 */
#define USB_INT_DISCONNECT 0x16    /* 检测到USB设备断开事件 */
#define USB_INT_BUF_OVER 0x17    /* USB控制传输的数据太多,缓冲区溢出 */
#define USB_INT_DISK_READ 0x1D    /* USB存储器读数据块,请求数据读出 */
#define USB_INT_DISK_WRITE 0x1E    /* USB存储器写数据块,请求数据写入 */
#define USB_INT_DISK_ERR 0x1F    /* USB存储器操作失败 */

/* ********************************************************************************************************************* */
/* 常用USB定义 */

/* USB的包标识PID */
#define DEF_USB_PID_NULL 0x00    /* 保留PID,未定义 */
#define DEF_USB_PID_SOF   0x05
#define DEF_USB_PID_SETUP 0x0D
#define DEF_USB_PID_IN   0x09
#define DEF_USB_PID_OUT   0x01
#define DEF_USB_PID_ACK   0x02
#define DEF_USB_PID_NAK   0x0A
#define DEF_USB_PID_STALL 0x0E
#define DEF_USB_PID_DATA0 0x03
#define DEF_USB_PID_DATA1 0x0B
#define DEF_USB_PID_PRE   0x0C

/* USB请求类型 */
#define DEF_USB_REQ_READ 0x80    /* 控制读操作 */
#define DEF_USB_REQ_WRITE 0x00    /* 控制写操作 */
#define DEF_USB_REQ_TYPE 0x60    /* 控制请求类型 */
#define DEF_USB_REQ_STAND 0x00    /* 标准请求 */
#define DEF_USB_REQ_CLASS 0x20    /* 设备类请求 */
#define DEF_USB_REQ_VENDOR 0x40    /* 厂商请求 */
#define DEF_USB_REQ_RESERVE 0x60    /* 保留请求 */

/* USB标准设备请求, RequestType的位6位5=00(Standard) */
#define DEF_USB_CLR_FEATURE 0x01
#define DEF_USB_SET_FEATURE 0x03
#define DEF_USB_GET_STATUS 0x00
#define DEF_USB_SET_ADDRESS 0x05
#define DEF_USB_GET_DESCR 0x06
#define DEF_USB_SET_DESCR 0x07
#define DEF_USB_GET_CONFIG 0x08
#define DEF_USB_SET_CONFIG 0x09
#define DEF_USB_GET_INTERF 0x0A
#define DEF_USB_SET_INTERF 0x0B
#define DEF_USB_SYNC_FRAME 0x0C

/* ********************************************************************************************************************* */

//ch375.c

#include <c8051f020.h>
#include <ch375.h>
#include <fat32.h>

#define UINT8     unsigned char
#define UINT16    unsigned int
#define UINT32    unsigned long
#define UINT8X    unsigned char xdata
#define uint     unsigned int   idata
#define uchar    unsigned char idata

UINT32 tem=0;

uint test=0;

UINT8X usb_rec_buff[64];
UINT8 usb_rec_buflen;
UINT8X diskbuff[512*2];

//引脚定义
#define    CH375_INT_WIRE    XINT       /* 连接CH375的INT#引脚,用于查询中断状态 */
#define    CH375DATA   P2

sbit A0=P1^0; 
sbit XRD=P1^1;
sbit XWR=P1^2;
sbit XINT=P1^3;
sbit CS=P1^4;

void nopdelay(UINT8 m)   //微妙级延时

while(m--);
}

void delay_ms(UINT8 m)   //毫秒级延时
{
UINT16 t=1000;
UINT8 i;
for(i=0;i<=m;i++,t=1000)
{
   while(t--);
}
}

void CH375_WR_CMD_PORT( UINT8 cmd ) 
{ /* 向CH375的命令端口写入命令 */
A0=1;
CH375DATA=cmd; //先将A0线置成1,然后准备端口数据,之后产生一个WR写信号
XWR=0;
XWR=1;
}

void CH375_WR_DAT_PORT( UINT8 dat ) 
{ /* 向CH375的数据端口写入数据 */
A0=0;
CH375DATA=dat;   
XWR=0;
XWR=1;
}

UINT8 CH375_RD_DAT_PORT( void ) /* 从CH375的数据端口读出数据 */ 
{    
    UINT8 temp;
A0=0;
CH375DATA=0xff;
nopdelay(1);
XRD=0;
nopdelay(5);
temp=CH375DATA;
XRD=1;
nopdelay(1);
return(temp);

}

UINT8 set_usb_mode( UINT8 mode ) /* 设置CH37X的工作模式 */
{
UINT8 i;
UINT8 RD_Data;

CH375_WR_CMD_PORT(CMD_SET_USB_MODE); 
   nopdelay(10);
   CH375_WR_DAT_PORT(mode); 
   nopdelay(1);

for( i=0; i<100; i++ )   /* 等待设置模式操作完成,不超过30uS */
    {
     RD_Data=CH375_RD_DAT_PORT();
     if( RD_Data == CMD_RET_SUCCESS ) return 1;
    } /* 成功 */
   return 0;
}

UINT8 ch375_init()/*CH375芯片初始化*/
{
UINT8 i, k;

/* 测试CH375是否正常工作 */
for( k=100; k>=0; k-- )
    {
   CH375_WR_CMD_PORT(CMD_CHECK_EXIST);   /* 测试CH375是否正常工作 */
   nopdelay(10);
   CH375_WR_DAT_PORT(0x0f); /* 写入测试数据 */
   nopdelay(1);

i=CH375_RD_DAT_PORT(); /* 返回数据应该是测试数据取反 */
       if (i!=0xf0 )   /* CH375不正常 */
     {
       for ( i=5; i>0; i-- )
     { 
     CH375_WR_CMD_PORT(CMD_RESET_ALL); /* 多次重复发命令,执行硬件复位 */
    delay_ms(50); /* 延时50ms */
     }
     }
    else break;
     }
   if( k==0 )   return 0;
   else return 1;
   
        //CH375_WR_CMD_PORT( CMD_SET_USB_ID );        // 设置外部自定义的USB设备VID和PID,可选操作
     //CH375_WR_DAT_PORT( (unsigned char)MY_USB_VENDOR_ID ); // 写入厂商ID的低字节
     //CH375_WR_DAT_PORT( (unsigned char)(MY_USB_VENDOR_ID>>8) ); // 写入厂商ID的高字节
     //CH375_WR_DAT_PORT( (unsigned char)MY_USB_DEVICE_ID );   // 写入设备ID的低字节
     //CH375_WR_DAT_PORT( (unsigned char)(MY_USB_DEVICE_ID>>8) ); // 写入设备ID的高字节
     /* 设置USB工作模式, 必要操作 */
     // set_usb_mode( 1 ); //外部固件模式
// return set_usb_mode(mode); //内部固件模式
}

UINT8 get_ver(void) //返回芯片版本号
{ UINT8 ver;
    CH375_WR_CMD_PORT(0x01);
ver=CH375_RD_DAT_PORT();
    return ver; 
}

UINT8 mWaitInterrupt( void ) /* 等待CH375中断并获取状态,返回操作状态 */ 

   while( CH375_INT_WIRE );
     CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断,获取中断状态 */
return( CH375_RD_DAT_PORT( ) ); 
}

//--------------------------------------------

//-----------------------------------------

/*
void _usb_send(unsigned char *pbuff,unsigned char len)
{    
     unsigned char i,status;
   usb_cmd=CMD_WR_USB_DATA7;
nop();
nop();
nop();
usb_data=len;

nop();
     for(i=0;i<len;i++)

     usb_data=pbuff[i];
   nop();
}
while(status!=USB_INT_EP2_IN)
{   
    usb_cmd=CMD_GET_STATUS;
nop();
nop();
nop();
    status=usb_data;
nop();
nop();
nop();
}
}
void usb_send_data(unsigned char *pbuff,unsigned int len)
{    
     unsigned char i,status,r,n;
     EIMSK&=~0x10;
   r=len/64;
   n=len%64;
   for(i=0;i<r;i++)
   _usb_send((pbuff+i*64),64);
   _usb_send((pbuff+i*64),n);

usb_cmd=CMD_UNLOCK_USB;
nop();

}

*/

/
                            // 主机模式
/

UINT8 InitDisk(void) //初始化磁盘

   UINT8 status;
   CH375_WR_CMD_PORT( CMD_GET_STATUS );
   nopdelay(10);
   status=CH375_RD_DAT_PORT();

if (status==USB_INT_DISCONNECT) return status;//usb断开
   CH375_WR_CMD_PORT( CMD_DISK_INIT);
   status=mWaitInterrupt();
   if (status!=USB_INT_SUCCESS) return status;
   CH375_WR_CMD_PORT(CMD_DISK_SIZE );
   status= mWaitInterrupt();
   if (status!=USB_INT_SUCCESS) 
   {
        delay_ms(250);
    CH375_WR_CMD_PORT(CMD_DISK_SIZE );
        status=mWaitInterrupt();   
   }
    if (status!=USB_INT_SUCCESS)   return status;
return 1;//u盘初始化成功
}

UINT8 ReadSector( UINT32 iLbaStart, UINT8 iSectorCount, UINT8X *oDataBuffer ) 
{    //读扇区
UINT16 mBlockCount;
UINT8 c;

CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 从USB存储器读数据块 */
nopdelay(200);
CH375_WR_DAT_PORT( (UINT8)iLbaStart ); //先写低字节四个字节 LBA 
   nopdelay(2);
CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 8 ) );
     nopdelay(2);
CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 16 ) );
     nopdelay(2);
CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 24 ) ); //后写高字节
     nopdelay(2);

CH375_WR_DAT_PORT( iSectorCount ); //读取扇区数 扇区号
     nopdelay(2);

for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- ) 
   {   //一个扇区512字节 而每次最多产生64字节数据 故共需读8次
       c=mWaitInterrupt( );    //等待中断并获取状态 写完指令和地址后 如果CH375准备好数据就会有中断
       if ( c== USB_INT_DISK_READ )   /* 等待中断并获取状态,并清除中断,请求数据读出 */
     { test++;
           CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375缓冲区读取数据块指令 */
        nopdelay(20);
      c = CH375_RD_DAT_PORT( );      //后续数据的长度 返回的第一字节为数据长度 最大值为64
          while ( c -- ) 
     {*oDataBuffer++ = CH375_RD_DAT_PORT( );//循环读取数据
         nopdelay(2);
      }
          CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 继续执行USB存储器的读操作 */
         nopdelay(20);
    }
        else break; /* 返回错误状态 */ 
   }
   if ( mBlockCount == 0 ) //判断跳出的原因,最后一次即最后一次读取完后会产生一个USB_INT_SUCCESS中断
{
   c = mWaitInterrupt( ); /* 等待中断并获取状态 */
      if ( c== USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */
   }
return( c ); /* 操作失败返回错误原因 */
}

UINT8 WriteSector( UINT32 iLbaStart, UINT8 iSectorCount, UINT8 *oDataBuffer) 
{   //写扇区
UINT16 mBlockCount;
UINT8 c;
CH375_WR_CMD_PORT(CMD_DISK_WRITE); /* 向USB存储器写数据块 */
nopdelay(10);

CH375_WR_DAT_PORT((UINT8)iLbaStart); /* LBA的最低8位 */
nopdelay(1);
    CH375_WR_DAT_PORT((UINT8)(iLbaStart >> 8));
nopdelay(1);
    CH375_WR_DAT_PORT((UINT8)(iLbaStart>> 16));
nopdelay(1);
    CH375_WR_DAT_PORT((UINT8)(iLbaStart>> 24)); /* LBA的最高8位 */
nopdelay(1);
    CH375_WR_DAT_PORT(iSectorCount);   /* 扇区数 */

for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- ) 
{
       c =mWaitInterrupt(); /* 等待中断并获取状态 */
        if ( c == USB_INT_DISK_WRITE ) 
    { /* 等待中断并获取状态,请求数据写 */
       CH375_WR_CMD_PORT(CMD_WR_USB_DATA7);/* 从CH375缓冲区写数据块 */
       nopdelay(10);
   c=64;
       CH375_WR_DAT_PORT(c);/* 后续数据的长度 */
       nopdelay(2);

while ( c -- ) 
        {
     CH375_WR_DAT_PORT(*oDataBuffer++);
        nopdelay(1);
      }
        CH375_WR_CMD_PORT(CMD_DISK_WR_GO); /* 继续执行USB存储器的写操作 */
         }
           else break; /* 返回错误状态 */
}
if ( mBlockCount == 0 )
{
    c = mWaitInterrupt(); /* 等待中断并获取状态 */
    if ( c== USB_INT_SUCCESS ) return( 1 ); /* 操作成功 */
}
return( c ); /* 操作失败 */
}

UINT16 WordSwap(UINT16 input)   //字数据的前后字节交换
{
return(((input&0x00FF)<<8)|((input&0xFF00)>>8));
}

UINT16 LSwapINT16(UINT16 dData1,UINT16 dData2) //第二个字节在高位
{    //将两个字节集中到一个字数据中
    unsigned int dData;
    dData = ((dData2<<8)&0xff00)|(dData1&0x00ff);
return dData;
}

UINT32 LSwapINT32(UINT32 dData1,UINT32 dData2,UINT32 dData3,UINT32 dData4)
{   //将四个字节集中到一个一个双字数据中
    UINT32 dData;
    dData = ((dData4<<24)&0xff000000)|((dData3<<16)&0xff0000)|((dData2<<8)&0xff00)|(dData1&0xff);
return dData;
}

UINT8 EnumMassDev(void) //获取U盘的细节信息
{   UINT8 c;
UINT16 ReservedSectorsNum;

DeviceInfo.BPB_BytesPerSec=512; //暂假设为512

c=ReadSector(0,1,diskbuff);
if(c!=0) return c;
//
if(diskbuff[0]==0xeb||diskbuff[0]==0xe9)
   {
   DeviceInfo.StartSector=0;
   }
else
   {
   DeviceInfo.StartSector=LSwapINT32(diskbuff[454],diskbuff[455],diskbuff[456],diskbuff[457]);
   c=ReadSector(DeviceInfo.StartSector,1,diskbuff);
     if(c!=0) return c;
   }
///

DeviceInfo.BPB_BytesPerSec=LSwapINT16(diskbuff[11],diskbuff[12]);
DeviceInfo.BPB_SecPerClus=diskbuff[13];
ReservedSectorsNum=LSwapINT16(diskbuff[14],diskbuff[15]);//保留区扇区个数
DeviceInfo.BPB_NumFATs=diskbuff[16];

if(diskbuff[82]=='F'&&diskbuff[83]=='A'&&diskbuff[84]=='T'&&diskbuff[85]=='3'&&diskbuff[86]=='2')
   {//FAT32格式
   DeviceInfo.BPB_TotSec32=LSwapINT32(diskbuff[32],diskbuff[33],diskbuff[34],diskbuff[35]);
   DeviceInfo.BPB_FATSz32=LSwapINT32(diskbuff[36],diskbuff[37],diskbuff[38],diskbuff[39]);
   DeviceInfo.RootStartCluster=LSwapINT32(diskbuff[44],diskbuff[45],diskbuff[46],diskbuff[47]);
   DeviceInfo.FatStartSector=DeviceInfo.StartSector+ReservedSectorsNum;
   DeviceInfo.FirstDataSector=DeviceInfo.FatStartSector+DeviceInfo.BPB_NumFATs*DeviceInfo.BPB_FATSz32;
   DeviceInfo.TotCluster=(DeviceInfo.BPB_TotSec32-DeviceInfo.FirstDataSector+1)/DeviceInfo.BPB_SecPerClus+1;
   DeviceInfo.FAT=1; //FAT16=0,FAT32=1;
   }
   else return 0;

//ThisFile.bFileOpen=0; 
return 1;
}

http://hi.baidu.com/lcc8559/item/f76c517da53b0b326e29f6a9

8051f CH375 优盘---ch375.c相关推荐

  1. 用51单片机和ch375实现键鼠功能

    用51单片机和ch375实现键鼠功能 说明: 为了参加比赛,我和我的队友设计了一款人机交互系统,我负责接收摄像头数据和模拟键鼠功能,由于当时只是学习了51故用51单片机和ch375模拟一套简单的键鼠功 ...

  2. USB设备,鼠标,键盘使用CH372,CH375,进行模拟的历程

    开始打算做一个关于USB设备共享的机器,多台电脑共享一个鼠标键盘: 模拟鼠标或者键盘,必须使用外部固件模式,内置固件只负责信息数据的传输,所以不得不选择并口控制或者SPI的方式,接下来就是了解基本的U ...

  3. 遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题

    遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题 Delphi / Windows SDK/API http://www.delphi2007.net/DelphiNetwork/ht ...

  4. 关于CH375芯片的简介以及其与51单片机的连接

    在MP3这个项目中,除了解码模块,最重要的就是U盘读写模块了,我们需要通过U盘将音乐发送给单片机,再进行输出,而在这一模块中我们选用的是CH375这一款芯片. 同样,由于项目目前还处于硬件电路制作这一 ...

  5. CH375与中断传输

    发表于:2008-3-24 11:26:00,来源于:58.39.48.34 发贴心情: ------------------------------------------------------- ...

  6. CH375 usb芯片的引脚图及中文资料

    CH375 芯片是我们国产的usb接口芯片,有了她我们可以使用任意一种单片机来连接电脑,或者是制作usb便携设备,非常方便,关键是是他有官方提供的中文资料,这大大降低了我们使用的门槛 http://w ...

  7. 基于CH375的嵌入式USB文件加解密系统的设计

    基于CH375的嵌入式USB文件加解密系统的设计 [日期:2008-7-21] 来源:电子技术应用  作者:华中科技大学 电子与信息工程系, 湖北 武汉 430074 [字体:大 中 小] <s ...

  8. 基于CH375的智能数据采集卡设计分析

    引言 数据采集是现代电子系统中不可缺少的重要组成部分,在测量.制造.自动控制等场合都需要高质量的信号采集环节,由于ADC技术和微控制器技术的相对成熟,基于PCI,ISA等接口的数据采集卡被广泛地应用在 ...

  9. 芯片CH375 (WCH)

    CH375 是一个 USB 总线的通用接口芯片, 支持 USB-HOST 主机方式和 USB-DEVICE/SLAVE 设备方式. 在本地端,CH375 具有 8 位数据总线和读.写.片选控制线以及断 ...

最新文章

  1. iOS开发UI篇—UITabBarController简单介绍
  2. jQuery 的 slideUp 和 slideDown 下拉卷动问题
  3. ubuntu将mysql、nginx添加到环境变量中
  4. mysql+影响的行数+获取_我们如何获得受MySQL查询影响的总行数?
  5. Weighted-Entropy-based Quantization for Deep Neural Networks 论文笔记
  6. 微信公众号开发 [03] 结合UEditor实现图文消息群发功能
  7. 8.var目录下的文件和目录详解
  8. javafx 图标_JavaFX技巧32:需要图标吗? 使用Ikonli!
  9. 开源开放 | Beyond 预训练语言模型,NLP还需要什么样的知识?
  10. StringUtils 的使用
  11. Postman从入门到入门
  12. 英伟达老黄又来送大礼,全新Titan V CEO限量版GPU火力全开
  13. Win10之打印机扫描为pdf格式
  14. 网络编程(1)—— 基于linux系统的socket服务器端编程步骤
  15. 往十年不忘初心,新十年不负韶华丨万字长文带你完整回顾2020数据技术嘉年华
  16. Gimp去除图片背景色方法
  17. 【元胞自动机】元胞自动机地铁火灾疏散模型【含Matlab源码 246期】
  18. 菜鸟的数学建模之路(二):线性与非线性回归
  19. C++语言程序设计课程设计任务书
  20. Sql server如果存在就更新,不存在就插入

热门文章

  1. Windows系统性能提升方法
  2. 搜索引擎系统学习与开发实践总结
  3. Android elevation使用
  4. Java 计算任意两天之间相隔的天数
  5. ZHA_123的自我介绍
  6. php监听网卡数据,VnStat PHP:用于监控网络带宽使用的基于Web的界面
  7. windows10、windows11无法连接到打印机,错误代码0x0000011b,不删 KB5005565更新的解决办法,亲测可行
  8. 计算机没有autoCAD_BKM ? 37期 — 教你Python玩转AutoCAD
  9. windows pyinstaller打包pytorch程序到exe文件
  10. Java基础系列19:使用JXL或者POI生成和解析Excel文件