8051f CH375 优盘---ch375.c
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相关推荐
- 用51单片机和ch375实现键鼠功能
用51单片机和ch375实现键鼠功能 说明: 为了参加比赛,我和我的队友设计了一款人机交互系统,我负责接收摄像头数据和模拟键鼠功能,由于当时只是学习了51故用51单片机和ch375模拟一套简单的键鼠功 ...
- USB设备,鼠标,键盘使用CH372,CH375,进行模拟的历程
开始打算做一个关于USB设备共享的机器,多台电脑共享一个鼠标键盘: 模拟鼠标或者键盘,必须使用外部固件模式,内置固件只负责信息数据的传输,所以不得不选择并口控制或者SPI的方式,接下来就是了解基本的U ...
- 遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题
遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题 Delphi / Windows SDK/API http://www.delphi2007.net/DelphiNetwork/ht ...
- 关于CH375芯片的简介以及其与51单片机的连接
在MP3这个项目中,除了解码模块,最重要的就是U盘读写模块了,我们需要通过U盘将音乐发送给单片机,再进行输出,而在这一模块中我们选用的是CH375这一款芯片. 同样,由于项目目前还处于硬件电路制作这一 ...
- CH375与中断传输
发表于:2008-3-24 11:26:00,来源于:58.39.48.34 发贴心情: ------------------------------------------------------- ...
- CH375 usb芯片的引脚图及中文资料
CH375 芯片是我们国产的usb接口芯片,有了她我们可以使用任意一种单片机来连接电脑,或者是制作usb便携设备,非常方便,关键是是他有官方提供的中文资料,这大大降低了我们使用的门槛 http://w ...
- 基于CH375的嵌入式USB文件加解密系统的设计
基于CH375的嵌入式USB文件加解密系统的设计 [日期:2008-7-21] 来源:电子技术应用 作者:华中科技大学 电子与信息工程系, 湖北 武汉 430074 [字体:大 中 小] <s ...
- 基于CH375的智能数据采集卡设计分析
引言 数据采集是现代电子系统中不可缺少的重要组成部分,在测量.制造.自动控制等场合都需要高质量的信号采集环节,由于ADC技术和微控制器技术的相对成熟,基于PCI,ISA等接口的数据采集卡被广泛地应用在 ...
- 芯片CH375 (WCH)
CH375 是一个 USB 总线的通用接口芯片, 支持 USB-HOST 主机方式和 USB-DEVICE/SLAVE 设备方式. 在本地端,CH375 具有 8 位数据总线和读.写.片选控制线以及断 ...
最新文章
- iOS开发UI篇—UITabBarController简单介绍
- jQuery 的 slideUp 和 slideDown 下拉卷动问题
- ubuntu将mysql、nginx添加到环境变量中
- mysql+影响的行数+获取_我们如何获得受MySQL查询影响的总行数?
- Weighted-Entropy-based Quantization for Deep Neural Networks 论文笔记
- 微信公众号开发 [03] 结合UEditor实现图文消息群发功能
- 8.var目录下的文件和目录详解
- javafx 图标_JavaFX技巧32:需要图标吗? 使用Ikonli!
- 开源开放 | Beyond 预训练语言模型,NLP还需要什么样的知识?
- StringUtils 的使用
- Postman从入门到入门
- 英伟达老黄又来送大礼,全新Titan V CEO限量版GPU火力全开
- Win10之打印机扫描为pdf格式
- 网络编程(1)—— 基于linux系统的socket服务器端编程步骤
- 往十年不忘初心,新十年不负韶华丨万字长文带你完整回顾2020数据技术嘉年华
- Gimp去除图片背景色方法
- 【元胞自动机】元胞自动机地铁火灾疏散模型【含Matlab源码 246期】
- 菜鸟的数学建模之路(二):线性与非线性回归
- C++语言程序设计课程设计任务书
- Sql server如果存在就更新,不存在就插入
热门文章
- Windows系统性能提升方法
- 搜索引擎系统学习与开发实践总结
- Android elevation使用
- Java 计算任意两天之间相隔的天数
- ZHA_123的自我介绍
- php监听网卡数据,VnStat PHP:用于监控网络带宽使用的基于Web的界面
- windows10、windows11无法连接到打印机,错误代码0x0000011b,不删 KB5005565更新的解决办法,亲测可行
- 计算机没有autoCAD_BKM ? 37期 — 教你Python玩转AutoCAD
- windows pyinstaller打包pytorch程序到exe文件
- Java基础系列19:使用JXL或者POI生成和解析Excel文件