u盘读写控制源程序ch376芯片之欧阳法创编.docx
《u盘读写控制源程序ch376芯片之欧阳法创编.docx》由会员分享,可在线阅读,更多相关《u盘读写控制源程序ch376芯片之欧阳法创编.docx(76页珍藏版)》请在冰豆网上搜索。
u盘读写控制源程序ch376芯片之欧阳法创编
主要包含4个C文件和和三个头文件
时间:
2021.03.09
创作:
欧阳法
CH376INC.H与CH376HFT.C为u盘主文件
SPI_SW.C为对硬件操作文件单片机与SPI接口
FILE_SYS.H与FILE_SYS.C为ch376接口函数
分别列出
CH376INC.H文件:
/*CDefineforCH376*/
/*Website:
*/
/*Email:
tech@*/
/*Author:
W.ch.10*/
/*V1.0forCH376*/
#ifndef__CH376INC_H__
#define__CH376INC_H__
#ifdef__cplusplus
extern"C"{
#endif
/***********************************************************************************************************************/
/*常用类型和常量定义*/
#ifndefTRUE
#defineTRUE1
#defineFALSE0
#endif
#ifndefNULL
#defineNULL0
#endif
#ifndefUINT8
typedefunsignedcharUINT8;
#endif
#ifndefUINT16
typedefunsignedshortUINT16;
#endif
#ifndefUINT32
typedefunsignedlongUINT32;
#endif
#ifndefPUINT8
typedefunsignedchar*PUINT8;
#endif
#ifndefPUINT16
typedefunsignedshort*PUINT16;
#endif
#ifndefPUINT32
typedefunsignedlong*PUINT32;
#endif
#ifndefUINT8V
typedefunsignedcharvolatileUINT8V;
#endif
#ifndefPUINT8V
typedefunsignedcharvolatile*PUINT8V;
#endif
/***********************************************************************************************************************/
/*硬件特性*/
#defineCH376_DAT_BLOCK_LEN0x40/*USB单个数据包,数据块的最大长度,默认缓冲区的长度*/
/***********************************************************************************************************************/
/*命令代码*/
/*部分命令兼容CH375芯片,但是输入数据或者输出数据的可能局部不同)*/
/*一个命令操作顺序包含:
一个命令码(对于串口方式,命令码之前还需要两个同步码),
若干个输入数据(可以是0个),
产生中断通知或者若干个输出数据(可以是0个),二选一,有中断通知则一定没有输出数据,有输出数据则一定不产生中断
仅CMD01_WR_REQ_DATA命令例外,顺序包含:
一个命令码,一个输出数据,若干个输入数据
命令码起名规则:
CMDxy_NAME
其中的x和y都是数字,x说明最少输入数据个数(字节数),y说明最少输出数据个数(字节数),y如果是H则说明产生中断通知,
有些命令能够实现0到多个字节的数据块读写,数据块本身的字节数未包含在上述x或y之内*/
/*本文件默认会同时提供与CH375芯片命令码兼容的命令码格式(即去掉x和y之后),如果不需要,那么可以定义_NO_CH375_COMPATIBLE_禁止*/
/***********************************************************************************************************************/
/*主要命令(手册一),常用*/
#defineCMD01_GET_IC_VER0x01/*获取芯片及固件版本*/
/*输出:
版本号(位7为0,位6为1,位5~位0为版本号)*/
/*CH376返回版本号的值为041H即版本号为01H*/
#defineCMD21_SET_BAUDRATE0x02/*串口方式:
设置串口通讯波特率(上电或者复位后的默认波特率为9600bps,由D4/D5/D6引脚选择)*/
/*输入:
波特率分频系数,波特率分频常数*/
/*输出:
操作状态(CMD_RET_SUCCESS或CMD_RET_ABORT,其它值说明操作未完成)*/
#defineCMD00_ENTER_SLEEP0x03/*进入睡眠状态*/
#defineCMD00_RESET_ALL0x05/*执行硬件复位*/
#defineCMD11_CHECK_EXIST0x06/*测试通讯接口和工作状态*/
/*输入:
任意数据*/
/*输出:
输入数据的按位取反*/
#defineCMD20_CHK_SUSPEND0x0B/*设备方式:
设置检查USB总线挂起状态的方式*/
/*输入:
数据10H,检查方式*/
/*00H=不检查USB挂起,04H=以50mS为间隔检查USB挂起,05H=以10mS为间隔检查USB挂起*/
#defineCMD20_SET_SDO_INT0x0B/*SPI接口方式:
设置SPI的SDO引脚的中断方式*/
/*输入:
数据16H,中断方式*/
/*10H=禁止SDO引脚用于中断输出,在SCS片选无效时三态输出禁止,90H=SDO引脚在SCS片选无效时兼做中断请求输出*/
#defineCMD14_GET_FILE_SIZE0x0C/*主机文件模式:
获取当前文件长度*/
/*输入:
数据68H*/
/*输出:
当前文件长度(总长度32位,低字节在前)*/
#defineCMD50_SET_FILE_SIZE0x0D/*主机文件模式:
设置当前文件长度*/
/*输入:
数据68H,当前文件长度(总长度32位,低字节在前)*/
#defineCMD11_SET_USB_MODE0x15/*设置USB工作模式*/
/*输入:
模式代码*/
/*00H=未启用的设备方式,01H=已启用的设备方式并且使用外部固件模式(串口不支持),02H=已启用的设备方式并且使用内置固件模式*/
/*03H=SD卡主机模式/未启用的主机模式,用于管理和存取SD卡中的文件*/
/*04H=未启用的主机方式,05H=已启用的主机方式,06H=已启用的主机方式并且自动产生SOF包,07H=已启用的主机方式并且复位USB总线*/
/*输出:
操作状态(CMD_RET_SUCCESS或CMD_RET_ABORT,其它值说明操作未完成)*/
#defineCMD01_GET_STATUS0x22/*获取中断状态并取消中断请求*/
/*输出:
中断状态*/
#defineCMD00_UNLOCK_USB0x23/*设备方式:
释放当前USB缓冲区*/
#defineCMD01_RD_USB_DATA00x27/*从当前USB中断的端点缓冲区或者主机端点的接收缓冲区读取数据块*/
/*输出:
长度,数据流*/
#defineCMD01_RD_USB_DATA0x28/*设备方式:
从当前USB中断的端点缓冲区读取数据块,并释放缓冲区,相当于CMD01_RD_USB_DATA0+CMD00_UNLOCK_USB*/
/*输出:
长度,数据流*/
#defineCMD10_WR_USB_DATA70x2B/*设备方式:
向USB端点2的发送缓冲区写入数据块*/
/*输入:
长度,数据流*/
#defineCMD10_WR_HOST_DATA0x2C/*向USB主机端点的发送缓冲区写入数据块*/
/*输入:
长度,数据流*/
#defineCMD01_WR_REQ_DATA0x2D/*向内部指定缓冲区写入请求的数据块*/
/*输出:
长度*/
/*输入:
数据流*/
#defineCMD20_WR_OFS_DATA0x2E/*向内部缓冲区指定偏移地址写入数据块*/
/*输入:
偏移,长度,数据流*/
#defineCMD10_SET_FILE_NAME0x2F/*主机文件模式:
设置将要操作的文件的文件名*/
/*输入:
以0结束的字符串(含结束符0在内长度不超过14个字符)*/
/***********************************************************************************************************************/
/*主要命令(手册一),常用,以下命令总是在操作结束时产生中断通知,并且总是没有输出数据*/
#defineCMD0H_DISK_CONNECT0x30/*主机文件模式/不支持SD卡:
检查磁盘是否连接*/
/*输出中断*/
#defineCMD0H_DISK_MOUNT0x31/*主机文件模式:
初始化磁盘并测试磁盘是否就绪*/
/*输出中断*/
#defineCMD0H_FILE_OPEN0x32/*主机文件模式:
打开文件或者目录(文件夹),或者枚举文件和目录(文件夹)*/
/*输出中断*/
#defineCMD0H_FILE_ENUM_GO0x33/*主机文件模式:
继续枚举文件和目录(文件夹)*/
/*输出中断*/
#defineCMD0H_FILE_CREATE0x34/*主机文件模式:
新建文件,如果文件已经存在那么先删除*/
/*输出中断*/
#defineCMD0H_FILE_ERASE0x35/*主机文件模式:
删除文件,如果已经打开则直接删除,否则对于文件会先打开再删除,子目录必须先打开*/
/*输出中断*/
#defineCMD1H_FILE_CLOSE0x36/*主机文件模式:
关闭当前已经打开的文件或者目录(文件夹)*/
/*输入:
是否允许更新文件长度*/
/*00H=禁止更新长度,01H=允许更新长度*/
/*输出中断*/
#defineCMD1H_DIR_INFO_READ0x37/*主机文件模式:
读取文件的目录信息*/
/*输入:
指定需要读取的目录信息结构在扇区内的索引号*/
/*索引号范围为00H~0FH,索引号0FFH则为当前已经打开的文件*/
/*输出中断*/
#defineCMD0H_DIR_INFO_SAVE0x38/*主机文件模式:
保存文件的目录信息*/
/*输出中断*/
#defineCMD4H_BYTE_LOCATE0x39/*主机文件模式:
以字节为单位移动当前文件指针*/
/*输入:
偏移字节数(总长度32位,低字节在前)*/
/*输出中断*/
#defineCMD2H_BYTE_READ0x3A/*主机文件模式:
以字节为单位从当前位置读取数据块*/
/*输入:
请求读取的字节数(总长度16位,低字节在前)*/
/*输出中断*/
#defineCMD0H_BYTE_RD_GO0x3B/*主机文件模式:
继续字节读*/
/*输出中断*/
#defineCMD2H_BYTE_WRITE0x3C/*主机文件模式:
以字节为单位向当前位置写入数据块*/
/*输入:
请求写入的字节数(总长度16位,低字节在前)*/
/*输出中断*/
#defineCMD0H_BYTE_WR_GO0x3D/*主机文件模式:
继续字节写*/
/*输出中断*/
#defineCMD0H_DISK_CAPACITY0x3E/*主机文件模式:
查询磁盘物理容量*/
/*输出中断*/
#defineCMD0H_DISK_QUERY0x3F/*主机文件模式:
查询磁盘空间信息*/
/*输出中断*/
#defineCMD0H_DIR_CREATE0x40/*主机文件模式:
新建目录(文件夹)并打开,如果目录已经存在那么直接打开*/
/*输出中断*/
#defineCMD4H_SEC_LOCATE0x4A/*主机文件模式:
以扇区为单位移动当前文件指针*/
/*输入:
偏移扇区数(总长度32位,低字节在前)*/
/*输出中断*/
#defineCMD1H_SEC_READ0x4B/*主机文件模式/不支持SD卡:
以扇区为单位从当前位置读取数据块*/
/*输入:
请求读取的扇区数*/
/*输出中断*/
#defineCMD1H_SEC_WRITE0x4C/*主机文件模式/不支持SD卡:
以扇区为单位在当前位置写入数据块*/
/*输入:
请求写入的扇区数*/
/*输出中断*/
#defineCMD0H_DISK_BOC_CMD0x50/*主机方式/不支持SD卡:
对USB存储器执行BulkOnly传输协议的命令*/
/*输出中断*/
#defineCMD5H_DISK_READ0x54/*主机方式/不支持SD卡:
从USB存储器读物理扇区*/
/*输入:
LBA物理扇区地址(总长度32位,低字节在前),扇区数(01H~FFH)*/
/*输出中断*/
#defineCMD0H_DISK_RD_GO0x55/*主机方式/不支持SD卡:
继续执行USB存储器的物理扇区读操作*/
/*输出中断*/
#defineCMD5H_DISK_WRITE0x56/*主机方式/不支持SD卡:
向USB存储器写物理扇区*/
/*输入:
LBA物理扇区地址(总长度32位,低字节在前),扇区数(01H~FFH)*/
/*输出中断*/
#defineCMD0H_DISK_WR_GO0x57/*主机方式/不支持SD卡:
继续执行USB存储器的物理扇区写操作*/
/*输出中断*/
/***********************************************************************************************************************/
/*辅助命令(手册二),不太常用或者是为了与CH375和CH372兼容*/
#defineCMD10_SET_USB_SPEED0x04/*设置USB总线速度,在每次CMD11_SET_USB_MODE设置USB工作模式时会自动恢复到12Mbps全速*/
/*输入:
总线速度代码*/
/*00H=12Mbps全速FullSpeed(默认值),01H=1.5Mbps(仅修改频率),02H=1.5Mbps低速LowSpeed*/
#defineCMD11_GET_DEV_RATE0x0A/*主机方式:
获取当前连接的USB设备的数据速率类型*/
/*输入:
数据07H*/
/*输出:
数据速率类型*/
/*位4为1则是1.5Mbps低速USB设备,否则是12Mbps全速USB设备*/
#defineCMD11_GET_TOGGLE0x0A/*获取OUT事务的同步状态*/
/*输入:
数据1AH*/
/*输出:
同步状态*/
/*位4为1则OUT事务同步,否则OUT事务不同步*/
#defineCMD11_READ_VAR80x0A/*读取指定的8位文件系统变量*/
/*输入:
变量地址*/
/*输出:
数据*/
/*#defineCMD11_GET_MAX_LUN=CMD11_READ_VAR8(VAR_UDISK_LUN)*//*主机方式:
获取USB存储器最大和当前逻辑单元号*/
#defineCMD20_SET_RETRY0x0B/*主机方式:
设置USB事务操作的重试次数*/
/*输入:
数据25H,重试次数*/
/*位7为0则收到NAK时不重试,位7为1位6为0则收到NAK时无限重试,位7为1位6为1则收到NAK时最多重试3秒,位5~位0为超时后的重试次数*/
#defineCMD20_WRITE_VAR80x0B/*设置指定的8位文件系统变量*/
/*输入:
变量地址,数据*/
/*#defineCMD20_SET_DISK_LUN=CMD20_WRITE_VAR8(VAR_UDISK_LUN)*//*主机方式:
设置USB存储器的当前逻辑单元号*/
#defineCMD14_READ_VAR320x0C/*读取指定的32位文件系统变量*/
/*输入:
变量地址*/
/*输出:
数据(总长度32位,低字节在前)*/
#defineCMD50_WRITE_VAR320x0D/*设置指定的32位文件系统变量*/
/*输入:
变量地址,数据(总长度32位,低字节在前)*/
#defineCMD01_DELAY_100US0x0F/*延时100uS(串口不支持)*/
/*输出:
延时期间输出0,延时结束输出非0*/
#defineCMD40_SET_USB_ID0x12/*设备方式:
设置USB厂商VID和产品PID*/
/*输入:
厂商ID低字节,厂商ID高字节,产品ID低字节,产品ID高字节*/
#defineCMD10_SET_USB_ADDR0x13/*设置USB地址*/
/*输入:
地址值*/
#defineCMD01_TEST_CONNECT0x16/*主机方式/不支持SD卡:
检查USB设备连接状态*/
/*输出:
状态(USB_INT_CONNECT或USB_INT_DISCONNECT或USB_INT_USB_READY,其它值说明操作未完成)*/
#defineCMD00_ABORT_NAK0x17/*主机方式:
放弃当前NAK的重试*/
#defineCMD10_SET_ENDP20x18/*设备方式(串口不支持):
设置USB端点0的接收器*/
/*输入:
工作方式*/
/*位7为1则位6为同步触发位,否则同步触发位不变*/
/*位3~位0为事务响应方式:
0000就绪ACK,1110正忙NAK,1111错误STALL*/
#defineCMD10_SET_ENDP30x19/*设备方式(串口不支持):
设置USB端点0的发送器*/
/*输入:
工作方式*/
/*位7为1则位6为同步触发位,否则同步触发位不变*/
/*位3~位0为事务响应方式:
0000~1000就绪ACK,1110正忙NAK,1111错误STALL*/
#defineCMD10_SET_ENDP40x1A/*设备方式(串口不支持):
设置USB端点1的接收器*/
/*输入:
工作方式*/
/*位7为1则位6为同步触发位,否则同步触发位不变*/
/*位3~位0为事务响应方式:
0000就绪ACK,1110正忙NAK,1111错误STALL*/
#defineCMD10_SET_ENDP50x1B/*设备方式(串口不支持):
设置USB端点1的发送器*/
/*输入:
工作方式*/
/*位7为1则位6为同步触发位,否则同步触发位不变*/
/*位3~位0为事务响应方式:
0000~1000就绪ACK,1110正忙NAK,1111错误STALL*/
#defineCMD10_SET_ENDP60x1C/*设置USB端点2/主机端点的接收器*/
/*输入:
工作方式*/
/*位7为1则位6为同步触发位,否则同步触发位不变*/
/*位3~位0为事务响应方式:
0000就绪ACK,1101就绪但不返回ACK,1110正忙NAK,1111错误STALL*/
#defineCMD10_SET_ENDP70x1D/*设置USB端点2/主机端点的发送器*/
/*输入:
工作方式*/
/*位7为1则位6为同步触发位,否则同步触发位不变*/
/*位3~位0为事务响应方式:
0000就绪ACK,1101就绪但无须应答,1110正忙NAK,1111错误STALL*/
#defineCMD00_DIRTY_BUFFER0x25/*主机文件模式:
清除内部的磁盘和文件缓冲区*/
#defineCMD10_WR_USB_DATA30x29/*设备方式(串口不支持):
向USB端点0的发送缓冲区写入数据块*/
/*输入:
长度,数据流*/
#defineCMD10_WR_USB_DATA50x2A/*设备方式(串口不支持):
向USB端点1的发送缓冲区写入数据块*/
/*输入:
长度,数据流*/
/***********************************************************************************************************************/
/*辅助命令(手册二),不太常用或者是为了与CH375和CH372兼容,以下命令总是在操作结束时产生中断通知,并且总是没有输出数据*/
#defineCMD1H_CLR_STALL0x41/*主机方式:
控制传输清除端点错误