CH378手册(一)1U盘和SD卡高速文件管理控制芯片CH378手册版本:4Bhttp://wch.
cn1、概述CH378是文件管理控制芯片,用于单片机系统快速读写U盘或者SD卡中的文件.
CH378支持USB设备方式和USB主机方式,并且内置了USB通讯协议的基本固件,内置了处理Mass-Storage海量存储设备的专用通讯协议的固件,内置了SD卡的通讯接口固件,内置了FAT16和FAT32以及FAT12文件系统的管理固件,支持常用的USB存储设备(包括U盘/USB硬盘/USB闪存盘/USB读卡器)和SD卡(包括标准容量SD卡和高容量HC-SD卡以及协议兼容的MMC卡和TF卡).
CH378支持三种通讯接口:8位并口、SPI接口或者异步串口,单片机/DSP/MCU/MPU等控制器可以通过上述任何一种通讯接口控制CH378芯片,存取U盘或者SD卡中的文件或者与计算机通讯.
下图为CH378的应用框图.
2、特点支持12Mbps全速和480Mbps高速USB通讯,外围元器件只需要晶体和电容.
支持USB-HOST主机接口和USB-DEVICE设备接口,支持动态切换主机方式和设备方式.
支持USB设备的控制传输、批量传输和中断传输.
自动检测USB设备或SD卡的连接和断开,提供设备连接和断开的事件通知.
提供最高50MHz的SPI主机接口,支持SD卡以及与其协议兼容的MMC卡和TF卡等.
内置USB控制传输的协议处理器,简化常用的控制传输.
内置固件处理海量存储设备的专用通讯协议,支持Bulk-Only传输协议和SCSI、UFI、RBC或等效命令集的USB存储设备(包括U盘/USB硬盘/USB闪存盘/USB读卡器).
内置FAT16和FAT32以及FAT12文件系统的管理固件,支持容量高达32GB的U盘和SD卡.
提供文件管理功能:打开、新建或删除文件、枚举和搜索文件、创建子目录、支持长文件名.
提供文件读写功能:以字节为最小单位或者以扇区为单位对多级子目录下的文件进行读写.
提供磁盘管理功能:初始化磁盘、查询物理容量、查询剩余空间、物理扇区读写.
INT#CH378芯片本地端控制器单片机DSPMCUMPU等计算机或USB存储设备例如:U盘USB硬盘USB闪存盘UBS读卡器D0-D7A0RD#WR#PCS#并行总线8位被动并口SPI设备接口异步串口SCSSCKMOSI=>SDIMISORXDRXD<=TXD串口UARTD+D-USB总线USB-DeviceSD卡接口SPIHost高速MCUROMRAMUSB固件文件系统管理固件USB-HostUSB-PhyI/OSDCSSDCKSDDOSDDISPI接口SD卡以及协议兼容卡例如:MMC卡Mini-SD卡TF卡CH378手册(一)2提供芯片自动演示功能,演示文件的创建和读写.
提供高速8位被动并行接口,支持连接到单片机的并行数据总线.
提供最高30MHz速度的SPI设备接口,支持连接到单片机的SPI串行总线.
提供最高10Mbps速度的异步串口,支持连接到单片机的串行口,支持通讯波特率动态调整.
支持低功耗模式.
内置20KRAM,可当文件读写缓冲区使用,也可当普通RAM使用,极大降低了外部系统的资源要求.
提供LQFP64M或LQFP128无铅封装,兼容RoHS.
3、封装CH378手册(一)3芯片型号芯片封装名称描述CH378LLQFP128LQFP封装;128脚;本体14x14mmCH378QLQFP64MLQFP封装;64脚;本体10x10mm4、引脚CH378L引脚号CH378Q引脚号引脚名称类型引脚说明7、21、26、39、56、70、72、83、92、101、1222、12、17、21、29、40、42、45、63VCC33电源3.
3V正电源输入端,外接0.
1uF电源退耦电容1、5、12、13、18、28、30、54、82、1086、19、28、43、54、64VCC18电源1.
8V正电源输入端,外接0.
1uF电源退耦电容2、4、9、16、17、22、27、29、55、64、65、71、1093、9、13、18、20、37、41、44、48GND电源公共接地端3、6、8、10、11、14、15、31、32、33、34、35、36、37、38、40、41、42、43、44、45、46、47、57、66、67、68、69、73、74、75、76、77、78、79、80、81、84、85、86、87、88、89、90、91、1、4、5、7、8、30、38、39、46、47、50、51、52、53、55、56NC-保留引脚,悬空CH378手册(一)493、94、95、96、97、102、103、104、105、110、111、127、1282314RSETU输入外接12K电阻到地端1910XI输入晶体振荡的输入端,需要外接30MHz晶体2011XO输出晶体振荡的反相输出端,需要外接30MHz晶体2415UD-USB信号USB总线的D-数据线2516UD+USB信号USB总线的D+数据线4822ACT#输出状态输出,低电平有效在USB主机方式下是USB设备正在连接状态输出;在SD卡主机方式下是SD卡正在连接状态输出;在内置固件的USB设备方式下是USB设备配置完成状态输出;4923SD_IN输入SD卡是否插入检测引脚,内置上拉电阻5024SD_WP输入SD卡是否写保护检测引脚,内置上拉电阻5125RDY#输出状态输出,低电平有效在USB主机方式下,是USB设备初始化成功可以正常操作状态输出;在SD卡主机方式下,是SD卡初始化成功可以正常操作状态输出;在自动演示方式下,是演示状态输出;5226RST输出电源上电复位和外部复位输出,高电平有效5327SEL输入在芯片复位期间为接口配置输入,内置上拉电阻5831AUTO输入芯片自动演示配置引脚,内置上拉电阻上电正常工作后,芯片检测到该引脚为低电平则开始进行自动演示5932SD_CS输出SD卡SPI接口的片选输出,低电平有效6033SD_CK输出SD卡SPI接口的串行时钟输出6134SD_DO输出SD卡SPI接口的串行数据输出6235SD_DI输入SD卡SPI接口的串行数据输入,内置上拉电阻6336RSTI输入外部复位输入,低电平有效,内置上拉电阻9849INT#输出中断请求输出,低电平有效99-A0输入并口的地址输入,区分命令口与数据口,内置上拉电阻,当A0=1时可以写命令或读状态,当A0=0时可以读写数据100-PCS#输入并口的片选控制输入,低电平有效,内置上拉电阻106-RD#输入并口的读选通输入,低电平有效,内置上拉电阻107-WR#输入并口的写选通输入,低电平有效,内置上拉电阻11257RXD输入异步串口的串行数据输入,内置上拉电阻11358TXD输入输出在芯片复位期间为接口配置输入,内置上拉电阻,在芯片复位完成后为异步串口的串行数据输出11459SCS输入SPI接口的片选输入,低电平有效,内置上拉电阻11560SCK输入SPI接口的串行时钟输入,内置上拉电阻11661SDI输入SPI接口的串行数据输入,内置上拉电阻11762SDO三态输出SPI接口的串行数据输出118~121-D0~D7双向三态并口的8位双向数据总线,内置上拉电阻CH378手册(一)5123~126(注:本表中标注为灰色的引脚,只能承受3.
3V输入电压,未标注的引脚可承受3.
3V和5V输入.
)5、命令本手册中的数据,后缀B为二进制数,后缀H为十六进制数,否则为十进制数.
低字节在前(Little-Endian)的双字数据(共32位)指:先是最低字节(位7~位0),接着是较低字节(位15~位8),然后是较高字节(位23~位16),最后是最高字节(位31~位24).
数据流是指由若干连续字节组成的数据块,数据块的总长度最小为0,最大为20480.
下表输入数据和输出数据的括号中的数字为参数的字节数,没有括号则默认为一个字节.
本手册中所指的单片机基本适用于DSP或者MCU/MPU/SCM等.
本手册中所指的U盘包括U盘、USB外置硬盘、USB闪存盘、USB读卡器等.
本手册中所指的SD卡包括SD卡、MMC卡、HC-SD卡(高容量SD卡)、TF卡等.
本手册主要提供了常用的文件管理控制类命令,用于U盘和SD卡.
关于一些不太常用的辅助命令和执行USB基本事务及控制传输的命令请参考手册(二)CH378DS2.
PDF.
CH378芯片包含的主要常用命令码如下表所示.
代码命令名称CMD_输入数据输出数据命令用途01HGET_IC_VER版本号获取芯片及固件版本02HSET_BAUDRATE波特率系数(3)(等1mS)操作状态设置串口通讯波特率03HENTER_SLEEP睡眠模式(1)进入低功耗睡眠挂起状态05HRESET_ALL(等50mS)执行硬件复位06HCHECK_EXIST任意数据按位取反测试通讯接口和工作状态0BHSET_SDO_INT数据16H设置SPI的SDO引脚的中断方式中断方式0CHGET_FILE_SIZE数据68H文件长度(4)获取当前文件长度0DHSET_FILE_SIZE变量地址0x68临时设置当前文件长度文件长度(4)15HSET_USB_MODE模式代码(等35mS)操作状态设置USB工作模式22HGET_STATUS中断状态获取中断状态并取消中断请求26HRD_HOST_OFS_DATA偏移地址(2)数据流(N)读取内部缓冲区指定偏移地址数据块读取长度(2)27HRD_HOST_CUR_DATA读取长度(2)数据流(N)读取内部缓冲区当前偏移地址数据块28HRD_HOST_REQ_DATA数据长度(2)读取内部缓冲区当前返回的指定长度数据块数据流(N)2DHWR_HOST_OFS_DATA偏移地址(2)向内部缓冲区指定偏移地址写入数据块输入长度(2)数据流(N)2EHWR_HOST_CUR_DATA输入长度(2)向内部缓冲区当前偏移地址写入数据块数据流(N)2FHSET_FILE_NAME字符串(N)设置将要操作的文件的文件名30HDISK_CONNECT产生中断检查磁盘是否连接31HDISK_MOUNT产生中断初始化磁盘并测试磁盘是否就绪32HFILE_OPEN产生中断打开文件或目录,枚举文件和目录33HFILE_ENUM_GO产生中断继续枚举文件和目录CH378手册(一)634HFILE_CREATE产生中断新建文件35HFILE_ERASE产生中断删除文件36HFILE_CLOSE是否允许更新产生中断关闭当前已经打开的文件或目录37HDIR_INFO_READ目录索引号产生中断读取文件的目录信息38HDIR_INFO_SAVE目录索引号产生中断保存文件的目录信息39HBYTE_LOCATE偏移字节数(4)产生中断以字节为单位移动当前文件指针3AHBYTE_READ请求字节数(2)产生中断以字节为单位从当前位置读取数据块3CHBYTE_WRITE请求字节数(2)产生中断以字节为单位向当前位置写入数据块3EHDISK_CAPACITY产生中断查询磁盘物理容量3FHDISK_QUERY产生中断查询磁盘空间信息40HDIR_CREATE产生中断新建目录并打开或打开已存在的目录4AHSEC_LOCATE偏移扇区数(4)产生中断以扇区为单位移动当前文件指针4BHSEC_READ请求扇区数产生中断以扇区为单位从当前位置读取数据块4CHSEC_WRITE请求扇区数产生中断以扇区为单位在当前位置写入数据块50HDISK_BOC_CMD产生中断对USB存储器执行BO传输协议的命令54HDISK_READLBA扇区地址(4)产生中断从USB存储器或SD卡读物理扇区扇区数56HDISK_WRITELBA扇区地址(4)产生中断向USB存储器或SD卡写物理扇区扇区数55HFILE_QUERY产生中断查询当前打开的文件的信息57HFILE_MODIFY产生中断修改当前打开的文件的信息如果命令的输出数据是操作状态,参考下表.
状态代码状态名称状态说明51HCMD_RET_SUCCESS操作成功5FHCMD_RET_ABORT操作失败表中标为"产生中断"的命令通常需要时间去执行操作.
CH378在命令执行完成后向单片机请求中断,单片机可以读取中断状态作为该命令的操作状态.
如果中断状态是ERR_SUCCESS,那么说明操作成功,有些命令具有返回数据(参考CH378INC.
H文件中的CH378_CMD_DATA结构),可以通过CMD_RD_HOST_REQ_DATA命令读取返回数据.
5.
1.
CMD_GET_IC_VER该命令用于获取芯片及固件版本.
返回的一个字节数据是版本号,其位7为0,位6为1,位5~位0为版本号.
如果返回值为41H,去掉位7和位6,版本号为01H.
5.
2.
CMD_SET_BAUDRATE该命令用于设置CH378的串口通讯波特率.
在CH378工作于串口通讯方式时,复位后默认的通讯波特率由SDO,SDI和SCK三个引脚的电平组合设定(参考本手册第6.
4节),这些引脚都悬空时默认是9600bps.
如果单片机支持较高的通讯速度,可以通过该命令动态调整串口通讯波特率.
该命令需要输入三个字节数据,分别是波特率系数0、波特率系数1、波特率系数2,下表是系数与波特率的对应关系.
波特率系数2波特率系数1波特率系数0串口通讯波特率(bps)误差00H12HC0H48000%00H25H80H96000%CH378手册(一)700H4BH00H192000%00H96H00H384000%00HE1H00H576000%01H2CH00H768000.
6%01HC2H00H1152000.
9%07H08H00H4608000%0EH10H00H9216007.
1%01H86HA0H1000000%0FH42H40H10000007.
6%2DHC6HC0H30000000%计算公式:BaudRate=(波特率系数2<<16)+(波特率系数1<<8)+波特率系数0通常情况下,设置串口通讯波特率在1mS时间之内完成,完成后CH378以新设定的通讯波特率输出操作状态,所以单片机应该在发出命令后及时调整自身的通讯波特率.
5.
3.
CMD_ENTER_SLEEP该命令使CH378芯片进入低功耗睡眠挂起状态,从而节约电能.
该命令需要输入1个字节睡眠模式参数,如果输入数据是0x11,则使能芯片进入半睡眠状态,唤醒之后USB功能可以继续使用;如果输入数据是0x22,使能芯片进入深度睡眠状态.
半睡眠模式,CH378部分时钟仍然处于工作状态,如果操作SD卡,大约可以降低30mA电流,如果操作USB存储设备,大约可以降低20mA电流.
深度睡眠模式,大约可以降低80mA电流,如果操作的SD卡,唤醒后可以继续进行后续操作;如果操作的是USB设备,则唤醒之后需要全部重新初始化(包括设置工作模式、检测USB设备连接、初始化USB设备等).
以下两种情况可以使能CH378唤醒,退出低功耗状态:(1)、单片机向CH378写入新命令(没有输入数据的命令,例如CMD_GET_IC_VER或CMD_GET_STATUS命令等).
(2)对于SPI串行接口或者8位并行接口,CS片选有效也将导致CH378退出低功耗状态,所以单片机在发出CMD_ENTER_SLEEP命令后,应该立即使CS片选无效.
通常情况下,CH378芯片从低功耗状态退出并恢复到正常工作状态需要几毫秒的唤醒时间,当完全恢复到正常工作状态后,CH378将产生USB_INT_WAKE_UP事件中断.
5.
4.
CMD_RESET_ALL该命令使CH378执行硬件复位.
通常情况下,硬件复位在35mS时间之内完成.
5.
5.
CMD_CHECK_EXIST该命令用于测试通讯接口和工作状态,以检查CH378是否正常工作.
该命令需要输入1个字节数据,可以是任意数据,如果CH378正常工作,那么CH378的输出数据是输入数据的按位取反.
例如,输入数据是57H,则输出数据是A8H.
另外,对于并口通讯方式的CH378,在其复位后未收到任何命令之前,从其并口通常可以读出数据00H.
5.
6.
CMD_SET_SDO_INT该命令用于设置SPI接口的SDO引脚的中断方式.
该命令首先需要输入1个字节数据16H,然后需要输入1个字节新的中断方式.
中断方式有两种:00H禁止SDO引脚用于中断输出,其在SCS片选无效时三态输出禁止,便于与其它设备共享单片机的SPI总线;01H设置SDO引脚一直处于输出状态,CH378手册(一)8在SCS片选无效时兼做中断请求输出,等效于INT#引脚,供单片机查询中断请求状态.
5.
7.
CMD_GET_FILE_SIZE该命令用于获取当前文件的长度,即字节数.
该命令需要输入1个字节数据68H,输出为当前正在打开的文件的长度,该长度是以低字节在前的4个字节表示的双字数据(32位).
5.
8.
CMD_SET_FILE_SIZE该命令用于设置当前文件的长度,即字节数.
该命令首先需要输入1个字节的数据68H,然后需要输入新的文件长度,该长度是以低字节在前的4个字节表示的双字数据(32位).
该命令只修改CH378内存中的文件长度变量,以便进行某些操作,比如以扇区方式读取文件最后不足一个扇区的数据,并没有实际修改文件长度.
如果需要实际修改文件长度,还需要执行CMD_FILE_CLOSE命令.
5.
9.
CMD_SET_USB_MODE该命令用于设置USB工作模式.
该命令需要输入1个数据,该数据是模式代码:模式代码为00H时切换到未启用的USB设备方式;模式代码为01H时切换到已启用的USB设备方式,外部固件模式;模式代码为02H时切换到已启用的USB设备方式,内部固件模式;模式代码为03H时切换到未启用的SD卡主机模式,用于管理和存取SD卡中的文件;模式代码为04H时切换到已启用的SD卡主机模式,用于管理和存取SD卡中的文件;模式代码为05H时切换到未启用的主机方式;模式代码为06H时切换到未启用的USB主机方式,用于管理和存取USB存储设备中的文件;模式代码为07H时切换到已启用的USB主机方式,用于管理和存取USB存储设备中的文件;模式代码为08H时切换到USB读卡器模式,用于计算机USB口直接管理SD卡中的文件;其中,未启用是指不自动检测USB存储设备或SD卡是否连接,所以需要外部单片机检测;启用是指自动检测USB存储设备或SD卡是否连接,当USB存储设备或SD卡连接或者断开时都会产生中断通知外部单片机.
一般操作SD卡选择模式代码03H,操作USB存储设备选择模式代码06H.
另外,异步串口方式下,不支持模式4.
CH378工作在模式8(版本号大于等于0x43时支持该模式)时,仅作为SD卡读卡器使用,外围MCU不能操作SD卡和USB存储设备,如果需要操作,需要重新切换回原工作模式.
通常情况下,设置SD卡主机模式在1mS之内完成,设置USB工作模式在35mS时间之内完成,完成后输出操作状态.
5.
10.
CMD_GET_STATUS该命令用于获取CH378的中断状态并通知CH378取消中断请求.
当CH378向单片机请求中断后,单片机通过该命令获取中断状态,分析中断原因并处理.
中断状态字节中断状态的分类10H~1FHSD卡或者USB主机方式的操作中断状态20H~3FHUSB主机方式的通讯失败状态,用于分析操作失败原因40H~4FHSD卡或者USB主机文件模式下的文件系统警告代码80H~BFHSD卡或者USB主机文件模式下的文件系统错误代码下面是SD卡或者USB主机方式的操作中断状态.
状态字节状态名称中断状态分析说明00HERR_SUCCESS操作成功CH378手册(一)903HERR_PARAMETER_ERROR参数错误14HUSB_INT_SUCCESSSD卡或者USB事务或者传输操作成功15HUSB_INT_CONNECT检测到USB设备连接事件16HUSB_INT_DISCONNECT检测到USB设备断开事件17HUSB_INT_BUF_OVER传输的数据有误或者数据太多缓冲区溢出18HUSB_INT_USB_READYUSB设备已经被初始化(已经分配USB地址)1DHUSB_INT_DISK_READUSB存储器请求数据读出1FHUSB_INT_DISK_ERR存储设备操作失败下面是SD卡或者USB主机文件模式下的文件系统警告代码和错误代码表.
状态字节状态名称中断状态分析说明41HERR_OPEN_DIR指定路径的目录被打开42HERR_MISS_FILE指定路径的文件没有找到,可能是文件名称错误43HERR_FOUND_NAME搜索到相匹配的文件名,或者是要求打开目录而实际结果却打开了文件44HERR_NO_NAME此短文件名没有长文件名或错误的长文件45HERR_BUF_OVER长文件缓冲区溢出46HERR_LONG_NAME错误的长文件名82HERR_DISK_DISCON磁盘尚未连接,可能磁盘已经断开84HERR_LARGE_SECTOR磁盘的扇区太大,只支持每扇区512字节92HERR_TYPE_ERROR磁盘分区类型不支持,需由磁盘管理工具重新分区A1HERR_BPB_ERROR磁盘尚未格式化,或者参数错误,需要由WINDOWS采用默认参数重新格式化B1HERR_DISK_FULL磁盘文件太满,剩余空间太少或者已经没有B2HERR_FDT_OVER目录内文件太多,没有空闲目录项,需磁盘整理,FAT12/FAT16根目录下的文件数应该少于512个B3HERR_MISS_DIR指定路径的某个子目录(文件夹)没有找到,可能是目录名称错误B4HERR_FILE_CLOSE文件已经关闭,如果需要使用,应该重新打开文件更多中断状态可以查看CH378芯片对应头文件CH378INC.
H.
5.
11.
CMD_RD_HOST_OFS_DATA该命令用于读取内部指定缓冲区指定偏移地址的数据块.
首先写入2个字节的偏移地址(内部缓冲区起始地址加上该偏移地址得到该命令数据块的读取的起始地址),接着写入2个字节要读取的数据块长度,也就是后续数据流的字节数,最后按照长度逐个读取后续数据流.
注意:数据块长度的有效范围为0至20480,如果长度不为0,则单片机必须将后续数据从CH378逐个读取完.
5.
12.
CMD_RD_HOST_CUR_DATA该命令用于读取内部指定缓冲区当前偏移地址的数据块.
首先写入2个字节要读取的数据块长度,也就是后续数据流的字节数,然后按照长度逐个读取后续数据流.
注意:数据块长度的有效范围为0至20480,如果长度不为0,则单片机必须将后续数据从CH378逐个读取完.
该命令与CMD_RD_HOST_OFS_DATA命令的区别在于,前者读取的是内部缓冲区指定偏移地址的数据块,需要输入偏移地址;后者读取的是内部缓冲区当前偏移地址的数据块,不需要输入偏移地址.
分多次小批量读取数据时,两个命令可以配合使用.
CH378手册(一)105.
13.
CMD_RD_HOST_REQ_DATA该命令用于读取内部指定缓冲区当前偏移地址请求读取的数据块.
首先读取的是2个字节的数据块长度,也就是后续数据流的字节数,然后按照长度逐个读取后续数据流.
注意:数据块长度的有效范围为0至20480,如果长度不为0,则单片机必须将后续数据从CH378逐个读取完.
5.
14.
CMD_WR_HOST_OFS_DATA该命令用于向内部指定缓冲区指定偏移地址写入数据块.
首先写入2个字节的偏移地址(内部缓冲区起始地址加上该偏移地址得到该命令数据块的写入的起始地址),接着写入2个字节要输入的数据块长度,也就是后续数据流的字节数,最后按照长度逐个输入后续数据流.
注意:数据块长度的有效范围为0至20480,如果长度不为0,则单片机必须将后续数据逐个写入CH378.
5.
15.
CMD_WR_HOST_CUR_DATA该命令用于向内部指定缓冲区当前偏移地址写入数据块.
首先写入2个字节要输入的数据块长度,也就是后续数据流的字节数,然后按照长度逐个输入后续数据流.
注意:数据块长度的有效范围为0至20480,如果长度不为0,则单片机必须将后续数据逐个写入CH378.
5.
16.
CMD_SET_FILE_NAME该命令用于设置将要操作的文件或者目录(文件夹)的文件名或者目录名(路径名).
输入数据是以0结束的字符串,并且含结束符0在内的长度不得超过128个字符.
对于多级子目录下的文件,由于路径名太长,可以分多次逐级打开,首先打开子目录,直到最后再打开文件.
其中,首先打开必须是从根目录开始,所以路径名首字符必须是斜杠,以后接着前级再打开时的首字符必须不是斜杠.
当文件操作出错时,必须回到根目录下重新逐级打开.
具体操作见CMD_FILE_OPEN命令.
文件名(或者目录名、路径名)的格式与DOS系统的短文件名格式相同,但是不需要盘符和冒号,作为根目录符的左斜杠"/"与右斜杠""等效,建议使用左斜杠"/".
所有字符必须是大写字母、数字或者中文汉字以及某些特殊字符,文件名长度不超过11个字符,其中主文件名不超过8个字符,扩展名不超过3个字符,如果有扩展名,那么用小数点与主文件名隔开.
参考EXAM11例子可以支持长文件名.
字符串中没有字符(但有结束符0,下同)时,说明是初始化文件系统,不打开任何文件;字符串中只有一个"/"或者""(左斜杠或者右斜杠)时,说明是打开根目录;字符串首字符为"/"或者""并且后续字符是文件名时,说明是根目录下的文件;字符串直接是文件名时,说明是当前目录下的文件.
例如,对于根目录下的FILENAME.
EXT文件,可以用字符串"/FILENAME.
EXT "设置,整个字符串含结束符共14个字符,其中" "为C语言表示的0,作为字符串结束符,字符串中的"/"表示根目录,在C语言中也可以用"\"(实际是一个字符)表示根目录.
5.
17.
CMD_DISK_CONNECT该命令用于检查磁盘或者SD卡是否连接.
CH378在命令执行完成后向单片机请求中断.
如果操作状态是ERR_SUCCESS,那么说明有磁盘或者USB设备或者SD卡连接.
5.
18.
CMD_DISK_MOUNTCH378手册(一)11该命令用于初始化磁盘并测试磁盘是否就绪.
新连接的USB存储设备或者SD卡必须通过该命令进行初始化后,然后才能进行文件操作,有些USB存储设备可能需要多次初始化才能返回操作成功状态ERR_SUCCESS.
另外,在文件操作的过程中,该命令也可以随时用于测试磁盘是否就绪.
首次执行CMD_DISK_MOUNT命令如果中断状态是ERR_SUCCESS,那么可以由CMD_RD_HOST_REQ_DATA命令获取数据,数据通常是36个字节,包括USB存储设备的特性以及厂商和产品的识别信息等.
5.
19.
CMD_FILE_OPEN该命令用于打开文件或者目录(文件夹),枚举文件和目录(文件夹).
打开文件(或者目录)是读写文件(或者目录)之前的必要操作.
在打开文件命令之前,应该先通过CMD_SET_FILE_NAME命令设置将要打开或者枚举的文件的文件名.
如果完整的路径名长度在限制的长度范围内,可以一次性打开.
如果是多级子目录下的文件,路径名较长,那么可以从根目录开始分多次逐级打开.
首次打开必须是从根目录开始,所以路径名首字符必须是斜杠"/"或者"",以后接着前级再打开时的首字符必须不是"/"或者"".
由于路径名有长度限制,所以子目录的深度不宜超过5级.
如果成功打开目录,那么中断状态返回ERR_OPEN_DIR,此时文件长度无效,为0FFFFFFFFH.
如果成功打开文件,那么中断状态返回ERR_SUCCESS,此时文件长度有效.
如果没有找到指定的文件或者目录(文件夹),那么中断状态返回ERR_MISS_FILE.
例如:要打开根目录下的文件TODAY1.
TXT,步骤如下:1用字符串"/TODAY1.
TXT "通过CMD_SET_FILE_NAME命令设置文件名;2用CMD_FILE_OPEN命令打开文件.
要打开三级子目录下的文件YEAR2004MONTH05.
NEWDATE18ADC.
TXT,步骤如下:1用字符串"/YEAR2004/MONTH05.
NEW/DATE18/ADC.
TXT "通过CMD_SET_FILE_NAME命令设置文件名;2用CMD_FILE_OPEN命令直接打开文件.
要打开六级子目录下的文件MODULEAD_DATAYEAR2004MONTH05.
NEWDATE18HOUR08ADC.
TXT,步骤如下:1用字符串"/MODULE/AD_DATA/YEAR2004/MONTH05.
NEW "通过CMD_SET_FILE_NAME命令设置文件名;2用CMD_FILE_OPEN命令一次性打开前面四级目录,打开目录后,如果执行CMD_GET_FILE_SIZE命令将返回无效的文件长度0FFFFFFFFH;3用字符串"DATE18/HOUR08/ADC.
TXT "通过CMD_SET_FILE_NAME命令设置文件名;4用CMD_FILE_OPEN命令打开最终的文件,打开文件后,如果执行CMD_GET_FILE_SIZE命令将返回实际的文件长度.
要初始化文件系统,而不打开任何文件,步骤如下:1用字符串" "通过CMD_SET_FILE_NAME命令设置文件名;2执行CMD_FILE_OPEN命令,那么将初始化文件系统(如果已经初始化那么直接返回).
要打开根目录(例如,在处理长文件名时),步骤如下:1用字符串"/ "通过CMD_SET_FILE_NAME命令设置文件名;2执行CMD_FILE_OPEN命令,那么将打开根目录(使用后必须用CMD_FILE_CLOSE关闭).
5.
20.
CMD_FILE_ENUM_GO该命令用于继续枚举文件和目录(文件夹).
如果需要搜索和查询文件,步骤如下:1用通配符*代替需要查询的文件名中的全部或者部分字符,通配符*后面不能再有字符,通过CMD_SET_FILE_NAME命令将含有通配符*的字符串设置为文件名,例如,字符串"/* "说明要枚举根目录下的所有文件或者目录,字符串"USB* "说明要枚举当前目录下所有名称是CH378手册(一)12以"USB"三个字符开头的文件或者目录,符合要求的文件名(或者目录名)包括"USB.
TXT"、"USB1234"、"USB"、"USBC.
H"等,但不包括"XUSB"、"U.
SB"、"U2SB"、"MY.
USB"等;2通过CMD_FILE_OPEN命令开始枚举文件和目录;3CH378比较每一个文件名,每当找到一个符合要求的文件,将对单片机产出一次中断,中断状态为USB_INT_DISK_READ,请求单片机从CH378读取数据;4单片机通过CMD_RD_HOST_REQ_DATA命令读出数据,立即分析处理或者先保存,该数据是枚举到的当前文件的完整路径名;5单片机发出CMD_FILE_ENUM_GO命令,通知CH378继续枚举;6CH378继续比较文件名,如果再次找到符合要求的文件,那么转步骤③,否则继续下一步;7CH378对单片机产出一次中断,中断状态为ERR_MISS_FILE,说明没有找到更多的符合要求的文件,整个枚举操作结束.
在上述步骤④中,单片机可以对获得的路径名中的文件名进行分析,查看是否是需要寻找的文件.
例如,对文件扩展名DIR_Name[8]、[9]、[10]三个单元的字符与"XLS"进行比较,以过滤特定的EXCEL类型的文件.
5.
21.
CMD_FILE_CREATE该命令用于新建文件,如果文件已经存在那么先删除再新建.
在新建文件命令之前,应该先通过CMD_SET_FILE_NAME命令设置将要新建的文件的文件名,格式与CMD_FILE_OPEN命令相同,但不支持通配符.
如果存在同名文件,那么该同名文件将首先被删除,然后再新建文件.
如果不希望已有文件被删除,那么应该事先通过CMD_FILE_OPEN命令确认文件不存在后再新建.
新建文件的文件日期和时间默认为2004年1月1日0时0分0秒,文件默认长度为1,如果需要修改这些信息,那么可以通过CMD_DIR_INFO_READ和CMD_DIR_INFO_SAVE命令实现.
5.
22.
CMD_FILE_ERASE该命令用于删除文件,如果文件已经被打开那么将被直接删除,否则,对于文件会自行先打开再删除,而对于子目录则必须先被打开.
对于普通文件,删除步骤如下:1确认之前的文件或者目录已经关闭,否则将被直接删除,而不受步骤②的影响;2通过CMD_SET_FILE_NAME命令设置将要被删除的文件名,不支持通配符;3通过CMD_FILE_ERASE命令自行打开文件并删除.
对于子目录(或者文件)必须参照以下步骤删除:1对于子目录,必须事先删除子目录中的所有文件以及下级子目录;2通过CMD_SET_FILE_NAME命令设置将要被删除的子目录名(或者文件名),不支持通配符;3通过CMD_FILE_OPEN命令打开子目录名(或者文件名);4通过CMD_FILE_ERASE命令删除步骤②中已经打开的子目录(或者文件).
5.
23.
CMD_FILE_CLOSE该命令用于关闭当前已经打开的文件或者目录(文件夹).
该命令需要1个输入数据,表明是否允许更新文件长度,为0则禁止更新文件长度,为1则允许自动更新文件长度.
打开文件或者目录(文件夹)读写完毕后,应该关闭文件.
对于根目录的操作,关闭文件是必须的.
对于普通文件的读操作,关闭文件是可选操作.
对于普通文件的写操作,关闭文件的同时,可以选择是否由CH378自动更新文件长度.
如果通过CMD_SEC_LOCATE、CMD_SEC_READ或者CMD_SEC_WRITE命令对文件进行以扇区为单位的读写,那么CH378自动更新的文件长度是以扇区为单位计算的,文件长度通常是扇区大小512的倍数.
如果希望文件长度不是扇区大小的倍数,那么单片机可以在关闭文件前通过CMD_SET_FILE_SIZE命令修改文件长度变量,或者通过CMD_DIR_INFO_READ和CMD_DIR_INFO_SAVE命令直接修改文件信息.
如果通过CMD_BYTE_LOCATE、CMD_BYTE_READ或者CMD_BYTE_WRITE命令对文件进行以字节为单位CH378手册(一)13的读写,那么CH378自动更新的文件长度是以字节为单位计算的,所以可以获得适当的长度.
5.
24.
CMD_DIR_INFO_READ该命令用于读取文件的目录信息,即FAT_DIR_INFO结构.
该命令需要输入1个字节数据,指定需要读取的目录信息结构在扇区内的索引号,索引号范围为00H~0FH,索引号0FFH则对应当前已经打开的文件.
该命令只是将目录信息读取到CH378内存缓冲区,之后单片机可以通过CMD_RD_HOST_REQ_DATA命令读出数据.
每次打开一个文件后,CH378从USB存储设备或者SD卡中取出相邻的16个文件目录信息存放于内存,单片机可以指定索引号0~15分别对应于各个FAT_DIR_INFO结构,也可以指定索引号0FFH以获取当前正在打开的文件的FAT_DIR_INFO结构,以分析文件日期、时间、长度、属性等信息.
5.
25.
CMD_DIR_INFO_SAVE该命令用于保存文件的目录信息.
该命令需要输入1个字节数据,指定需要写入的目录信息结构在扇区内的索引号,索引号范围为00H~0FH,索引号0FFH则对应当前已经打开的文件.
执行该命令可以将内存中的16个文件目录信息刷新保存到USB存储设备或者SD卡中.
修改文件目录信息的步骤如下:1文件已经打开那么转②,否则通过CMD_SET_FILE_NAME和CMD_FILE_OPEN命令打开文件;2通过CMD_DIR_INFO_READ命令读取当前文件或相邻文件的FAT_DIR_INFO结构到内存缓冲区;3通过CMD_RD_HOST_REQ_DATA命令从内存缓冲区读出数据,如果不需要修改那么步骤结束;4如果需要修改,那么再次通过CMD_DIR_INFO_READ命令读取FAT_DIR_INFO结构到缓冲区;5通过CMD_WR_HOST_OFS_DATA命令向内部缓冲区写入32个字节的目录信息;6通过CMD_DIR_INFO_SAVE命令向USB存储设备或者SD卡中保存修改后的文件目录信息.
5.
26.
CMD_BYTE_LOCATE该命令用于以字节为单位移动当前文件指针.
该命令需要输入偏移字节数,该偏移字节数是以低字节在前的4个字节表示的双字数据(32位).
如果命令执行完成后中断状态是ERR_SUCCESS,那么可以由CMD_RD_HOST_REQ_DATA命令获取当前文件指针对应的绝对线性扇区号LBA(以低字节在前的4个字节表示的32位双字数据),如果已到文件末尾,那么该值为0FFFFFFFFH.
文件被新建或者被重新打开时,当前文件指针都为0,移动当前文件指针,通常用于从指定位置开始读写数据.
例如,单片机希望跳过文件的前158字节再读写数据,那么可以用CMD_BYTE_LOCATE命令带上参数158作为偏移字节数,命令执行成功后,紧接在后面的读写操作将从第158字节开始.
对于写操作,如果单片机准备在原文件的尾部继续添加数据,而不希望影响前面的原有数据,那么可以指定很大的字节偏移,例如0FFFFFFFFH,将文件指针移动原文件的末尾,以便追加数据.
5.
27.
CMD_BYTE_READCMD_BYTE_READ命令用于以字节为单位从当前位置读取数据块.
读取成功后,CH378自动同步移动文件指针,以便下次读写操作能够接着本次读取数据的结束位置开始.
该命令需要输入请求读取的字节数,该请求字节数是以低字节在前(Little-Endian)的2个字节表示的字数据(16位),最大为20480字节.
该命令执行完毕后会以中断通知外部单片机,此时读取到的文件数据保存在CH378内部缓冲区中,需要通过CMD_RD_HOST_OFS_DATA或CMD_RD_HOST_CUR_DATA命令进行实际读取.
完整的字节读操作步骤如下:1打开文件,并且确认处于合适的位置(文件指针);2单片机发出CMD_BYTE_READ命令并输入请求读取的字节数,开始读操作;3CH378计算从当前文件指针开始到文件结束位置之间的文件剩余长度,并根据请求字节数、文件剩余长度、内部缓冲区状态计算出本次允许读取的字节数,读取文件数据到内部缓冲区中,同时移动当前文件指针,然后中断通知单片机,中断状态为ERR_SUCCESS;CH378手册(一)144单片机通过发送CMD_GET_REAL_LEN命令,快速得到本次允许读取的实际长度;5单片机通过发送CMD_RD_HOST_OFS_DATA或CMD_RD_HOST_CUR_DATA命令从CH378内部缓冲区读取实际数据.
如果单片机RAM足够,可以一次性读取完整的全部数据.
如果单片机RAM相对较少,也可以分多次小批量读取数据,边读取边处理.
6文件结束或者请求读取的字节数全部读取完毕,整个读操作结束.
如果请求读取的长度大于CMD_GET_REAL_LEN命令返回的允许读取的实际长度,那么说明文件指针已经处于文件末尾.
5.
28.
CMD_BYTE_WRITECMD_BYTE_WRITE命令用于以字节为单位向当前位置写入数据块.
写入成功后,CH378自动同步移动文件指针,以便下次读写操作能够接着本次写入数据的结束位置开始.
该命令需要输入请求写入的字节数,该请求字节数是以低字节在前(Little-Endian)的2个字节表示的字数据(16位),最大为20480字节.
当请求字节数为0时,仅用于刷新文件长度.
该命令执行前需要先通过CMD_WR_HOST_OFS_DATA或CMD_WR_HOST_CUR_DATA命令将要写入的数据预先输入到CH378内部缓冲区中.
完整的字节写操作步骤如下:1打开或者新建文件,并且确认处于合适的位置(文件指针);2单片机通过CMD_WR_HOST_OFS_DATA或CMD_WR_HOST_CUR_DATA命令将要写入的数据预先输入到CH378内部缓冲区中;3单片机发出CMD_BYTE_WRITE命令并输入请求写入的字节数,开始写操作;4CH378检查请求的字节数,如果为0,那么执行刷新文件长度操作,将内存中文件长度变量保存到USB存储设备或者SD卡中,完成后输出中断状态为ERR_SUCCESS,结束本次写操作;如果不为0,则根据请求字节数、内部缓冲区状态计算出本次允许写入的字节数,将内部缓冲区中的数据写入文件,同时移动当前文件指针,然后中断通知单片机,中断状态为ERR_SUCCESS,结束本次写操作.
如果直接向文件末尾追加数据,或者在写操作过程中,自动移动的文件指针超出原文件结束位置,那么CH378将自动更新内存中的文件长度变量.
在整个写操作完成后,如果短时间内不打算进行另一次写操作,那么单片机应该通知CH378刷新内存中的文件长度变量到USB存储设备或者SD卡中,方法有两种:(1)、类似上述步骤②和③的写0长度数据;(2)、执行CMD_FILE_CLOSE命令并且允许更新长度.
5.
29.
CMD_DISK_CAPACITY该命令用于查询磁盘物理容量,支持USB存储设备或者SD卡.
如果命令执行完成后中断状态是ERR_SUCCESS,那么可以由CMD_RD_HOST_REQ_DATA命令获取磁盘物理容量,即总扇区数,该容量是以低字节在前的4个字节表示的双字数据(32位),如果再乘以扇区大小,那么可以得到以字节为单位的物理总容量.
5.
30.
CMD_DISK_QUERY该命令用于查询磁盘空间信息,包括总空间、剩余空间和文件系统类型.
如果命令执行完成后中断状态是ERR_SUCCESS,那么可以由CMD_RD_HOST_REQ_DATA命令依次获取逻辑盘的总扇区数(以低字节在前的4个字节表示的32位双字数据),当前逻辑盘的剩余扇区数(以低字节在前的4个字节表示的32位双字数据),逻辑盘的FAT文件系统类型(参考CH378INC.
H文件中的CH378_CMD_DATA结构).
5.
31.
CMD_DIR_CREATE该命令用于新建子目录(文件夹)并打开,如果子目录已经存在那么直接打开.
操作方法与CH378手册(一)15CMD_FILE_CREATE命令相同.
在新建子目录命令之前,应该先通过CMD_SET_FILE_NAME命令设置将要新建的子目录的目录名,格式与CMD_FILE_CREATE命令相同.
如果存在同名的普通文件,那么中断状态为ERR_FOUND_NAME;如果子目录新建成功或者打开事先已经存在的子目录,那么中断状态为ERR_SUCCESS.
新建子目录的文件日期和时间等信息与CMD_FILE_CREATE命令新建文件时相同,修改方法也相同,只是文件属性为ATTR_DIRECTORY,并且文件长度始终为0(根据FAT规范,子目录的文件长度必须为0).
5.
32.
CMD_SEC_LOCATE该命令用于以扇区为单位移动当前文件指针,支持USB存储设备或者SD卡.
该命令需要输入偏移扇区数,该偏移扇区数是以低字节在前的4个字节表示的双字数据(32位).
如果命令执行完成后中断状态是ERR_SUCCESS,那么可以由CMD_RD_HOST_REQ_DATA命令获取当前文件指针对应的绝对线性扇区号LBA(以低字节在前的4个字节表示的32位双字数据),如果已到文件末尾,那么该值为0FFFFFFFFH.
文件被新建或者被重新打开时,当前文件指针都为0,移动当前文件指针,通常用于从指定位置开始读写数据.
例如,单片机希望跳过文件的前18个扇区再读写数据,那么可以用CMD_SEC_LOCATE命令带上参数18作为偏移扇区数,命令执行成功后,紧接在后面的读写操作将从第18扇区开始.
对于写操作,如果单片机准备在原文件的尾部继续添加数据,而不希望影响前面的原有数据,那么可以指定很大的字节偏移,例如0FFFFFFFFH,将文件指针移动原文件的末尾,以便追加数据.
5.
33.
CMD_SEC_READ该命令用于获取以扇区为单位从当前位置读取数据块的参数信息,支持USB存储设备或者SD卡.
命令成功执行后,CH378自动同步移动文件指针,以便下次读写操作能够接着本次读取数据的结束位置开始.
该命令需要输入1个数据,指定请求读取的扇区数,有效值为1至40.
如果命令执行完成后中断状态是ERR_SUCCESS,那么可以由CMD_GET_REAL_LEN命令,快速得到本次允许读取的实际扇区数(以低字节在前的4个字节表示的32位双字数据).
完整的扇区读操作步骤如下:1打开文件,并且确认处于合适的位置(文件指针);2单片机发出CMD_SEC_READ命令并输入请求读取的扇区数,最大扇区数为40;3CH378计算从当前文件指针开始到文件结束位置之间的文件剩余长度,并根据请求扇区数、文件剩余长度、内部缓冲区状态计算出本次允许读取的扇区数,并将文件数据读取到CH378内部缓冲区中,同时移动当前文件指针,然后中断通知单片机,中断状态为ERR_SUCCESS;4单片机通过发送CMD_GET_REAL_LEN命令,快速得到本次允许读取的实际扇区数;5单片机通过发送CMD_RD_HOST_OFS_DATA或CMD_RD_HOST_CUR_DATA命令从CH378内部缓冲区读取实际数据.
6允许读取的扇区数全部读取完毕,整个读操作结束.
如果请求读取的扇区数大于CMD_GET_REAL_LEN命令返回的允许读取的实际扇区数,那么说明文件指针已经处于文件末尾.
如果文件长度不是扇区的倍数,那么文件尾部不足一个扇区的零碎数据部分将被忽略,如果必须读出文件尾部不足一个扇区的零碎数据,那么可以通过CMD_SET_FILE_SIZE命令临时最大文件大小VAR32_FILE_SIZE,最后一个扇区(实际有效数据不足一个扇区)读取完毕后,再恢复原文件大小VAR32_FILE_SIZE.
5.
34.
CMD_SEC_WRITE该命令用于获取以扇区为单位向当前位置写入数据块的参数信息,支持USB存储设备或者SD卡.
命令成功执行后,CH378自动同步移动文件指针,以便下次读写操作能够接着本次写入数据的结束位置开始.
该命令需要输入1个数据,指定请求写入的扇区数,有效值为0至40,请求扇区数为0时,仅用于刷新文件长度.
该命令执行前需要先通过CMD_WR_HOST_OFS_DATA或CMD_WR_HOST_CUR_DATA命令将要写入的数据CH378手册(一)16预先输入到CH378内部缓冲区中.
完整的扇区写操作步骤如下:1打开或者新建文件,并且确认处于合适的位置(文件指针);2单片机通过CMD_WR_HOST_OFS_DATA或CMD_WR_HOST_CUR_DATA命令将要写入的数据预先输入到CH378内部缓冲区中;3单片机发出CMD_SEC_WRITE命令并输入请求写入的扇区数,最大扇区数为40;4CH378检查请求的扇区数,如果为0,那么执行刷新文件长度操作,将内存中文件长度变量保存到USB存储设备或者SD卡中,完成后输出中断状态为ERR_SUCCESS,结束本次写操作;如果不为0,则根据请求扇区数、内部缓冲区状态计算出本次允许写入的扇区数,将内部缓冲区中的数据写入文件,同时移动当前文件指针,然后中断通知单片机,中断状态为ERR_SUCCESS,结束本次写操作.
如果直接向文件末尾追加数据,或者在写操作过程中,自动移动的文件指针超出原文件结束位置,那么CH378将自动更新内存中的文件长度变量.
在整个写操作完成后,如果短时间内不打算进行另一次写操作,那么单片机应该通知CH378刷新内存中的文件长度变量到USB存储设备或者SD卡中,方法有两种:(1)、类似上述步骤②和③的写0长度数据;(2)、执行CMD_FILE_CLOSE命令并且允许更新长度.
5.
35.
CMD_DISK_BOC_CMD该命令用于对USB存储设备执行BulkOnly传输协议的命令,不支持SD卡.
在执行该命令之前,单片机必须先通过CMD_WR_HOST_OFS_DATA命令向CH378写入相应的CBW包(参考CH378INC.
H文件中的BULK_ONLY_CBW结构),CH378在命令执行完成后向单片机请求中断,如果中断状态是ERR_SUCCESS则说明命令执行成功,对于有返回数据的操作,可以由CMD00_RD_HOST_REQ_DATA命令获取返回数据.
5.
36.
CMD_DISK_READCMD_DISK_READ命令用于从USB存储设备读物理扇区,不支持SD卡.
CMD_DISK_READ命令需要两组参数:4个字节表示的扇区起始地址和1个字节表示的扇区数,扇区起始地址即线性扇区号LBA,是以低字节在前的4个字节表示的32位双字数据.
该命令需要5个输入数据,依次是LBA地址的最低字节,LBA地址的较低字节,LBA地址的较高字节,LBA地址的最高字节,扇区数.
该命令一次可以在USB存储设备中任意读取最多40个扇区的数据.
一次完整的物理扇区读操作步骤如下:1单片机发出CMD_DISK_READ命令并指定扇区起始LBA和扇区数,启动读操作;2CH378将指定连续的扇区数据读取到CH378内部缓冲区中,然后中断通知单片机,中断状态为ERR_SUCCESS;3单片机通过发送CMD_RD_HOST_OFS_DATA或CMD_RD_HOST_CUR_DATA命令从CH378内部缓冲区读取实际数据.
如果单片机RAM足够,可以一次性读取完整的全部数据.
如果单片机RAM相对较少,也可以分多次小批量读取数据,边读取边处理.
5.
37.
CMD_DISK_WRITECMD_DISK_WRITE命令用于向USB存储设备写物理扇区,不支持SD卡.
CMD_DISK_WRITE命令需要两组参数:4个字节表示的扇区起始地址和1个字节表示的扇区数,扇区起始地址即线性扇区号LBA,是以低字节在前的4个字节表示的32位双字数据.
该命令需要5个输入数据,依次是LBA地址的最低字节,LBA地址的较低字节,LBA地址的较高字节,LBA地址的最高字节,扇区数.
该命令一次可以在USB存储设备中任意写入最多40个扇区的数据.
一次完整的物理扇区写操作步骤如下:1单片机通过CMD_WR_HOST_OFS_DATA或CMD_WR_HOST_CUR_DATA命令将要写入的数据预先输入到CH378内部缓冲区中;CH378手册(一)172单片机发出CMD_DISK_WRITE命令并指定扇区起始LBA和扇区数,启动写操作;5.
38.
CMD_FILE_QUERY该命令用于查询当前打开的文件信息,包括文件的属性、日期、时间、长度等.
该命令执行完毕后,CH378会产生中断通知单片机,单片机通过CMD_RD_HOST_REQ_DATA命令读取9个字节的返回数据.
数据格式为:4个字节的文件长度、2个字节的文件日期、2个字节的文件时间、1个字节的文件属性.
5.
39.
CMD_FILE_MODIFY该命令用于修改当前打开的文件信息,包括文件的属性、日期、时间、长度等.
执行该命令前,需要先通过CMD_WR_HOST_OFS_DATA命令设置要修改的文件信息.
数据格式为:4个字节的文件长度、2个字节的文件日期、2个字节的文件时间、1个字节的文件属性.
若文件长度为0xFFFFFFFF,文件日期为0xFFFF,文件时间为0xFFFF,文件属性为0xFF,则表示该对应的属性不进行修改.
6、功能说明6.
1.
单片机通讯接口CH378与单片机之间支持三种通讯接口:8位并行接口、SPI同步串行接口、异步串口.
在芯片上电复位时,CH378将采样SEL和TXD引脚的状态,根据这2个引脚状态的组合选择通讯接口,参考下表(表中X代表不关心此位,0代表低电平,1代表高电平或者悬空).
SEL引脚TXD引脚选择通讯接口11异步串口10SPI接口018位并口00错误接口CH378芯片INT#引脚输出的中断请求默认是低电平有效,可以连接到单片机的中断输入引脚或普通输入引脚,单片机可以使用中断方式或查询方式获知CH378的中断请求.
为了节约引脚,单片机可以不连接CH378的INT#引脚,而通过其它方式获知中断,具体参考第8章应用说明中的介绍.
6.
2.
并行接口并口信号线包括:8位双向数据总线D7~D0、读选通输入引脚RD#、写选通输入引脚WR#、片选输入引脚PCS#以及地址输入引脚A0.
CH378芯片的PCS#由地址译码电路驱动,用于当单片机具有多个外围器件时进行设备选择.
通过被动并行接口,CH378芯片可以很方便地挂接到各种8位单片机、DSP、MCU的系统总线上,并且可以与多个外围器件共存.
对于类似Intel并口时序的单片机,CH378芯片的RD#引脚和WR#引脚可以分别连接到单片机的读选通输出引脚和写选通输出引脚.
对于类似Motorola并口时序的单片机,CH378芯片的RD#引脚应该接低电平,并且WR#引脚连接到单片机的读写方向输出引脚R/-W.
下表为并口I/O操作的真值表(表中X代表不关心此位,Z代表CH378三态禁止).
PCS#WR#RD#A0D7-D0对CH378芯片的实际操作1XXXX/Z未选中CH378,不进行任何操作011XX/Z虽然选中但无操作,不进行任何操作0011输入向CH378的命令端口写入命令码0010输入向CH378的数据端口写入数据0100输出从CH378的数据端口读出数据0101输出从CH378的命令端口读取接口状态:CH378手册(一)18位7是中断标志,低有效,等效于INT#引脚CH378芯片占用两个地址位,当A0引脚为高电平时选择命令端口,可以写入新的命令,或者读出接口状态;当A0引脚为低电平时选择数据端口,可以读写数据.
单片机通过8位并口对CH378芯片进行读写,所有操作都是由一个命令码、若干个输入数据和若干个输出数据组成,部分命令不需要输入数据,部分命令没有输出数据.
命令操作步骤如下:1、单片机在A0=1时向命令端口写入命令代码;2、如果该命令具有输入数据,那么在A0=0时依次写入输入数据,每次一个字节;3、如果该命令具有输出数据,那么在A0=0时依次读取输出数据,每次一个字节;4、命令完成,有些命令在执行完成后会产生中断通知,单片机可以暂停或者转到①继续执行下一个命令.
6.
3.
SPI串行接口SPI同步串行接口信号线包括:SPI片选输入引脚SCS、串行时钟输入引脚SCK、串行数据输入引脚SDI、串行数据输出引脚SDO.
通过SPI串行接口,CH378可以用较少的连线挂接到各种单片机、DSP、MCU的SPI串行总线上,或者进行较远距离的点对点连接.
CH378芯片的SCS引脚由单片机的SPI片选输出引脚或者普通输出引脚驱动,SCK引脚由单片机的SPI时钟输出引脚SCK驱动,SDI引脚由单片机的SPI数据输出引脚SDO或MOSI驱动,SDO引脚则连接到单片机的SPI数据输入引脚SDI或MISO.
对于硬件SPI接口,建议SPI设置是CPOL=CPHA=0或者CPOL=CPHA=1,并且数据位顺序是高位在前MSBfirst.
CH378的SPI接口也支持单片机用普通I/O引脚模拟SPI接口进行通讯.
如果不连接INT#引脚,那么可以通过查询SDO引脚获知中断,方法是让SDO引脚独占单片机的某个输入引脚,并通过CMD_SET_SDO_INT命令设置SDO引脚在SCS片选无效时兼做中断请求输出.
CH378的SPI接口支持SPI模式0和SPI模式3,CH378总是从SPI时钟SCK的上升沿输入数据,并在允许输出时从SCK的下降沿输出数据,数据位顺序是高位在前,计满8位为一个字节.
SPI的操作步骤是:1单片机产生CH378芯片的SPI片选,低电平有效;2单片机按SPI输出方式发出一个字节的数据,CH378总是将SPI片选SCS有效后收到的首个字节当做命令码,后续字节当做数据;3单片机延时TSC时间(约0.
5uS)等待CH378的SPI接口空闲;4如果是写操作,单片机向CH378发出一个字节的待写数据,等待SPI接口空闲后,单片机继续发出若干个字节的待写数据,CH378依次接收,直到单片机禁止SPI片选;5如果是读操作,单片机从CH378接收一个字节的数据,等待SPI接口空闲后,单片机继续从CH378接收若干个字节的数据,直到单片机禁止SPI片选;6单片机禁止CH378芯片的SPI片选,以结束当前SPI操作.
下图是SPI接口的逻辑时序图,前一个是发出命令12H并写入数据34H,后一个是发出命令28H并读出数据78H.
CH378手册(一)196.
4.
异步串口异步串口信号线包括:串行数据输入引脚RXD和串行数据输出引脚TXD.
通过串行接口,CH378可以用最少的连线与单片机、DSP、MCU进行较远距离的点对点连接.
CH378芯片的RXD和TXD可以分别连接到单片机的串行数据输出引脚和串行数据输入引脚.
CH378的串行数据格式是标准的字节传输模式,包括1个起始位、8个数据位、1个停止位.
CH378既支持硬件设定默认的串行通讯波特率,也支持单片机随时通过CMD_SET_BAUDRATE命令选择合适的通讯波特率.
每次上电复位后,CH378默认的串行通讯波特率由SDO、SDI、SCK三个引脚的电平组合设定,参考下表(表中0代表低电平,1代表高电平或者悬空).
SDO引脚SDI引脚SCK引脚上电复位后默认的串行通讯波特率1119600bps11057600bps101115200bps100460800bps0111000000bps0101843200bps0013000000bps000921600bps为了区分命令码和数据,CH378要求单片机先通过串口发送两个同步码字节(57H和ABH),然后再发送命令码,接着是发送数据或者接收数据.
CH378会检查上述两个同步码字节之间、同步码与命令码之间的间隔时间,如果间隔时间大于串口输入超时时间SER_CMD_TIMEOUT(约32mS),那么CH378将丢弃该同步码及命令包.
串口命令操作步骤如下:1单片机通过串口向CH378发出第一同步码57H;2单片机向CH378发出第二同步码ABH;3单片机向CH378发出命令码;4如果该命令具有输入数据,那么依次向CH378发出输入数据,每次一个字节;5如果该命令具有输出数据,那么依次从CH378接收输出数据,每次一个字节;6命令完成,有些命令在执行完成后会产生中断通知并通过串口直接发出中断状态码,单片机可以暂停或者转到①继续执行下一个命令.
6.
5.
自动演示CH378芯片正常上电后,会自动检测AUTO引脚的电平,如果检测到AUTO引脚为低电平,则进入自动演示模式.
以检测芯片是否正常工作、接口模式是否正确、该SD卡或者USB存储设备是否支持、文件操作是否能正常.
整个自动演示步骤如下:1给CH378芯片上电,插入SD卡或者USB存储设备,也可以先插入再上电;2设置AUTO引脚为低电平,或将AUTO引脚与GND短接;3CH378芯片RDY#引脚输出高电平,自动演示开始;4CH378进行内部各种初始化,并在SD卡或者USB存储设备根目录下新建名为"芯片演示.
TXT"的文件,写入当前芯片信息(芯片版本、通信接口模式、插入设备、文件系统格式、扇区大小、总容量、剩余容量等),如果初始化失败或自动演示过程中检测到AUTO引脚检测到高电平,跳转到⑤;5芯片自动演示结束,如果自动演示成功则RDY#引脚输出低电平,如果自动演示失败则RDY#引脚输出规则方波.
6等待AUTO引脚检测到高电平,退出自动演示模式.
一般在自动演示完毕后,建议单片机发送CMD_RESET_ALL命令或者通过RSTI引脚复位CH378芯片,然后再进行其它操作.
CH378手册(一)206.
6.
其它硬件CH378芯片内部集成了USB-SIE和Phy-I/O、CRC数据校验、USB-Host控制器、USB-Device控制器、SD卡SPI-Host控制器、被动并行接口、SPI-Slave控制器、异步串口、SRAM、FIFO、高速MCU、固件程序、晶体振荡器和PLL倍频器、电源上电复位电路等.
CH378芯片的ACT#引脚用于状态指示输出.
在USB主机方式下,当USB设备断开后,该引脚输出高电平;当USB设备连接后,该引脚输出低电平.
在SD卡主机方式下,当SD卡断开后,该引脚输出高电平;当SD卡连接后,该引脚输出低电平.
CH378的ACT#引脚可以外接串了限流电阻的发光二级管LED,用于指示连接状态.
CH378芯片的RDY#引脚用于状态指示输出.
在USB主机方式下,当USB设备初始化成功可以进行文件操作后,该引脚输出低电平.
在SD卡主机方式下,当USB设备初始化成功可以进行文件操作后,该引脚输出低电平.
在自动演示方式下,当自动演示开始后,该引脚输出高电平;当自动演示结束并成功时,该引脚输出低电平.
CH378芯片的UD+和UD-引脚是USB信号线,可以直接连接到USB设备.
如果为了芯片安全而串接保险电阻或者电感或者ESD保护器件,那么交直流等效串联电阻应该在5Ω之内.
CH378芯片内置了电源上电复位电路,一般情况下,不需要外部提供复位.
RSTI引脚用于从外部输入异步复位信号;当RSTI引脚为低电平时,CH378芯片被复位;当RSTI引脚恢复为高电平后,CH378会继续延时复位50mS左右,然后进入正常工作状态.
为了在电源上电期间可靠复位并且减少外部干扰,可以在RSTI引脚与地之间跨接一个容量为0.
1uF左右的电容.
CH378芯片的RST引脚是高电平有效的复位状态输出引脚,可以用于向外部单片机提供上电复位信号.
当CH378电源上电复位或者被外部强制复位以及复位延时期间,RST引脚输出高电平;CH378复位完成并且通讯接口初始化完成后,RST引脚恢复到低电平.
CH378芯片正常工作时需要外部为其提供30MHz的时钟信号.
CH378芯片内置了晶体振荡器和振荡电容,一般情况下,时钟信号由CH378内置的振荡器通过晶体稳频振荡产生,外围电路需要在XI和XO引脚之间连接一个标称频率为30MHz的晶体.
7、参数7.
1.
绝对最大值(临界或者超过绝对最大值将可能导致芯片工作不正常甚至损坏)名称参数说明最小值最大值单位TA工作时的环境温度VCC33=3.
3VVCC18=1.
8V-4085℃TS储存时的环境温度-55125℃VCC33电源电压(VCC33接电源,GND接地)-0.
44.
2VVCC18电源电压(VCC18接电源,GND接地)-0.
42.
3VVIO输入或者输出引脚上的电压-0.
4VCC33+0.
4VVIO5支持5V耐压的输入或者输出引脚上的电压-0.
45.
4VV7.
2.
电气参数(测试条件:TA=25℃,VCC33=3.
3V、VCC18=1.
8V,不包括连接USB总线的引脚)名称参数说明最小值典型值最大值单位VCCxx电源电压VCC332.
73.
33.
6VVCC181.
651.
81.
95ICC工作时的总电源电流VCC33=3.
3V90120mACH378手册(一)21ISLP低功耗状态的电源电流I/O引脚悬空/内部下拉VCC33=3.
3V15mAVIL低电平输入电压-0.
40.
7VVIH高电平输入电压2.
0VCC33+0.
4VVOL低电平输出电压(4mA吸入电流)0.
4VVOH高电平输出电压(4mA输出电流)VCC33-0.
4VIUP内置上拉电阻的输入端的输入电流2040100uAIDN内置下拉电阻的输入端的输入电流-20-40-100uAVR电源上电复位的电压门限1.
01.
51.
6V7.
3.
时序参数(测试条件:TA=25℃,VCC33=3.
3V、VCC18=1.
8V,参考附图)名称参数说明最小值典型值最大值单位FCLKXI引脚的输入时钟的频率29.
99530.
0030.
005MHzTPR内部电源上电的复位时间155060mSTRI外部复位输入的有效信号宽度100nSTRD外部复位输入后的复位延时155060mSTWAK从低功耗状态退出的唤醒时间3715mSTE1CMD_RESET_ALL命令的执行时间105060mSTE2CMD_SET_USB_MODE命令的执行时间13560mSTE3TEST_CONNECT命令的执行时间13mSTE4CMD_SET_BAUDRATE命令的执行时间20010002000uSTE0其余命令的执行时间0.
81.
5uSTSX命令码与命令码之间的间隔时间1.
5uSTSC命令码与数据之间的间隔时间0.
6uSTSD数据与数据之间的间隔时间0.
3uSTINT收到GET_STATUS命令到INT#引脚撤消中断12uS7.
4.
并口时序参数(测试条件:TA=25℃,VCC33=3.
3V、VCC18=1.
8V,参考附图)(RD是指RD#信号有效并且PCS#信号有效,RD#=PCS#=0执行读操作)(WR是指WR#信号有效并且PCS#信号有效,WR#=PCS#=0执行写操作)名称参数说明最小值典型值最大值单位TWW有效的写选通脉冲WR的宽度30nSTRW有效的读选通脉冲RD的宽度35nSTASRD或WR前的地址输入建立时间3nSTAHRD或WR后的地址输入保持时间3nSTIS写选通WR前的数据输入建立时间0nSTIH写选通WR后的数据输入保持时间3nSTON读选通RD有效到数据输出有效2715nSTOF读选通RD无效到数据输出无效31225nSCH378手册(一)227.
5.
SPI时序参数(测试条件:TA=25℃,VCC33=3.
3V、VCC18=1.
8V,参考附图)名称参数说明最小值典型值最大值单位TSSSCK上升沿之前SCS有效的建立时间25nSTSHSCK上升沿之后SCS有效的保持时间12nSTNSSCK上升沿之前SCS无效的建立时间12nSTNHSCK上升沿之后SCS无效的保持时间12nSTNSCS无效时间(SPI操作间隔时间)60nSTCHSCK时钟的高电平时间15nSCH378手册(一)23TCLSCK时钟的低电平时间15nSTDSSCK上升沿之前SDI输入的建立时间4nSTDHSCK上升沿之后SDI输入的保持时间2nSTOXSCK下降沿到SDO输出改变2612nSTOZSCS无效到SDO输出无效31018nS8、应用8.
1.
SD卡和U盘应用(下图)如果需要将CH378配置为8位并口通讯方式PARALLEL,那么SEL引脚应该接GND,TXD引脚悬空.
该接口与外围单片机通讯使用的引脚有A0、PCS#、RD#、WR#、D0-D7、INT#(可选)、RSTI(可选).
如果需要将CH378配置为SPI串行通讯方式SPI,那么TXD引脚应该接GND,SEL引脚悬空.
该接口与外围单片机通讯使用的引脚有SCS、SCK、SDO、SDI、INT#(可选)、RSTI(可选).
如果需要将CH378配置为异步串口通讯方式UART/SERIAL,那么SEL引脚和TXD引脚应该都悬空.
该接口与外围单片机通讯使用的引脚有TXD、RXD、INT#(可选)、RSTI(可选).
默认的串口通讯波特率由SDO、SDI、SCK三个引脚设定.
如果需要动态修改CH378串口的通讯波特率,那么建议由单片机的I/O引脚控制CH378的RSTI引脚,便于在必要时复位CH378以恢复到默认的通讯波特率.
为了节约引脚,单片机可以不连接CH378芯片的INT#引脚,获知中断通知的方法如下:CH378手册(一)2418位并口方式下通过查询CH378的状态端口(即命令端口)获取接口状态,位7是中断标志PARA_STATE_INTB,低有效,等效于查询INT#引脚,位7为0时说明有中断请求;位4是忙状态标志PARA_STATE_BUSY,高有效;2SPI接口方式下通过查询SDO引脚获知中断(上电或者复位后要先通过CMD_SET_SDO_INT命令设置SDO引脚在SCS片选无效时兼做中断请求输出),SDO为低电平时说明有中断请求;3串口方式下CH378在产生中断通知(INT#变为低电平)的同时,会通过串口直接发出中断状态码,单片机接收到中断状态码说明有中断请求.
P1为USB端口,用来连接USB存储设备,USB总线包括一对5V电源线和一对数据信号线.
F1为保险丝,以保护USB存储设备.
必要时可以串接具有限流作用的快速电子开关,USB电源电压必须是5V.
P2为SD卡插槽,SD卡通讯使用的SCS、SCK、SDO、SDI、INSERT和WP引脚连接到CH378芯片,其余引脚通过上拉电阻接3.
3V电源.
F2为保险丝,C35、C36为SD卡供电的退藕电容.
C4和C14为外部电源退耦,可以是容量为0.
1μF的独石或者高频瓷片电容.
CH378有多组电源引脚,本图中只画了其中一组表示,实际应用中需要全部进行连接.
晶体X1用于时钟振荡电路,USB-HOST主机方式要求时钟频率比较准确,晶体X1的频率是30MHz±0.
4‰.
C27和C28为振荡电容,根据晶体X1的特性选择,容量在10pF到30pF之间.
在设计印刷线路板PCB时,需要注意:退耦电容C4和C14尽量靠近CH378的相连引脚;使D+和D-信号线贴近平行布线,尽量在两侧提供地线或者覆铜,减少来自外界的信号干扰;尽量缩短XI和XO引脚相关信号线的长度,为了减少高频时钟对外界的干扰,可以在相关元器件周边环绕地线或者覆铜.
8.
2.
应用基础U盘(或者SD卡,下同)提供了若干个物理扇区用于数据存储,每个扇区大小通常是512字节.
由于计算机通常将U盘中的物理扇区组织为FAT文件系统,为了方便单片机通过U盘或者SD卡与计算机之间交换数据,单片机也应该在FAT规范下通过文件的形式存取U盘中的数据.
一个U盘中可以有若干个文件,每个文件都是一组数据的集合,以文件名区分和识别.
实际文件数据的存放可能不是连续的,而是通过一组"指针"链接的多个块(也就是分配单元或者簇),从而能够根据需要随时增大文件长度以容纳更多数据.
目录(文件夹)是为了便于分类管理,管理者可以人为指定将多个文件归档在一起,例如2004年的文件归到一个目录(文件夹)中.
在FAT文件系统中,磁盘容量以簇为基本单位进行分配,而簇的大小总是扇区的倍数,所以文件的占用空间总是簇的倍数,也是扇区的倍数.
虽然文件占用的空间是簇或者扇区的倍数,但是在实际应用中,保存在文件中的有效数据的长度却不一定是扇区的倍数,所以FAT文件系统在文件目录信息FAT_DIR_INFO中专门记录了当前文件中有效数据的长度,即有效数据的字节数,也就是通常所说的文件长度,文件长度总是小于或者等于文件占用的空间.
在对文件写入数据后,如果是覆盖了原数据,那么文件长度可能不发生变化,当超过原文件长度后,变为追加数据,那么文件长度应该发生变化(增大).
如果向文件追加数据后,没有修改文件目录信息中的文件长度,那么FAT文件系统会认为超过文件长度的数据是无效的,正常情况下,计算机无法读出超过文件长度的数据,虽然数据实际存在.
如果数据量少或者数据不连续,那么可以在每次追加数据后立即更新文件目录信息中的文件长度,但是,如果数据量大并且需要连续写入数据,立即更新文件目录信息会降低效率,并且频繁修改文件目录信息也会缩短U盘中闪存的使用寿命(因为闪存只能进行有限次擦写),所以在这种情况下,应该在连续写入多组数据后再更新一次文件目录信息中的文件长度,或者一直等到关闭文件时再更新文件长度,CMD_FILE_CLOSE命令可以将内存中的文件长度刷新到U盘文件的文件目录信息中.
虽然CH378最大支持4GB的单个文件,但是为了提高效率,建议单个文件的长度不要超过100MB,通常在几KB到几MB范围是比较正常的,数据较多时可以分多个目录,分多个文件存储.
一般情况下,单片机或者嵌入式系统处理U盘的文件系统需要实现下图左边的4个层次,右边是U盘的内部结构层次.
由于CH378不仅是一个通用的USB-HOST硬件接口芯片,还内置了相关的USB底层传输固件程序、Bulk-Only协议传输固件程序、FAT文件系统管理固件程序,包含了下图左边的4个层次(标为灰色部分),所以实际的单片机程序只需要发出文件管理和文件读写命令.
CH378手册(一)25文件级API应用层接口FAT32/16/12文件系统层SCSI/UFI/RBC命令层以扇区为单位读写U盘Bulk-Only传输协议层Bulk-Only传输协议层USB基本传输:控制/批量USB基本传输:控制/批量USBUSB-HOST硬件接口芯片USB-DEVICE硬件接口芯片8.
3.
快速应用参考步骤请参考例子程序调用已经将多个命令打包后的子程序.
以下步骤使用原始命令码,仅供参考.
wordpress外贸集团企业主题,wordpress通用跨屏外贸企业响应式布局设计,内置更完善的外贸企业网站优化推广功能,完善的企业产品营销展示 + 高效后台自定义设置。wordpress高级推广外贸主题,采用标准的HTML5+CSS3语言开发,兼容当下的各种主流浏览器,根据用户行为以及设备环境(系统平台、屏幕尺寸、屏幕定向等)进行自适应显示; 完美实现一套主题程序支持全部终端设备,保证网站在各...
物语云计算怎么样?物语云计算(MonogatariCloud)是一家成立于2016年的老牌国人商家,主营国内游戏高防独服业务,拥有多家机房资源,产品质量过硬,颇有一定口碑。本次带来的是特惠活动为美国洛杉矶Cera机房的不限流量大带宽VPS,去程直连回程4837,支持免费安装Windows系统。值得注意的是,物语云采用的虚拟化技术为Hyper-v,因此并不会超售超开。一、物语云官网点击此处进入物语云...
老鹰主机HawkHost是个人比较喜欢的海外主机商,如果没有记错的话,大约2012年左右的时候算是比较早提供支付宝付款的主机商。当然这个主机商成立时间更早一些的,由于早期提供支付宝付款后,所以受众用户比较青睐,要知道我们早期购买海外主机是比较麻烦的,信用卡和PAYPAL还没有普及,大家可能只有银联和支付宝,很多人选择海外主机还需要代购。虽然如今很多人建站少了,而且大部分人都用云服务器。但是老鹰主机...