单片机U盘读写参考程序
用C语言来实现单片机对U盘的操作
ElectronicComponent&DeviceApplicationsVol.10No.3Mar.2008第10卷第3期2008年3月2008.3www.ecda.cn0引言随着U盘技术的迅速发展,单片机海量存储选用U盘已经成为大家的首选。
而如何让单片机像在WINDOWS下识别FAT文件系统那样识别U盘并进行随意读写呢?本文针对这一情况,给出了如何在嵌入式系统中利用CH375实现单片机对U盘进行读写操作的具体方法。
1CH375的主要特点其实,单片机读写U盘主要是找到USB总线接口芯片,而CH375就是一个非常好用的芯片USB接口,它的主要特点如下:◇全速USB-HOST主机接口,兼容USBV2.0,外围元器件只需要晶体和电容;◇可全速动态切换主机与设备;◇主机端点有输入和输出缓冲区各64字节,可支持常用的12Mbps全速USB设备;◇支持USB的控制、批量和中断传输;◇可自动检测USB设备的连接和断开,并提供设备连接和断开的事件通知;◇内置控制传输的协议处理器,可简化常用的控制传输;◇内置固件处理海量存储设备的专用通讯协议,可支持Bulk-Only传输协议和SCSI、UFI、RBC或等效命令集的USB存储设备(包括USB硬盘/USB闪存盘/U盘);◇可通过U盘文件级子程序库实现单片机读写USB存储设备中的文件。
◇并行接口包含8位数据总线,其中4线控制包括读选通、写选通、片选输入、中断输出等;◇串行接口包含串行输入、串行输出、中断输出,支持通讯波特率动态调整;◇可支持5V电源电压和3.3V电源电压,此外,CH375A芯片还支持低功耗模式;◇采用SOP-28封装。
2FAT文件系统由于绝大部分单片机海量存储系统最终会与Windows操作系统计算机交换数据,所以,为了方便数据交换,U盘中的数据应该符合Windows文件系统格式。
常用的FAT文件系统有FAT12、FAT16、FAT32等,U盘上的数据按照其不同的特点和作用大致可分为以下几部分:(1)主引导记录(MBR)实际上,在总共512字节的主引导扇区中,MBR只占用了其中的446字节,另外的64字节交给了DPT(DiskPartitionTable盘分区表),最后两字节“55AA”是分区的结束标志。
51单片机读写U盘源代码 430单片机读写U盘源代码
* 西安达泰电子有限责任公司(Xi'an DATAI Electronic Co,Ltd)
*
* 网址:
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
//读文件命令
uchar code Read[66] ={0xaa,0xbb,
0x08,0x08,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
//删除文件命令
uchar code Remove[66]={0xaa,0xbb,
0x11,0x00,0x54,0x45,0x53,0x54,0x20,0x20,0x20,0x20,0x54,0x58,0x54,0x00,0x00,0x00,
****************************************************************************************************/
关于单片机读写U盘F16和F32文件系统
摘要本文以51单片机为例介绍如何扩展USB接口进行对U盘的读写,并详细介绍FAT16、F AT32文件系统的细节以及如何编码实现单片机对文件系统的常用操作,顺带提到一点关于U盘兼容性问题的解决经验。
在这里单片机是host,U盘是slave。
在嵌入式系统中实现host很有意义,可以直接扩展出大容量的外存储器。
只要对单片机有一点点了解的人应该可以很顺利地阅读下去,如有简单的C语言编程基础更佳。
本文是科普性质,并不面面俱到,有一点应用笔记的味道。
章节间关联性较强,最好按顺序来阅读。
本文资料完全来自网络,再加入了笔者自己的理解和实践结果。
本文末尾列出了所有的参考资料。
如果觉得有知识产权问题请在21ic社区发信给fjh。
仓促成文,错误绝对存在,但希望不影响阅读。
关键词USB枚举过程;读写U盘;SL811;F AT16;F AT32Abstract[Click here and input abstract in English]Keywords[Click here and input keywords in English]符号说明(略)目录第一章硬件设计1.1 硬件概述先详细介绍基于Cypress公司的SL811芯片的扩展方案,基于国内南京沁恒电子的CH375芯片的方案最后介绍。
本文尽量介绍关于USB、U盘和文件系统等平台无关的内容,SL811硬件平台方面的内容不可避免要涉及到一点,但尽量控制到最少。
硬件很简单,详见protel文件(省略了无关的部分,比较粗糙,凑合看…)。
主要是扩展一片32K的外部RAM 62256作为数据缓冲,同时分配好SL811的地址。
通过51单片机的A15地址线分别连接到外部RAM 62256和SL811的片选CS端,来区分两者的地址,可见RAM占据低32K地址空间,而SL811依“写地址”和“读写数据地址”分别占据8000H和8001H两个字节的地址空间。
第二章U盘的逻辑结构2.1 U盘的逻辑结构U盘可以看成是以扇区(1扇区=512Bytes)为单位线性排列的实体,即0号扇区,1号扇区,2号扇区,……这样按顺序地排列下去。
u盘读写控制源程序_ch376芯片之欧阳法创编
主要包含4个C文件和和三个头文件CH376INC.H 与CH376HFT.C为u盘主文件SPI_SW.C 为对硬件操作文件单片机与SPI接口FILE_SYS.H与FILE_SYS.C 为ch376接口函数分别列出CH376INC.H文件:/* C Define for CH376 *//* Website: *//* Email: tech@ *//* Author: W.ch .10 *//* V1.0 for CH376 */#ifndef __CH376INC_H__#define __CH376INC_H__#ifdef __cplusplusextern "C" {#endif/****************************************************** ***************************************************** *********** *//* 常用类型和常量定义 */#ifndef TRUE#define TRUE 1#define FALSE 0#endif#ifndef NULL#define NULL 0#endif#ifndef UINT8typedef unsigned char UINT8;#endif#ifndef UINT16typedef unsigned short UINT16;#endif#ifndef UINT32typedef unsigned long UINT32;#endif#ifndef PUINT8typedef unsigned char *PUINT8;#endif#ifndef PUINT16typedef unsigned short *PUINT16;#endif#ifndef PUINT32typedef unsigned long *PUINT32;#endif#ifndef UINT8Vtypedef unsigned char volatile UINT8V;#endif#ifndef PUINT8Vtypedef unsigned char volatile *PUINT8V;#endif/****************************************************** ***************************************************** *********** *//* 硬件特性 */#define CH376_DAT_BLOCK_LEN 0x40/* 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_禁止 *//****************************************************** ***************************************************** *********** *//* 主要命令(手册一), 常用 */#define CMD01_GET_IC_VER 0x01/* 获取芯片及固件版本 *//* 输出: 版本号( 位7为0, 位6为1, 位5~位0为版本号 ) *//* CH376返回版本号的值为041H即版本号为01H */#define CMD21_SET_BAUDRATE 0x02/* 串口方式: 设置串口通讯波特率(上电或者复位后的默认波特率为9600bps,由D4/D5/D6引脚选择) *//* 输入: 波特率分频系数, 波特率分频常数 *//* 输出: 操作状态( CMD_RET_SUCCESS或CMD_RET_ABORT, 其它值说明操作未完成 ) */#define CMD00_ENTER_SLEEP 0x03/* 进入睡眠状态 */#define CMD00_RESET_ALL 0x05/* 执行硬件复位 */#define CMD11_CHECK_EXIST 0x06/* 测试通讯接口和工作状态 *//* 输入: 任意数据 *//* 输出: 输入数据的按位取反 */#define CMD20_CHK_SUSPEND 0x0B/* 设备方式: 设置检查USB总线挂起状态的方式 *//* 输入: 数据10H, 检查方式 *//* 00H=不检查USB挂起, 04H=以50mS为间隔检查USB挂起, 05H=以10mS为间隔检查USB挂起*/#define CMD20_SET_SDO_INT 0x0B/* SPI接口方式: 设置SPI的SDO引脚的中断方式 *//* 输入: 数据16H, 中断方式 *//* 10H=禁止SDO引脚用于中断输出,在SCS片选无效时三态输出禁止, 90H=SDO引脚在SCS片选无效时兼做中断请求输出 */#define CMD14_GET_FILE_SIZE 0x0C/* 主机文件模式: 获取当前文件长度 *//* 输入: 数据68H *//* 输出: 当前文件长度(总长度32位,低字节在前) */ #define CMD50_SET_FILE_SIZE 0x0D/* 主机文件模式: 设置当前文件长度 *//* 输入: 数据68H, 当前文件长度(总长度32位,低字节在前) */#define CMD11_SET_USB_MODE 0x15/* 设置USB工作模式 *//* 输入: 模式代码 *//* 00H=未启用的设备方式, 01H=已启用的设备方式并且使用外部固件模式(串口不支持), 02H=已启用的设备方式并且使用内置固件模式 *//* 03H=SD卡主机模式/未启用的主机模式,用于管理和存取SD卡中的文件 *//* 04H=未启用的主机方式, 05H=已启用的主机方式, 06H=已启用的主机方式并且自动产生SOF包, 07H=已启用的主机方式并且复位USB总线 *//* 输出: 操作状态( CMD_RET_SUCCESS或CMD_RET_ABORT, 其它值说明操作未完成 ) */#define CMD01_GET_STATUS 0x22/* 获取中断状态并取消中断请求 *//* 输出: 中断状态 */#define CMD00_UNLOCK_USB 0x23/* 设备方式: 释放当前USB缓冲区 */#define CMD01_RD_USB_DATA0 0x27/* 从当前USB中断的端点缓冲区或者主机端点的接收缓冲区读取数据块 *//* 输出: 长度, 数据流 */#define CMD01_RD_USB_DATA 0x28/* 设备方式: 从当前USB中断的端点缓冲区读取数据块, 并释放缓冲区, 相当于CMD01_RD_USB_DATA0 + CMD00_UNLOCK_USB *//* 输出: 长度, 数据流 */#define CMD10_WR_USB_DATA7 0x2B/* 设备方式: 向USB端点2的发送缓冲区写入数据块 *//* 输入: 长度, 数据流 */#define CMD10_WR_HOST_DATA 0x2C/* 向USB主机端点的发送缓冲区写入数据块*//* 输入: 长度, 数据流 */#define CMD01_WR_REQ_DATA 0x2D/* 向内部指定缓冲区写入请求的数据块 *//* 输出: 长度 *//* 输入: 数据流 */#define CMD20_WR_OFS_DATA 0x2E/* 向内部缓冲区指定偏移地址写入数据块 *//* 输入: 偏移, 长度, 数据流 */#define CMD10_SET_FILE_NAME 0x2F/* 主机文件模式: 设置将要操作的文件的文件名*//* 输入: 以0结束的字符串(含结束符0在内长度不超过14个字符) *//****************************************************** ***************************************************** *********** *//* 主要命令(手册一), 常用, 以下命令总是在操作结束时产生中断通知, 并且总是没有输出数据 */#define CMD0H_DISK_CONNECT 0x30/* 主机文件模式/不支持SD卡: 检查磁盘是否连接 *//* 输出中断 */#define CMD0H_DISK_MOUNT 0x31/* 主机文件模式: 初始化磁盘并测试磁盘是否就绪 *//* 输出中断 */#define CMD0H_FILE_OPEN 0x32/* 主机文件模式: 打开文件或者目录(文件夹),或者枚举文件和目录(文件夹) *//* 输出中断 */#define CMD0H_FILE_ENUM_GO 0x33/* 主机文件模式: 继续枚举文件和目录(文件夹) *//* 输出中断 */#define CMD0H_FILE_CREATE 0x34/* 主机文件模式: 新建文件,如果文件已经存在那么先删除 *//* 输出中断 */#define CMD0H_FILE_ERASE 0x35/* 主机文件模式: 删除文件,如果已经打开则直接删除,否则对于文件会先打开再删除,子目录必须先打开 *//* 输出中断 */#define CMD1H_FILE_CLOSE 0x36/* 主机文件模式: 关闭当前已经打开的文件或者目录(文件夹) *//* 输入: 是否允许更新文件长度 *//* 00H=禁止更新长度, 01H=允许更新长度 */ /* 输出中断 */#define CMD1H_DIR_INFO_READ 0x37/* 主机文件模式: 读取文件的目录信息 *//* 输入: 指定需要读取的目录信息结构在扇区内的索引号 *//* 索引号范围为00H~0FH, 索引号0FFH则为当前已经打开的文件 *//* 输出中断 */#define CMD0H_DIR_INFO_SAVE 0x38/* 主机文件模式: 保存文件的目录信息 *//* 输出中断 */#define CMD4H_BYTE_LOCATE 0x39/* 主机文件模式: 以字节为单位移动当前文件指针 *//* 输入: 偏移字节数(总长度32位,低字节在前) *//* 输出中断 */#define CMD2H_BYTE_READ 0x3A/* 主机文件模式: 以字节为单位从当前位置读取数据块 *//* 输入: 请求读取的字节数(总长度16位,低字节在前) *//* 输出中断 */#define CMD0H_BYTE_RD_GO 0x3B/* 主机文件模式: 继续字节读 *//* 输出中断 */#define CMD2H_BYTE_WRITE 0x3C/* 主机文件模式: 以字节为单位向当前位置写入数据块 *//* 输入: 请求写入的字节数(总长度16位,低字节在前) *//* 输出中断 */#define CMD0H_BYTE_WR_GO 0x3D/* 主机文件模式: 继续字节写 *//* 输出中断 */#define CMD0H_DISK_CAPACITY 0x3E/* 主机文件模式: 查询磁盘物理容量 *//* 输出中断 */#define CMD0H_DISK_QUERY 0x3F/* 主机文件模式: 查询磁盘空间信息 *//* 输出中断 */#define CMD0H_DIR_CREATE 0x40/* 主机文件模式: 新建目录(文件夹)并打开,如果目录已经存在那么直接打开 *//* 输出中断 */#define CMD4H_SEC_LOCATE 0x4A/* 主机文件模式: 以扇区为单位移动当前文件指针 *//* 输入: 偏移扇区数(总长度32位,低字节在前) *//* 输出中断 */#define CMD1H_SEC_READ 0x4B/* 主机文件模式/不支持SD卡: 以扇区为单位从当前位置读取数据块 *//* 输入: 请求读取的扇区数 *//* 输出中断 */#define CMD1H_SEC_WRITE 0x4C/* 主机文件模式/不支持SD卡: 以扇区为单位在当前位置写入数据块 *//* 输入: 请求写入的扇区数 *//* 输出中断 */#define CMD0H_DISK_BOC_CMD 0x50/* 主机方式/不支持SD卡: 对USB存储器执行BulkOnly传输协议的命令 *//* 输出中断 */#define CMD5H_DISK_READ 0x54/* 主机方式/不支持SD卡: 从USB存储器读物理扇区 *//* 输入: LBA物理扇区地址(总长度32位, 低字节在前), 扇区数(01H~FFH) *//* 输出中断 */#define CMD0H_DISK_RD_GO 0x55/* 主机方式/不支持SD卡: 继续执行USB存储器的物理扇区读操作 *//* 输出中断 */#define CMD5H_DISK_WRITE 0x56/* 主机方式/不支持SD卡: 向USB存储器写物理扇区 *//* 输入: LBA物理扇区地址(总长度32位, 低字节在前), 扇区数(01H~FFH) *//* 输出中断 */#define CMD0H_DISK_WR_GO 0x57/* 主机方式/不支持SD卡: 继续执行USB存储器的物理扇区写操作 *//* 输出中断 *//****************************************************** ***************************************************** *********** *//* 辅助命令(手册二), 不太常用或者是为了与CH375和CH372兼容 */#define CMD10_SET_USB_SPEED 0x04/* 设置USB总线速度, 在每次CMD11_SET_USB_MODE设置USB工作模式时会自动恢复到12Mbps全速 *//* 输入: 总线速度代码 *//* 00H=12Mbps全速FullSpeed(默认值), 01H=1.5Mbps(仅修改频率), 02H=1.5Mbps低速LowSpeed */#define CMD11_GET_DEV_RATE 0x0A/* 主机方式: 获取当前连接的USB设备的数据速率类型 *//* 输入: 数据07H *//* 输出: 数据速率类型 *//* 位4为1则是1.5Mbps低速USB设备, 否则是12Mbps全速USB设备 */#define CMD11_GET_TOGGLE 0x0A/* 获取OUT事务的同步状态 *//* 输入: 数据1AH *//* 输出: 同步状态 *//* 位4为1则OUT事务同步, 否则OUT事务不同步 */#define CMD11_READ_VAR8 0x0A/* 读取指定的8位文件系统变量 *//* 输入: 变量地址 *//* 输出: 数据 *//*#define CMD11_GET_MAX_LUN =CMD11_READ_VAR8( VAR_UDISK_LUN )*/ /* 主机方式: 获取USB存储器最大和当前逻辑单元号 */ #define CMD20_SET_RETRY 0x0B/* 主机方式: 设置USB事务操作的重试次数 *//* 输入: 数据25H, 重试次数 *//* 位7为0则收到NAK时不重试, 位7为1位6为0则收到NAK时无限重试, 位7为1位6为1则收到NAK时最多重试3秒, 位5~位0为超时后的重试次数 */#define CMD20_WRITE_VAR8 0x0B/* 设置指定的8位文件系统变量 *//* 输入: 变量地址, 数据 *//*#define CMD20_SET_DISK_LUN =CMD20_WRITE_VAR8( VAR_UDISK_LUN )*/ /* 主机方式: 设置USB存储器的当前逻辑单元号 */#define CMD14_READ_VAR32 0x0C/* 读取指定的32位文件系统变量 *//* 输入: 变量地址 *//* 输出: 数据(总长度32位,低字节在前) */#define CMD50_WRITE_VAR32 0x0D/* 设置指定的32位文件系统变量 *//* 输入: 变量地址, 数据(总长度32位,低字节在前) */ #define CMD01_DELAY_100US 0x0F/* 延时100uS(串口不支持) *//* 输出: 延时期间输出0,延时结束输出非0 */#define CMD40_SET_USB_ID 0x12 /* 设备方式: 设置USB厂商VID和产品PID *//* 输入: 厂商ID低字节, 厂商ID高字节, 产品ID低字节, 产品ID高字节 */#define CMD10_SET_USB_ADDR 0x13/* 设置USB地址 *//* 输入: 地址值 */#define CMD01_TEST_CONNECT 0x16/* 主机方式/不支持SD卡: 检查USB设备连接状态 *//* 输出: 状态( USB_INT_CONNECT或USB_INT_DISCONNECT或USB_INT_USB_READY, 其它值说明操作未完成 ) */#define CMD00_ABORT_NAK 0x17/* 主机方式: 放弃当前NAK的重试 */#define CMD10_SET_ENDP2 0x18/* 设备方式(串口不支持): 设置USB端点0的接收器 *//* 输入: 工作方式 *//* 位7为1则位6为同步触发位, 否则同步触发位不变 *//* 位3~位0为事务响应方式: 0000就绪ACK, 1110正忙NAK, 1111错误STALL */#define CMD10_SET_ENDP3 0x19/* 设备方式(串口不支持): 设置USB端点0的发送器 *//* 输入: 工作方式 *//* 位7为1则位6为同步触发位, 否则同步触发位不变 *//* 位3~位0为事务响应方式: 0000~1000就绪ACK, 1110正忙NAK, 1111错误STALL */#define CMD10_SET_ENDP4 0x1A/* 设备方式(串口不支持): 设置USB端点1的接收器 *//* 输入: 工作方式 *//* 位7为1则位6为同步触发位, 否则同步触发位不变 *//* 位3~位0为事务响应方式: 0000就绪ACK, 1110正忙NAK, 1111错误STALL */#define CMD10_SET_ENDP5 0x1B/* 设备方式(串口不支持): 设置USB端点1的发送器 *//* 输入: 工作方式 *//* 位7为1则位6为同步触发位, 否则同步触发位不变 *//* 位3~位0为事务响应方式: 0000~1000就绪ACK, 1110正忙NAK, 1111错误STALL */#define CMD10_SET_ENDP6 0x1C/* 设置USB端点2/主机端点的接收器 *//* 输入: 工作方式 *//* 位7为1则位6为同步触发位, 否则同步触发位不变 *//* 位3~位0为事务响应方式: 0000就绪ACK, 1101就绪但不返回ACK, 1110正忙NAK, 1111错误STALL */#define CMD10_SET_ENDP7 0x1D/* 设置USB端点2/主机端点的发送器 *//* 输入: 工作方式 *//* 位7为1则位6为同步触发位, 否则同步触发位不变 *//* 位3~位0为事务响应方式: 0000就绪ACK, 1101就绪但无须应答, 1110正忙NAK, 1111错误STALL */#define CMD00_DIRTY_BUFFER 0x25/* 主机文件模式: 清除内部的磁盘和文件缓冲区*/#define CMD10_WR_USB_DATA3 0x29/* 设备方式(串口不支持): 向USB端点0的发送缓冲区写入数据块 *//* 输入: 长度, 数据流 */#define CMD10_WR_USB_DATA5 0x2A/* 设备方式(串口不支持): 向USB端点1的发送缓冲区写入数据块 *//* 输入: 长度, 数据流 *//****************************************************** ***************************************************** *********** *//* 辅助命令(手册二), 不太常用或者是为了与CH375和CH372兼容, 以下命令总是在操作结束时产生中断通知, 并且总是没有输出数据 */#define CMD1H_CLR_STALL 0x41/* 主机方式: 控制传输清除端点错误 *//* 输入: 端点号 *//* 输出中断 */#define CMD1H_SET_ADDRESS 0x45/* 主机方式: 控制传输设置USB地址 *//* 输入: 地址值 *//* 输出中断 */#define CMD1H_GET_DESCR 0x46/* 主机方式: 控制传输获取描述符 *//* 输入: 描述符类型 *//* 输出中断 */#define CMD1H_SET_CONFIG 0x49/* 主机方式: 控制传输设置USB配置 *//* 输入: 配置值 *//* 输出中断 */#define CMD0H_AUTO_SETUP 0x4D/* 主机方式/不支持SD卡: 自动配置USB设备*//* 输出中断 */#define CMD2H_ISSUE_TKN_X 0x4E/* 主机方式: 发出同步令牌, 执行事务, 该命令可代替CMD10_SET_ENDP6/CMD10_SET_ENDP7 + CMD1H_ISSUE_TOKEN *//* 输入: 同步标志, 事务属性 *//* 同步标志的位7为主机端点IN的同步触发位, 位6为主机端点OUT的同步触发位, 位5~位0必须为0 *//* 事务属性的低4位是令牌, 高4位是端点号*//* 输出中断 */#define CMD1H_ISSUE_TOKEN 0x4F/* 主机方式: 发出令牌, 执行事务, 建议用CMD2H_ISSUE_TKN_X命令 *//* 输入: 事务属性 *//* 低4位是令牌, 高4位是端点号 *//* 输出中断 */#define CMD0H_DISK_INIT 0x51/* 主机方式/不支持SD卡: 初始化USB存储器*//* 输出中断 */#define CMD0H_DISK_RESET 0x52/* 主机方式/不支持SD卡: 控制传输复位USB 存储器 *//* 输出中断 */#define CMD0H_DISK_SIZE 0x53/* 主机方式/不支持SD卡: 获取USB存储器的容量 *//* 输出中断 */#define CMD0H_DISK_INQUIRY 0x58/* 主机方式/不支持SD卡: 查询USB存储器特性 *//* 输出中断 */#define CMD0H_DISK_READY 0x59/* 主机方式/不支持SD卡: 检查USB存储器就绪 *//* 输出中断 */#define CMD0H_DISK_R_SENSE 0x5A/* 主机方式/不支持SD卡: 检查USB存储器错误 *//* 输出中断 */#define CMD0H_RD_DISK_SEC 0x5B/* 主机文件模式: 从磁盘读取一个扇区的数据到内部缓冲区 *//* 输出中断 */#define CMD0H_WR_DISK_SEC 0x5C/* 主机文件模式: 将内部缓冲区的一个扇区的数据写入磁盘 *//* 输出中断 */#define CMD0H_DISK_MAX_LUN 0x5D/* 主机方式: 控制传输获取USB存储器最大逻辑单元号 *//* 输出中断 *//****************************************************** ***************************************************** *********** *//* 以下定义只是为了兼容CH375的INCLUDE文件中的命令名称格式 */#ifndef _NO_CH375_COMPATIBLE_ #define CMD_GET_IC_VERCMD01_GET_IC_VER#define CMD_SET_BAUDRATECMD21_SET_BAUDRATE#define CMD_ENTER_SLEEPCMD00_ENTER_SLEEP#define CMD_RESET_ALLCMD00_RESET_ALL#define CMD_CHECK_EXISTCMD11_CHECK_EXIST#define CMD_CHK_SUSPENDCMD20_CHK_SUSPEND#define CMD_SET_SDO_INTCMD20_SET_SDO_INT#define CMD_GET_FILE_SIZECMD14_GET_FILE_SIZE#define CMD_SET_FILE_SIZECMD50_SET_FILE_SIZE#define CMD_SET_USB_MODE CMD11_SET_USB_MODE#define CMD_GET_STATUSCMD01_GET_STATUS#define CMD_UNLOCK_USB CMD00_UNLOCK_USB#define CMD_RD_USB_DATA0 CMD01_RD_USB_DATA0#define CMD_RD_USB_DATA CMD01_RD_USB_DATA#define CMD_WR_USB_DATA7 CMD10_WR_USB_DATA7#define CMD_WR_HOST_DATA CMD10_WR_HOST_DATA#define CMD_WR_REQ_DATA CMD01_WR_REQ_DATA#define CMD_WR_OFS_DATA CMD20_WR_OFS_DATA#define CMD_SET_FILE_NAME CMD10_SET_FILE_NAME#define CMD_DISK_CONNECT CMD0H_DISK_CONNECT#define CMD_DISK_MOUNT CMD0H_DISK_MOUNT#define CMD_FILE_OPENCMD0H_FILE_OPEN#define CMD_FILE_ENUM_GO CMD0H_FILE_ENUM_GO#define CMD_FILE_CREATE CMD0H_FILE_CREATE#define CMD_FILE_ERASECMD0H_FILE_ERASE#define CMD_FILE_CLOSECMD1H_FILE_CLOSE#define CMD_DIR_INFO_READ CMD1H_DIR_INFO_READ #define CMD_DIR_INFO_SAVE CMD0H_DIR_INFO_SAVE#define CMD_BYTE_LOCATE CMD4H_BYTE_LOCATE#define CMD_BYTE_READCMD2H_BYTE_READ#define CMD_BYTE_RD_GO CMD0H_BYTE_RD_GO#define CMD_BYTE_WRITE CMD2H_BYTE_WRITE#define CMD_BYTE_WR_GO CMD0H_BYTE_WR_GO#define CMD_DISK_CAPACITY CMD0H_DISK_CAPACITY #define CMD_DISK_QUERY CMD0H_DISK_QUERY#define CMD_DIR_CREATE CMD0H_DIR_CREATE#define CMD_SEC_LOCATE CMD4H_SEC_LOCATE#define CMD_SEC_READCMD1H_SEC_READ#define CMD_SEC_WRITECMD1H_SEC_WRITE#define CMD_DISK_BOC_CMD CMD0H_DISK_BOC_CMD #define CMD_DISK_READCMD5H_DISK_READ#define CMD_DISK_RD_GO CMD0H_DISK_RD_GO#define CMD_DISK_WRITECMD5H_DISK_WRITE#define CMD_DISK_WR_GO CMD0H_DISK_WR_GO#define CMD_SET_USB_SPEED CMD10_SET_USB_SPEED#define CMD_GET_DEV_RATE CMD11_GET_DEV_RATE#define CMD_GET_TOGGLE CMD11_GET_TOGGLE#define CMD_READ_VAR8CMD11_READ_VAR8#define CMD_SET_RETRYCMD20_SET_RETRY#define CMD_WRITE_VAR8 CMD20_WRITE_VAR8#define CMD_READ_VAR32 CMD14_READ_VAR32#define CMD_WRITE_VAR32 CMD50_WRITE_VAR32#define CMD_DELAY_100US CMD01_DELAY_100US#define CMD_SET_USB_IDCMD40_SET_USB_ID#define CMD_SET_USB_ADDR CMD10_SET_USB_ADDR#define CMD_TEST_CONNECT CMD01_TEST_CONNECT#define CMD_ABORT_NAKCMD00_ABORT_NAK#define CMD_SET_ENDP2CMD10_SET_ENDP2#define CMD_SET_ENDP3CMD10_SET_ENDP3#define CMD_SET_ENDP4CMD10_SET_ENDP4#define CMD_SET_ENDP5CMD10_SET_ENDP5#define CMD_SET_ENDP6CMD10_SET_ENDP6#define CMD_SET_ENDP7CMD10_SET_ENDP7#define CMD_DIRTY_BUFFER CMD00_DIRTY_BUFFER#define CMD_WR_USB_DATA3 CMD10_WR_USB_DATA3#define CMD_WR_USB_DATA5 CMD10_WR_USB_DATA5#define CMD_CLR_STALLCMD1H_CLR_STALL#define CMD_SET_ADDRESS CMD1H_SET_ADDRESS#define CMD_GET_DESCRCMD1H_GET_DESCR#define CMD_SET_CONFIG CMD1H_SET_CONFIG#define CMD_AUTO_SETUP CMD0H_AUTO_SETUP#define CMD_ISSUE_TKN_X CMD2H_ISSUE_TKN_X#define CMD_ISSUE_TOKEN CMD1H_ISSUE_TOKEN#define CMD_DISK_INITCMD0H_DISK_INIT#define CMD_DISK_RESET CMD0H_DISK_RESET#define CMD_DISK_SIZECMD0H_DISK_SIZE#define CMD_DISK_INQUIRY CMD0H_DISK_INQUIRY #define CMD_DISK_READY CMD0H_DISK_READY#define CMD_DISK_R_SENSE CMD0H_DISK_R_SENSE#define CMD_RD_DISK_SECCMD0H_RD_DISK_SEC#define CMD_WR_DISK_SECCMD0H_WR_DISK_SEC#define CMD_DISK_MAX_LUNCMD0H_DISK_MAX_LUN#endif/****************************************************** ***************************************************** *********** *//* 并口方式, 状态端口(读命令端口)的位定义 */#ifndef PARA_STATE_INTB#define PARA_STATE_INTB 0x80/* 并口方式状态端口的位7: 中断标志,低有效*/#define PARA_STATE_BUSY 0x10/* 并口方式状态端口的位4: 忙标志,高有效 */ #endif/****************************************************** ***************************************************** *********** *//* 串口方式, 操作命令前的引导同步码 */#ifndef SER_CMD_TIMEOUT#define SER_CMD_TIMEOUT 32/* 串口命令超时时间, 单位为mS, 同步码之间及同步码与命令码之间的间隔应该尽量短, 超时后的处理方式为丢弃 */#define SER_SYNC_CODE1 0x57/* 启动操作的第1个串口同步码 */#define SER_SYNC_CODE2 0xAB/* 启动操作的第2个串口同步码 */#endif/****************************************************** ***************************************************** *********** *//* 操作状态 */#ifndef CMD_RET_SUCCESS#define CMD_RET_SUCCESS 0x51/* 命令操作成功 */#define CMD_RET_ABORT 0x5F/* 命令操作失败 */#endif/****************************************************** ***************************************************** *********** *//* USB中断状态 */#ifndef USB_INT_EP0_SETUP/* 以下状态代码为特殊事件中断, 如果通过CMD20_CHK_SUSPEND启用USB总线挂起检查, 那么必须处理USB总线挂起和睡眠唤醒的中断状态 */ #define USB_INT_USB_SUSPEND 0x05/* USB总线挂起事件 */#define USB_INT_WAKE_UP 0x06/* 从睡眠中被唤醒事件 *//* 以下状态代码0XH用于USB设备方式 *//* 内置固件模式下只需要处理: USB_INT_EP1_OUT,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总线复位 */#endif/* 以下状态代码2XH3XH用于USB主机方式的通讯失败代码 *//* 位7位6为00 *//* 位5为1 *//* 位4指示当前接收的数据包是否同步 *//* 位3位0指示导致通讯失败时USB设备的应答: 0010=ACK, 1010=NAK, 1110=STALL, 0011=DATA0, 1011=DATA1, XX00=超时 *//* USB_INT_RET_ACK 0x001X0010B *//* 错误:对于IN事务返回ACK *//* USB_INT_RET_NAK 0x001X1010B *//* 错误:返回NAK *//* USB_INT_RET_STALL 0x001X1110B */ /* 错误:返回STALL *//* USB_INT_RET_DATA0 0x001X0011B */ /* 错误:对于OUT/SETUP事务返回DATA0 *//* USB_INT_RET_DATA1 0x001X1011B */ /* 错误:对于OUT/SETUP事务返回DATA1 *//* USB_INT_RET_TOUT 0x001XXX00B *//* 错误:返回超时 *//* USB_INT_RET_TOGX 0x0010X011B *//* 错误:对于IN事务返回数据不同步 *//* USB_INT_RET_PID 0x001XXXXXB *//* 错误:未定义 *//* 以下状态代码1XH用于USB主机方式的操作状态代码 */#ifndef USB_INT_SUCCESS#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_USB_READY 0x18/* USB设备已经被初始化(已经分配USB地址) */#define USB_INT_DISK_READ 0x1D/* USB存储器请求数据读出 */#define USB_INT_DISK_WRITE 0x1E/* USB存储器请求数据写入 */#define USB_INT_DISK_ERR 0x1F /* USB存储器操作失败 */#endif/* 以下状态代码用于主机文件模式下的文件系统错误码 */#ifndef ERR_DISK_DISCON#define ERR_DISK_DISCON 0x82/* 磁盘尚未连接,可能磁盘已经断开 */#define ERR_LARGE_SECTOR 0x84/* 磁盘的扇区太大,只支持每扇区512字节 */ #define ERR_TYPE_ERROR 0x92/* 磁盘分区类型不支持,只支持FAT12/FAT16/BigDOS/FAT32,需要由磁盘管理工具重新分区 */#define ERR_BPB_ERROR 0xA1/* 磁盘尚未格式化,或者参数错误,需要由WINDOWS采用默认参数重新格式化 */#define ERR_DISK_FULL 0xB1/* 磁盘文件太满,剩余空间太少或者已经没有,需要磁盘整理 */#define ERR_FDT_OVER 0xB2/* 目录(文件夹)内文件太多,没有空闲的目录项,FAT12/FAT16根目录下的文件数应该少于512个,需要磁盘整理 */#define ERR_FILE_CLOSE 0xB4/* 文件已经关闭,如果需要使用,应该重新打开文件 */#define ERR_OPEN_DIR 0x41/* 指定路径的目录(文件夹)被打开 */#define ERR_MISS_FILE 0x42 /* 指定路径的文件没有找到,可能是文件名称错误 */#define ERR_FOUND_NAME 0x43/* 搜索到相匹配的文件名,或者是要求打开目录(文件夹)而实际结果却打开了文件 *//* 以下文件系统错误码用于文件系统子程序 */#define ERR_MISS_DIR 0xB3 /* 指定路径的某个子目录(文件夹)没有找到,可能是目录名称错误 */#define ERR_LONG_BUF_OVER 0x48/* 长文件缓冲区溢出 */#define ERR_LONG_NAME_ERR 0x49/* 短文件名没有对应的长文件名或者长文件名错误 */#define ERR_NAME_EXIST 0x4A/* 同名的短文件已经存在,建议重新生成另外一个短文件名 */#endif/****************************************************** ***************************************************** *********** *//* 以下状态代码用于主机文件模式下的磁盘及文件状态, VAR_DISK_STATUS */#ifndef DEF_DISK_UNKNOWN#define DEF_DISK_UNKNOWN 0x00/* 尚未初始化,未知状态 */#define DEF_DISK_DISCONN 0x01/* 磁盘没有连接或者已经断开 */#define DEF_DISK_CONNECT 0x02/* 磁盘已经连接,但是尚未初始化或者无法识别该磁盘 */#define DEF_DISK_MOUNTED 0x03/* 磁盘已经初始化成功,但是尚未分析文件系统或者文件系统不支持 */#define DEF_DISK_READY 0x10/* 已经分析磁盘的文件系统并且能够支持 */ #define DEF_DISK_OPEN_ROOT 0x12/* 已经打开根目录,使用后必须关闭,注意FAT12/FAT16根目录是固定长度 */#define DEF_DISK_OPEN_DIR 0x13/* 已经打开子目录(文件夹) */#define DEF_DISK_OPEN_FILE 0x14/* 已经打开文件 */#endif/****************************************************** ***************************************************** *********** *//* 文件系统常用定义 */#ifndef DEF_SECTOR_SIZE#define DEF_SECTOR_SIZE 512/* U盘或者SD卡默认的物理扇区的大小*/#endif#ifndef DEF_WILDCARD_CHAR#define DEF_WILDCARD_CHAR 0x2A /* 路径名的通配符 '*' */#define DEF_SEPAR_CHAR1 0x5C /* 路径名的分隔符 '\' */#define DEF_SEPAR_CHAR2 0x2F /* 路径名的分隔符 '/' */#define DEF_FILE_YEAR/* 默认文件日期: */#define DEF_FILE_MONTH 1/* 默认文件日期: 1月 */#define DEF_FILE_DATE 1/* 默认文件日期: 1日 */#endif#ifndef ATTR_DIRECTORY/* FAT数据区中文件目录信息 */typedef struct _FAT_DIR_INFO {UINT8 DIR_Name[11];/* 00H,文件名,共11字节,不足处填空格 */UINT8 DIR_Attr;/* 0BH,文件属性,参考后面的说明 */UINT8 DIR_NTRes;/* 0CH */UINT8 DIR_CrtTimeTenth;/* 0DH,文件创建的时间,以0.1秒单位计数 */UINT16 DIR_CrtTime;/* 0EH,文件创建的时间 */UINT16 DIR_CrtDate;/* 10H,文件创建的日期 */UINT16 DIR_LstAccDate;/* 12H,最近一次存取操作的日期 */UINT16 DIR_FstClusHI;/* 14H */UINT16 DIR_WrtTime;/* 16H,文件修改时间,参考前面的宏MAKE_FILE_TIME */UINT16 DIR_WrtDate;/* 18H,文件修改日期,参考前面的宏MAKE_FILE_DATE */UINT16 DIR_FstClusLO;/* 1AH */UINT32 DIR_FileSize;/* 1CH,文件长度 */} FAT_DIR_INFO, *P_FAT_DIR_INFO;/* 20H *//* 文件属性 */#define ATTR_READ_ONLY 0x01 /* 文件为只读属性 */#define ATTR_HIDDEN 0x02 /* 文件为隐含属性 */#define ATTR_SYSTEM 0x04 /* 文件为系统属性 */#define ATTR_VOLUME_ID 0x08 /* 卷标 */#define ATTR_DIRECTORY 0x10 /* 子目录(文件夹) */#define ATTR_ARCHIVE 0x20 /* 文件为存档属性 */#define ATTR_LONG_NAME( ATTR_READ_ONLY | ATTR_HIDDEN |ATTR_SYSTEM | ATTR_VOLUME_ID ) /* 长文件名属性 */#define ATTR_LONG_NAME_MASK( ATTR_LONG_NAME | ATTR_DIRECTORY | ATTR_ARCHIVE )/* 文件属性 UINT8 *//* bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 *//* 只隐系卷目存未定义 *//* 读藏统标录档 *//* 文件时间 UINT16 *//* Time = (Hour<<11) + (Minute<<5) + (Second>>1) */#define MAKE_FILE_TIME( h, m, s ) ( (h<<11) + (m<<5) + (s>>1) ) /* 生成指定时分秒的文件时间数据 *//* 文件日期 UINT16 *//* Date = ((Year1980)<<9) + (Month<<5) + Day */#define MAKE_FILE_DATE( y, m, d ) ( ((y1980)<<9) + (m<<5) + d ) /* 生成指定年月日的文件日期数据*/#define LONE_NAME_MAX_CHAR (255*2) /* 长文件名最多字符数/字节数 */#define LONG_NAME_PER_DIR (13*2)/* 长文件名在每个文件目录信息结构中的字符数/字节数 */#endif/****************************************************** ***************************************************** *********** *//* SCSI命令和数据输入输出结构 */#ifndef SPC_CMD_INQUIRY/* SCSI命令码 */#define SPC_CMD_INQUIRY 0x12#define SPC_CMD_READ_CAPACITY 0x25#define SPC_CMD_READ10 0x28#define SPC_CMD_WRITE10 0x2A#define SPC_CMD_TEST_READY 0x00#define SPC_CMD_REQUEST_SENSE 0x03#define SPC_CMD_MODESENSE6 0x1A。
单片机读写U盘
51单片机读写U盘电子工程系170710班姓名:陈高武学号:17071031 (一)引言当今是信息的时代,U盘作为一种信息的载体以卓越的便携性、优越的性价比和可靠的工作受到了广大消费者的一致认可和喜爱。
而传统对U盘的读写只能通过电脑,给人们带来了很多不便。
(二)摘要基于USB 总线接口芯片CH375读写U盘有串行和并行两种接线方式,串行接线简单但速度慢,所以本系统采用并行方式,具有高速数据传送的优点。
本系统支持FAT12、FAT16和FAT32格式,满足一般人们的要求。
本系统可以在U 盘里新建文件夹,查看修改文件属性,并可以删除指定的文件夹,也可以对指定的文件读出来,在LCD12864液晶屏上显示,文件格式为.TXT,支持汉英文混合显示。
(三)主要器件简介1.USB总线的通用接口芯片CH375CH375 是一个USB总线的通用接口芯片,支持USB-HOST主机方式和USB-DEVICE/SLAVE 设备方式。
在本地端,CH375 具有8 位数据总线和读、写、片选控制线以及中断输出,可以方便地挂接到单片机/DSP/MCU/MPU等控制器的系统总线上。
在USB 主机方式下,CH375还提供了串行通讯方式,通过串行输入、串行输出和中断输出与单片机/DSP/MCU/MPU 等相连接。
CH375 的USB主机方式支持常用的USB全速设备,外部单片机可以通过CH375按照相应的USB 协议与USB 设备通讯。
CH375 还内置了处理Mass-Storage 海量存储设备的专用通讯协议的固件,外部单片机可以直接以扇区为基本单位读写常用的USB 存储设备(包括USB 硬盘/USB 闪存盘/U 盘)。
引脚图:2. 液晶模块JM12864M汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
主要技术参数和显示特性:电源:VDD 3.3V~+5V(内置升压电路,无需负压);显示内容:128列×64行显示颜色:黄绿显示角度:6:00钟直视LCD类型:STN与MCU接口:8位或4位并行/3位串行配置LED背光多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等二、外形尺寸外观尺寸:93×70×12.5mm 视域尺寸:73×39mm二、模块引脚说明17128X64HZ 引脚说明引脚号引脚名称方向功能说明1 VSS - 模块的电源地2 VDD +5V 模块的电源正端3 V0 - LCD驱动电压输入端4 RS(CS) H/L 并行的指令/数据选择信号;串行的片选信号5 R/W(SID) H/L 并行的读写选择信号;串行的数据口6 E(CLK) H/L 并行的使能信号;串行的同步时钟7 DB0 H/L 数据08 DB1 H/L 数据19 DB2 H/L 数据210 DB3 H/L 数据311 DB4 H/L 数据412 DB5 H/L 数据513 DB6 H/L 数据614 DB7 H/L 数据715 PSB H/L 并/串行接口选择:H-并行;L-串行16 NC 空脚17 RESET H/L 复位低电平有效18 NC 空脚19 LED_A (LED+5V)背光源正极20 LED_K (LED-OV)背光源负极(五)小结本系统用途比较广,可以构成录音系统、摄像系统、信息传送系统等等。
单片机读写U盘方案
板卡上资源:
单片机:采用的是完全兼容51的单片机w78e54.
USB-HOST接口芯片:CYPRESS的SL811
高速SRAM存储器:用于数据缓冲。
RS232标准3线制串行接口,可以连接到PC机进行相关功能的测试。
套件相关问题:
套件硬件采用的结构为单片机+USB-HOST接口芯片,其中单片机采用的是最为通用的51系列单片机W78E54,也可以使用其他型号的51系列单片机,如ATMEL,PHILIPS等公司的产品,从而很容易就可以集成到您的系统中。USB接口芯片采用的是CYPRESS公司的USB-HOST接口芯片SL811,该芯片特点支持USB1.1协议;价格低(低于50元);性能突出,可靠性高,可以理想地用于多种外设。
本套件已经可以实现对U盘地读写操作,主要功能如下:
1,检测U盘地状态(如接入,拔出)
2,创建文件和目录
3,打开一个已经创建地文件和目录
4,从文件中读取指定长度和指定位置的数据
5,写数据到指定文件的指定地址
6,列举目录下的文件和目录
7,删除文件和目录
8,查询U盘容量
套件板卡跟用户CPU的接口为标准RS232三线接口,用户CPU可以按照我们提供的命令格式通过RS232接口ห้องสมุดไป่ตู้USB-HOST模块发送读写和控制命令,USB-HOST模块对命令进行解释并对U盘进行相应的读写操作,从而实现用户CPU对U盘的操作。
由于我们的套件完全开放硬件电路图和所有的软件源码,从而使您可以自由修改USB-HOST模块的接口方式和命令格式,如可以改成并行接口,从而很容易就可以集成到您自己的系统中。
单片机读写U盘方案__SL811开发套件
详细信息请访问我们的网站:
51单片机怎么用usb烧写程序
51 单片机怎么用usb 烧写程序
单片机怎样用usb 烧写程序
首先,需要安装keil 软件和STC_ISP 程序下载软件。
先对你想要实现对单片机的功能用keil 编程,然后用STC_ISP 下载软件下载到单片机上,最后打开给单片机提供电源就可以观察单片机开发板或是自己搭建的板子上的现象了。
通过不断修改程序,下载程序,最终获得自己在实验板上想要的结果。
这样就可以了。
实验板与PC 机的连接:一般对现成购买的开发板来说,会有一个USB 接口提供5v 电源、提供通信或另一个USB 用来下载接口驱动程序,同时有RS232 串口,实现MAX232 电平与单片机TTL 电平之间转换,用来进行通信下载程序和数据;;对自己搭建的电路板来说,仍会有MAX232 芯片和RS232 串口用来实现程序的烧写,实现对单片机写入数据和程序的下载。
用的是RS232 串口实现的程序烧写!
若要用USB 来烧写,需要一个相应的ISP 下载软件和硬件烧写器,一般这种烧写器价格不菲。
用的是USB 口实现烧写程序!。
ch375读写u盘C51示例源程序
ch375读写u盘C51示例源程序#include "datatype.h"#include "console.h"#include "44b0x.h"#include <string.h>/* 以下定义的详细说明请看CH375HF9.H文件*/#define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */#define LIB_CFG_INT_EN 1 /* CH375的INT#引脚连接方式,接s3c44b0x外部中断2引脚" *//* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲*/#define FILE_DATA_BUF_LEN 0x2000 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度*/#include "CH375HF9.H"#define CH375Cmd *(volatile U8 *)(0x4000001) /*总线方式*/#define CH375Dat *(volatile U8 *)(0x4000000)extern U32 MCLK;/* CH375 主机文件系统接口*//* 支持: FAT12/FA T16/F AT32 *//* ARM单片机C语言的U盘文件读写示例程序*//* 该程序将U盘中的/C51/CH375HFT.C文件中的小写字母转成大写字母后, 写到新建的文件NEWFILE.TXT中,如果找不到原文件CH375HFT.C, 那么该程序将显示C51子目录下所有以CH375开头的文件名, 并新建NEWFILE.TXT文件并写入提示信息,如果找不到C51子目录, 那么该程序将显示根目录下的所有文件名, 并新建NEWFILE.TXT文件并写入提示信息*//* CH375的INT#引脚采用查询方式处理, 数据复制方式为"内部复制", 本程序适用于s3c44b0x单片机, 串口0输出监控信息,57600bps *//* ENDIAN = "little" */void mDelay1_2uS( ) /* 至少延时1.2uS,根据单片机主频调整*/{UINT32 i;for ( i = 30; i != 0; i -- );}void __irq CH375Interrupt( void ) /* CH375中断服务程序,由CH375的INT#的低电平或者下降沿触发单片机中断*/{rEXTINTPND=0xf; //clear EXTINTPND reg.rI_ISPC=BIT_EINT2; //clear pending_bitxWriteCH375Cmd( CMD_GET_STA TUS ); /* 获取中断状态并取消中断请求*/CH375IntStatus = xReadCH375Data( ); /* 获取中断状态*/if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskS tatus = DISK_DISCONNECT; /* 检测到USB 设备断开事件*/else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskS tatus = DISK_CONNECT; /* 检测到USB设备连接事件*/}extern void CH375Interrupt( void );void CH375_PORT_INIT( ) /*初始化*/{rINTCON=0x5;rINTMOD=0x0; //All=IRQ moderPDA TG=0xff;rPCONG=0xffff;rPUPG=0x0; //should be enabledrEXTINT=0x0;pISR_EINT2 = (unsigned)CH375Interrupt;rINTMSK=~(BIT_GLOBAL|BIT_EINT2); //start INT}void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令*/ {mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */CH375Cmd = mCmd;mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时2uS */}void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据*/ {CH375Dat = mDatamDelay1_2uS( ); /* 至少延时1.2uS */}UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据*/{mDelay1_2uS( ); /* 至少延时1.2uS */mData = (UINT8)CH375Dat;return( mData );}/* 延时指定毫秒时间,根据单片机主频调整,不精确*/void mDelaymS( UINT32 ms ){UINT32 i;while ( ms -- ) for ( i = 25000; i != 0; i -- );}/* 检查操作状态,如果错误则显示错误代码并停机*/void mStopIfError( UINT8 iError ){if ( iError == ERR_SUCCESS ) return; /* 操作成功*/printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误*/while ( 1 ) {mDelaymS( 100 );}}/* 为printf和getkey输入输出初始化串口*/void mInitSTDIO( ){}U16 SERIAL_BAUD = 57600;char table_begin[] = "/***************************************************************/\n";void ShowSysClock(int argc, char *argv[]){printf("S ystem is running @%dHz\n", MCLK);}int Main(void){UINT8 i, c, SecCount;UINT16 NewSize, count; /* 因为RAM容量有限,所以NewSize限制为16位,实际上如果文件较大,应该分几次读写并且将NewSize改为UINT32以便累计*/UINT8 *pCodeStr;ChangePllValue(24, 6, 1);Port_Init();console_init(57600);next_line();puts(table_begin);puts("Usb for S3C44B0x\n");ShowSysClock(0, NULL);printf("Serial Baud rate is %d\n", SERIAL_BAUD);next_line();puts(table_begin);puts("System Initialized.\n");mDelaymS( 50 ); /* 延时100毫秒*/printf( "测试CH375是否正常\n" );mDelaymS(60 ); /* 延时50ms */printf("\nCH375_Init完成!!");i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */mStopIfError( i );/* 其它电路初始化*/CH375_PORT_INIT( );while ( 1 ) {printf( "\n请插入U盘!\n" );while ( CH375DiskStatus != DISK_CONNECT ) /* 查询CH375中断并更新中断状态,等待U盘插入*/ mDelaymS( 10 );/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作*/for ( i = 0; i < 10; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略*/printf( "Ready ?\n" );if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好*/}/* 查询磁盘物理容量*/printf( "DiskSize\n" );i = CH375DiskSize( );printf( "TotalSize = %d MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) );/* 读取原文件*/printf( "Open\n" );strcpy( (char *)mCmdParam.Open.mPathName, "\\C51\\CH375HFT.C" ); /* 文件名,该文件在C51子目录下*/ i = CH375FileOpen( ); /* 打开文件*/if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { /* 没有找到文件*//* 列出文件*/if ( i == ERR_MISS_DIR ) pCodeStr = (UINT8 *)"\\*"; /* C51子目录不存在则列出根目录下的文件*/else pCodeStr = (UINT8 *)"\\C51\\CH375*"; /* CH375HFT.C文件不存在则列出\C51子目录下的以CH375开头的文件*/printf( "List file %s\n", pCodeStr );for ( c = 0; c < 255; c ++ ) { /* 最多搜索前255个文件*/strcpy( (char *)mCmdParam.Open.mPathName, (char *)pCodeStr ); /* 搜索文件名,*为通配符,适用于所有文件或者子目录*/i = strlen( (char const *)mCmdParam.Open.mPathName ); /* 计算文件名长度,以处理文件名结束符*/ mCmdParam.Open.mPathName[ i ] = c; /* 根据字符串长度将结束符替换为搜索的序号,从0到255 */i = CH375FileOpen( ); /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开*/if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名*/if ( i == ERR_FOUND_NAME ) { /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中*/printf( " match file %03d#: %s\n", (unsigned int)c, mCmdParam.Open.mPathName ); /* 显示序号和搜索到的匹配文件名或者子目录名*/continue; /* 继续搜索下一个匹配的文件名,下次搜索时序号会加1 */}else { /* 出错*/mStopIfError( i );break;}}pCodeStr = (UINT8 *)"找不到/C51/CH375HFT.C文件\xd\n";for ( i = 0; i != 255; i ++ ) {if ( ( FILE_DATA_BUF = *pCodeStr ) == 0 ) break;pCodeStr++;}NewSize = i; /* 新文件的长度*/SecCount = 1; /* (NewSize+511)/512, 计算文件的扇区数,因为读写是以扇区为单位的*/}else { /* 找到文件或者出错*/mStopIfError( i );/* printf( "Query\n" );i = CH375FileQuery( ); 查询当前文件的信息printf( "Read\n" );if ( CH375vFileSize > FILE_DATA_BUF_LEN ) { /* 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节*/SecCount = FILE_DATA_BUF_LEN / 512; /* 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节*/NewSize = FILE_DATA_BUF_LEN; /* 由于RAM有限所以限制长度*/}else { /* 如果原文件较小,那么使用原长度*/SecCount = ( CH375vFileSize + 511 ) >> 9; /* (CH375vFileSize+511)/512, 计算文件的扇区数,因为读写是以扇区为单位的,先加511是为了读出文件尾部不足1个扇区的部分*/NewSize = (UINT16)CH375vFileSize; /* 原文件的长度*/}printf( "Size=%ld, Len=%d, Sec=%d\n", CH375vFileSize, NewSize, (UINT16)SecCount );mCmdParam.Read.mSectorCount = SecCount; /* 读取全部数据,如果超过60个扇区则只读取60个扇区*/ /* current_buffer = & FILE_DATA_BUF[0]; 如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址*/CH375vFileSize += 511; /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头*/i = CH375FileRead( ); /* 从文件读取数据*/CH375vFileSize -= 511; /* 恢复原文件长度*/mStopIfError( i );/*如果文件比较大,一次读不完,可以再调用CH375FileRead继续读取,文件指针自动向后移动while ( 1 ) {c = 32; 每次读取32个扇区mCmdParam.Read.mSectorCount = c; 指定读取的扇区数CH375FileRead(); 读完后文件指针自动后移处理数据if ( mCmdParam.Read.mSectorCount < c ) break; 实际读出的扇区数较小则说明文件已经结束}如果希望从指定位置开始读写,可以移动文件指针mCmdParam.Locate.mSectorOffset = 3; 跳过文件的前3个扇区开始读写i = CH375FileLocate( );mCmdParam.Read.mSectorCount = 10;CH375FileRead(); 直接读取从文件的第(512*3)个字节开始的数据,前3个扇区被跳过如果希望将新数据添加到原文件的尾部,可以移动文件指针i = CH375FileOpen( );mCmdParam.Locate.mSectorOffset = 0xffffffff; 移到文件的尾部,以扇区为单位,如果原文件是3字节,则从512字节开始添加i = CH375FileLocate( );mCmdParam.Write.mSectorCount = 10;CH375FileWrite(); 在原文件的后面添加数据*/printf( "Close\n" );i = CH375FileClose( ); /* 关闭文件*/mStopIfError( i );i = FILE_DATA_BUF[100];FILE_DATA_BUF[100] = 0; /* 置字符串结束标志,最多显示500个字符*/printf( "Line 1: %s\n", FILE_DATA_BUF );FILE_DATA_BUF[100] = i; /* 恢复原字符*/for ( count=0; count < NewSize; count ++ ) { /* 将文件中的小写字符转换为大写*/c = FILE_DATA_BUF[ count ];if ( c >= 'a' && c <= 'z' ) FILE_DATA_BUF[ count ] = c - ( 'a' - 'A' );}}#ifdef EN_DISK_WRITE /* 子程序库支持写操作*//* 产生新文件*/printf( "Create\n" );strcpy( (char *)mCmdParam.Create.mPathName, "\\NEWFILE.TXT" ); /* 新文件名,在根目录下*/i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建*/mStopIfError( i );printf( "Write\n" );mCmdParam.Write.mSectorCount = SecCount; /* 写入所有扇区的数据*//* current_buffer = & FILE_DATA_BUF[0]; 如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址*/i = CH375FileWrite( ); /* 向文件写入数据*/mStopIfError( i );printf( "Modify\n" );mCmdParam.Modify.mFileAttr = 0xff; /* 输入参数: 新的文件属性,为0FFH则不修改*/mCmdParam.Modify.mFileTime = 0xffff; /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间*/mCmdParam.Modify.mFileDate = MAKE_FILE_DA TE( 2004, 5, 18 ); /* 输入参数: 新的文件日期: 2004.05.18 */mCmdParam.Modify.mFileSize = NewSize; /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 */i = CH375FileModify( ); /* 修改当前文件的信息,修改日期和长度*/mStopIfError( i );printf( "Close\n" );mCmdParam.Close.mUpdateLen = 0; /* 不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数*/i = CH375FileClose( );mStopIfError( i );/* 删除某文件*//* printf( "Erase\n" );strcpy( (char *)mCmdParam.Create.mPathName, "\\OLD" ); 将被删除的文件名,在根目录下i = CH375FileErase( ); 删除文件并关闭if ( i != ERR_SUCCESS ) printf( "Error: %02X\n", (UINT16)i ); 显示错误*//* 查询磁盘信息*/printf( "Disk\n" );i = CH375DiskQuery( );mStopIfError( i );printf( "Fat=%d, Total=%ld, Free=%ld\n", (UINT16)mCmdParam.Query.mDiskFat, mCmdParam.Query.mTotalSector, mCmdParam.Query.mFreeSector );#endifmDelaymS(200 );printf( "请拔出U盘!\n" );while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘拔出*/mDelaymS( 200 );}}。
基于单片机的USB文件读写
子
测Leabharlann 量技术 第 3 8卷 第 8期 2 0 1 5 年 8月
ELECTR0NI C M EA S UREM ENT TECH N0LOGY
基 于 单 片 机 的 US B文 件 读 写
储 甜
( 上海大学 摘
颜 锦 奎
上海 2 0 0 4 4 4 )
要 : 目前 在 数 据 采 集 设 备 和 仪 器 仪 表 等 嵌 入 式 系 统 中 , 数 据 交 换 多 采 用 串行 口或 以太 网等 方 式 的现 状 , 但 这 些 方
F L AS H 技 术 的 US B 移 动 存 储 技 术 的 发 展 为 上 述 领 域 中 的数据存 储 和交换 提供 了新 的方 式 。U 盘 以其容 量 大 、 体
C H3 7 6是文 件管 理控 制芯片 , 用 于 单 片机 系统 读 写 U 盘或者 S D 卡 中 的 文 件 。C H3 7 6支 持 US B 设 备 方 式
1 引
言
线 通 用 接 口芯 片 CH3 7 6和 1 6位 单 片 机 S T C1 5 F 2 K6 0 S 2来
实现 US B接 口的设计方 法 , 并 用于 智 能仪 器 仪表 和 P C之 间 的通信 。
1 . 2 C H3 7 6芯 片 简 介
在数 据采 集设 备和仪 器 仪 表 等嵌 入 式 系 统 中 , 数 据交 换 多采用 串行 口 ( RS 2 3 2 、 RS 4 8 5 、 C AN 总线 或 以太 网 等方 式, 但 这些 方式 至少 需 要 一 台 一直 工 作 着 的 P C和 串 口设 备, 需要 布 线 施 工 、 成 本 高 且 不 具 有 移 动 性 。基 于 US B —
单片机实验报告,存储器读写,IO端口操作,定时中断,外部中断等
实验一存储器读写实验目的:1、掌握寄存器、存储器读写等汇编指令;2、掌握编程软件编辑、编译、调试等基本操作。
实验内容:1、将下面的汇编程序输入到W A VE集成开发软件中ORG 0000H ;复位入口SJMP START ;无条件跳转至STARTORG 0030H ;系统初始化START:MOV R0,#07H ;将直接数存入R0寄存器MOV R1,#0FEH ;将直接数FE存入R1寄存器ADD A,R0 ;将R0寄存器中的内容与A累加器中的内容相加ADDC A,R1 ;将R1寄存器中的内容与A累加器中的内容相加MOV DPTR,#2000H ;将直接数2000H存入指针DPTRMOVX @DPTR,A ;将A累加器中内容存入以DPTR为地址单元中MOVX A,@DPTR ;将以DPTR为地址单元中内容存入A累加器中INC A ;A累加器所在地址自动加一MOV P1,A ;将A累加器中内容存入P1中END ;结束2、选择菜单“仿真器”→“仿真器设置”,按下图所示完成软件初始设置。
3、选择菜单“项目”下“编译”,编译通过后,选择“单步运行”,观察记录寄存器(R0、R1)、累加器(A)、程序状态字(PSW)、外部存储器(2000H单元)、I/O端口(P1)的数据变化。
思考题:试用汇编语言编写一段程序,判断R1、R2、R3三个寄存器中存放的数据大小,并按从大到小的顺序重新存放到R1、R2、R3三个寄存器中。
ORG 0000H ;复位入口SJMP START ;无条件跳转至STARTORG 0030H ;系统初始化START:MOV R1,#01H ;将直接数01H存入R1寄存器MOV R2,#04H ;将直接数04H存入R2寄存器MOV R3,#09H ;将直接数09H存入R3寄存器CLR C ;将C累加器清零MOV A,R1 ;将R1寄存器中的内容存入A累加器中SUBB A,R2 ;两数比较JNC LOOP0 ;无借位跳转(R1大则转LOOP0)MOV A,R1 ;将R1寄存器中的内容存入A累加器中XCH A,R2 ;交换R2寄存器与A累加器中的内容MOV R1,A ;将A累加器中的内容存入R1寄存器中(交换R1和R2内容)CLR C ;将C累加器清零LOOP0: MOV A,R1 ;将R1寄存器中的内容存入A累加器中SUBB A,R3 ;两数比较JNC LOOP1 ;无借位跳转(R1大则转LOOP1)MOV A,R1 ;将R1寄存器中的内容存入A累加器中XCH A,R3 ;交换R3寄存器与A累加器中的内容MOV R1,A ;将A累加器中的内容存入R1寄存器中(交换R1和R3内容)CLR C ;将C累加器清零LOOP1: MOV A,R2 ;将R2寄存器中的内容存入A累加器中SUBB A,R3 ;两数比较JNC LOOP2 ;无借位跳转(R2大则转LOOP2)MOV A,R2 ;将R2寄存器中的内容存入A累加器中XCH A,R3 ;交换R3寄存器与A累加器中的内容MOV R2,A ;将A累加器中的内容存入R1寄存器中(交换R2和R3内容)LOOP2: MOV R2,A ; LOOP1:将A累加器中的内容存入R2寄存器中RET ;结束心得体会:本次实验主要学习了WAVE软件基本操作运用,并进一步深入学习汇编语言,并用汇编语言进行程序编写,解决一些实际问题.实验二I/O端口操作实验目的:1、掌握I/O端口读写等汇编指令;2、掌握仿真软件PROTEUS硬件电路设计及仿真、调试等基本操作方法。
单片机读写u盘
单片机不需要考虑文件系统,只需要了解文件名、文件长度等基础知识。
一个U 盘中可以有多个文件,每个文件都是一组数据的集合,以文件名区分和识别。
文件长度是指文件中有效数据的长度,而实际占用的磁盘空间通常大于或者等于文件长度,实际文件数据的存放可能不是连续的,而是通过一组“指针”链接的多个块(也就是分配单元或簇),从而能够根据需要随时增大文件长度以容纳更多数据。
目录是为了便于分类管理,管理者可以人为指定将多个文件归档在一起,例如2004 年的文件归到一个目录中。
使用U 盘文件级子程序库,单片机系统需要具备以下硬件资源:不少于4KB 到8KB的程序空间,不少于600 字节的随机存储器RAM。
对于MCS-51 单片机,600 字节的RAM 包括不少于75 字节的内部RAM 和530 字节的外部RAM,不同的子程序库对内部RAM 的占用稍有不同。
为了支持所有U 盘包括扇区大于512 字节的大容量U 盘,子程序库可能需要2.2K 甚至4.3K 字节的随机存储器RAM。
目前的U 盘文件级子程序库只支持第一个逻辑盘,支持8+3 格式的大写字母的短文件名,支持中文文件名,通过外加程序可以支持小写字母及长文件名。
AVR 单片机的增强版子程序库,文件名是CH375HFB.A和libCH375HFD.A 以及CH375HFJ.R90,分别支持ICC、WinAVR-GCC、IAR 编译环境。
子目录是FILELIBB 和FILELIBD 以及FILELIBJ,提供示例程序。
使用U 盘文件级子程序库,单片机系统需要具有不少于(CH375vSectorSize+100)个字节的随机存储器RAM,其中CH375vSectorSize 个字节(通常是512 字节)用于磁盘数据缓冲区,除此之外,根据操作方式的不同,可能还需要文件数据缓冲区,通常情况下,RAM 越多读写效率越高。
为了使用子程序库,应该在源程序中包含子程序库的头文件CH375HF?.H,该头文件可以为CH375子程序库分配必要的I/O 及内存资源,并产生必要的与硬件有关的目标代码,如果该文件是被工程项目的多个源程序包含作为头文件,那么应该只允许一个头文件分配资源和产生代码,除此之外的头文件应该被事先定义CH375HF_NO_CODE 常量,从而禁止该头文件产生重复的目标代码。
单片机通过CH375读写U盘文件的问题解答
单片机通过CH375读写U盘文件的问题解答单片机通过CH375读写U盘文件的问题解答(转自官网)(发布:2009-9-17 18:07 | 作者:zxgsdu | 来源:本站| 查看:86次| 字号: 小中大* 需要设计参考资料(光盘资料可以参考FILELIST.TXT文档,网上资料更新)USB主机方式的应用可以参考CH375的资料,与计算机连接的USB设备方式(或自己做U盘)可以参考CH372的资料。
如果是读写U盘并且用量较少或者是系统集成,关心快速入门并且简单易用,那么可以参考半成品U盘文件读写模块的说明CH375HM.ZIP;如果是做原始产品设计,关心成本,那么可以参考CH375评估板资料CH375EVT.ZIP,其中有单片机读写U盘的多个例子源程序和U盘文件级子程序库的API说明。
在设计USB-HOST电路和PCB之前,强烈建议参考CH375的USB电路及PCB设计注意事项README.PDF。
常规问题例如不工作/连接失败可以参考CH372的问题解答,关于USB传输速度可以参考评估板中的说明。
* 有关U盘文件的一些基础知识WINDOWS下U盘的文件系统主要有FAT12/FAT16/FAT32,我们的子程序库都能支持,使用角度感觉无区别。
单片机不需要考虑文件系统,只需要了解文件名、文件长度等基础知识。
一个U盘中可以有多个文件,每个文件都是一组数据的集合,以文件名区分和识别。
文件长度是指文件中有效数据的长度,而实际占用的磁盘空间通常大于或者等于文件长度,实际文件数据的存放可能不是连续的,而是通过一组“指针”链接的多个块(也就是分配单元或簇),从而能够根据需要随时增大文件长度以容纳更多数据。
目录是为了便于分类管理,管理者可以人为指定将多个文件归档在一起,例如2004年的文件归到一个目录中。
* 读写U盘中的文件对单片机有要求吗硬件上,单片机需要提供至少600字节的RAM,RAM多些可以提高速度,软件上可以采用我们的子程序库,但是产生的程序代码可能会有几K字节,也就是说单片机的程序空间必须能够放得在几K到十几K的代码。
单片机u盘读写模块_数据存储TXT_简单的程序说明
write_step = write_size - addr; } len = fs_write(f_p, buf + addr, write_step); u32 tell = fs_tell(f_p); s32 sync = 0;//fs_sync(f_p); file_printf("write_step:%d, addr:%d, tell:%d\n", write_step, addr, tell); if (len != write_step) {
2
V1
1.3 文件系统部分
3
V1
1.4 设备驱动部分
4
V1
芯片支持 FAT、FAT32 文件系统,其他文件系统都不支持。所以很轻易的读取设备的内容。这里我们支持 U 盘、TF 卡、 SPIFLASH 这三种设备。TF 卡和 U 盘最大支持 128G 的容量。当然兼容性是非常非常好的,基本所有的都支持。选择的 设备的时候,如果不需要很大的容量,可以选择 spiflash 作为存储设备。
备注: 1、这里不一定是 txt 文件,这个文件名后缀是可以随意写入的。可以是 bin,也可以是 mp3,更加可以是 csv 等等。 2、具体各种文件有什么特点,以及注意事项,可以网上搜搜。我们这里只是做的透明传输 3、如果没有指定文件名,那么生成的文件名是默认是“/001WRITE.txt” 4、如果觉得发指令开启写 TXT 模式比较麻烦,可以短路模块的芯片 13 脚到地,则上电进入自动写状态。当然文件名 会是我们默认设置的“/001WRITE.txt”。此时就直接进入透明传输了
file_printf("[%s,%d], err:%d\n", __func__, __LINE__, len); goto _end; } } fs_sync(f_p); f_size = fs_tell(f_p); FatReturnLen(f_size) ; printf("write file size %d\n", f_size); fs_close(f_p); return ; _end: file_close(); }
单片机的U盘读写模块的设计
唐山学院毕业设计设计题目:基于单片机的U盘读写模块的设计系别:班级:姓名:指导教师:2013年6月 6 日基于单片机的U盘读写模块的设计摘要介绍了一种USB总线的通用接口芯片CH375,并在此基础上提出了一种外部单片机读写U盘的基本方法及其硬件连接方法。
单片机只要在原硬件系统中增加1个CH375芯片就可以直接调用CH375提供的子程序库来直接读取U盘中的数据,从而实现了普通单片杌与U盘的通讯、方法简单、便于操作、综合成本比较低,具有较大的推广应用价值。
关键词:U盘;CH375;接口芯片;单片机RESEARCH ON IMAGE REGISTRATION TECHNOLOGY BASED ON MATLABAbstractA general purpose interface chip CH37 5 for USB is introduced in this paper.Based On which a new method of Using external single chip microcomputer to connect with the flash disk is given.Only add one CH375 chip to the single chip microcomputer s hardware system,the operator can use the program given by the CH375 to read the data from the flash disk and realize the communication between the single chip microcomputer and the flash disk.This method is very simple and can be operated easily.Key words: Powell; PSOUSB;CH375;interface chip;single chip microcomputer目录1 引言 (1)1.1 论文背景和意义 (1)1.2 图像配准技术研究现状 (2)2 图像配准综述 (4)2.1 图像配准理论 (4)2.2 图像配准一般步骤 (4)2.3 特征空间 (5)2.3.1 基于灰度统计信息的配准 (5)2.3.2 基于特征的配准方法 (7)2.4 搜索空间 ..................................................................... 错误!未定义书签。
单片机读写U盘闪盘超精简C源程序,不用子程序库
if ( Status == USB_INT_DISCONNECT ) return( Status ); /* USB设备断开 */
CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */
CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */
Status = mWaitInterrupt( ); /* 等待中断并获取状态 */
}
if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出现错误 */
CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 从USB存储器读数据块 */
CH375_WR_DAT_PORT( (UINT8)iLbaStart ); /* LBA的最低8位 */
CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 8 ) );
/* ********** 硬件USB接口层,无论如何这层省不掉,单片机总要与CH375接口吧 */
void mDelaymS( UINT8 delay ) {
UINT8 i, j, c;
for ( i = delay; i != 0; i -- ) {
for ( j = 200; j != 0; j -- ) c += 3;
这个程序可以支持WINDOWS按FAT16格式化的U盘,因为程序精简,所以只兼容超过50%以上的U盘品牌,如果换
成CH375Βιβλιοθήκη 芯片则兼容性可提高到85%,当然,如果使用公司的子程序库或者正式版本的C源程序兼容性更好。
(经典)基于单片机的U盘读写
基于单片机的U盘数据传输装置机电工程学院测控技术与仪器专业李朋飞摘要:随着单片机技术的发展,各种嵌入式系统的逐渐应用于工作现场的数据采集和控制之中。
USB总线技术的发展,使得数据传输和采集技术,变得简单,易携和方便使用。
基于USB总线技术的USB储存设备简称U盘,它具有支持热拔热插,储存量大,耐用,和轻巧方便的特点。
基于单片机技术的U盘数据采集是把单片机系统作为主机系统,再利用支持USB总线协议的U盘读写芯片或者模块来完成工业现场的数据采集或者传输。
这样,便可以把U盘的大容量存储,方便易用的功能从PC机系统扩展到单片机系统中,可以方便在室外进行大量数据的采集。
例如,可以将单片机系统中AD转换后采集到的数据,储存到U盘之中,以便于利用计算机对数据经行整理或分析。
本文主要介绍一种技术成熟U盘读写芯片CH375和以此芯片为核心的U盘读写模块,简单介绍了CH375芯片的构造和特点,以及U盘模块的应用特点。
再次,介绍了串口版U盘模块的应用,并设计了串口模块和单片机之间的通信的应用方式,并附有模块和单片机之间采用RS232电平进行通信的连接电路图。
同时,还简单的介绍了,U盘读写之中需要注意的几个协议等。
最后附录中的程序提供了一个能够实现单片机以字节的方式对U盘的读和写的程序。
关键词:单片机 U盘 USB2.0 U盘模块串口通信 RS232接口 CH375 电平一,引言半导体技术的发展带来计算机向微型化发展的革命,同时随着计算机技术的快速发展,USB (Universal Serial Bus)存储设备的使用已经非常普遍,USB 用于将适用USB 的外围设备(device)连接到主机(host),实现二者之间数据传输的外部总线结构;是一种快速、灵活的总线接口。
它最大的特点是易于使用,携带方便,主要是用在中速,低速的外设。
随着USB 规范的完善和成熟,USB 外设的种类不断丰富,应用领域也不断扩大。
在传统的应用中,主要是PC 扮演着主机的角色。
PB375 U盘读写汇编程序
PB375 U盘读写汇编程序性价比超高的U盘读写模块-PB375,兼容CH375读写操作1.功能●用于嵌入式系统/单片机读写U 盘、闪盘、闪存盘、USB 移动硬盘、USB 读卡器等。
●支持符合USB 相关规范基于Bulk-Only 传输协议的各种U 盘/闪存盘/外置硬盘。
●支持文件系统FAT12 和FAT16 及FAT32●文件操作功能:新建、删除、读写数据,打开关闭文件等。
● SPI接口,支持3.3V电平●兼容CH375模块的操作命令●单芯片解决方案,该模块只需要一个主控芯片外加少量的电容电阻便可,相对于51MCU+SL811/CH375的模块,无论模块尺寸还是成本都有着极大的优势。
●可以是模块提供,也可以是芯片提供(只需要简单的几个外围元件就可以了)具体参数可以下载数据手册或者联系销售人员基本不需要占用单片机系统的存储空间,最少只需要几个字节的RAM 和几百字节的代码。
下面就是一个很通用的台湾的单片机(可以是holtek 松翰义隆富晶等)用汇编操作PB375实现读写操作U盘的代码:USB_FAIL EQU 0AAHUSB_SUCC EQU 055HTRY_TIMES EQU 0FFHCMD_DiskReady EQU 071HCMD_FileCreate EQU 065HCMD_ByteWrite equ 07ChCMD_FileClose equ 067h//设置SPI 端口的输入输出spi_ini:nopcall i2c_delayb0bset spi_sdo_modb0bset spi_sck_modb0bset spi_cs_modb0bclr spi_sdi_modb0bset spi_cs ;not choseb0bset spi_sckb0bclr spi_sdob0bclr spi_sdiret/************************SPI发一个字节,同时读一个字节*************************/spi_send:nopclr epr_numclr spi_inb0bclr spi_sckspi_write_bit:b0bts0 epr_data_bjmp spi_write_hb0bclr spi_sdojmp spi_read_comspi_write_h:b0bset spi_sdospi_read_com:call i2c_delayb0bclr fcrlcm spi_inb0bts0 spi_sdiincms spi_inb0bclr fcb0bset spi_sckcall i2c_delayb0bclr spi_sck ;sck=0,data variable call i2c_delayrlcm epr_data ;prepare for nextincms epr_numnopb0bts1 epr_num_bjmp spi_write_bitcall i2c_delayret//发送命令spi_send_command:b0bclr spi_csb0mov rbank,#1 ; 写入命令码mov a,cmdb0mov epr_data,acall spi_sendb0mov rbank,#1 ;写入后续参数的长度mov a,lenb0mov rbank,#0b0mov epr_data,acall spi_sendb0mov rbank,#1 ;写入后续参数mov a,lenb0mov rbank,#0b0bts0 FZjmp send_len_over ;len=0 b0mov temp,ab0mov Y,#1b0mov Z,#sendbufsend_len_byte:b0mov a,@YZb0mov rbank,#0b0mov epr_data,acall spi_sendb0mov rbank,#0incms Znopdecms tempjmp send_len_bytesend_len_over:b0bset spi_cscall i2c_delay;check the statusmov a,#TRY_TIMESb0mov rbank,#1mov trytime,acheck_status:b0mov rbank,#0b0bclr spi_csmov a,#0ffhcall spi_sendb0bset spi_cscall i2c_delayb0mov a,spi_insub a,#0ffhb0bts0 FZjmp wait_1ms ;模块操作尚未完成b0mov a,spi_insub a,#00hb0bts0 FZjmp succ_quit_00 ;操作成功fail_quit:b0bset spi_csmov a,#USB_FAILb0mov rbank,#1mov usb_reslt,ab0mov rbank,#0retwait_1ms: //延时b0mov z,#0f7hb0mov y,#0e3h ;稳定oscillator,40msdelay_ms_02:b0bset fwdrstnopnopincms zjmp delay_ms_02nopincms yjmp delay_ms_02b0mov rbank,#1decms trytimejmp check_statusjmp fail_quitsucc_quit_00:b0mov rbank,#0b0bclr spi_csmov a,#00hb0mov epr_data,acall spi_sendb0mov a,spi_inb0bts0 FZjmp succ_quitb0mov temp,ab0mov Y,#1b0mov Z,#recvbufread_len_byte:mov a,#0b0mov rbank,#0b0mov epr_data,acall spi_sendb0mov a,spi_inb0mov @YZ,ab0mov rbank,#0incms Znopdecms tempjmp read_len_bytesucc_quit:b0bset spi_csmov a,#USB_succb0mov rbank,#1mov usb_reslt,ab0mov rbank,#0rettestusb://测试主程序call spi_ini //初始化spib0mov rbank,#1 //发送U盘是否连接好命令mov a,#CMD_DiskReadymov cmd,amov a,#0mov len,ab0mov rbank,#0call spi_send_commandb0mov rbank,#1mov a,usb_resltsub a,#USB_succb0bts1 FZret;ok diskread ;sendbuf is 92+”TEST.DAT” //创建文件”TEST.DAT”b0mov rbank,#0b0mov Y,#1b0mov Z,#sendbufmov a,#92b0mov @yz,aincms Zmov a,#116b0mov @yz,aincms Zmov a,#101b0mov @yz,aincms Zmov a,#115b0mov @yz,aincms Zmov a,#116b0mov @yz,aincms Zmov a,#46b0mov @yz,aincms Zmov a,#100b0mov @yz,aincms Zmov a,#97b0mov @yz,aincms Zmov a,#116b0mov @yz,aincms Zb0mov rbank,#1mov a,#CMD_FileCreate //创建文件命令mov cmd,amov a,#10mov len,ab0mov rbank,#0call spi_send_commandmov a,usb_resltb0mov rbank,#0sub a,#USB_succb0bts1 FZretb0mov rbank,#0b0mov Y,#1b0mov Z,#sendbufmov a,#19b0mov @yz,aincms Zmov a,#33b0mov @yz,aincms Zmov a,#34b0mov @yz,aincms Zmov a,#35b0mov @yz,aincms Zmov a,#36b0mov @yz,aincms Zmov a,#37b0mov @yz,aincms Zmov a,#38b0mov @yz,aincms Zmov a,#39b0mov @yz,aincms Zmov a,#40b0mov @yz,aincms Zmov a,#41b0mov @yz,ab0mov rbank,#1mov a,#CMD_ByteWrite //写入数据mov cmd,amov a,#10b0mov rbank,#0call spi_send_commandb0mov rbank,#1mov a,#CMD_FileClose //关闭文件mov cmd,amov a,#1mov len,ab0mov rbank,#0call spi_send_commandret。
51单片机读写U盘 430单片机读写U盘 U盘读写设备
关于USB118处理WORD及Excel格式文件的相关说明一、 WORD文件1、建立WORD文件在USB118建立文件时,请将文件后缀改成doc2、写WORD文件请将存储内容的ASCII(汉字为UNICODE)码写入目标文件,与文本文件操作方法一致二、 Excel文件1、建立Excel文件在USB118建立文件时,请将文件后缀设置为xls2、写Excel文件写Excel文件时,请用Tab分隔符(ASC:0x09)分隔列信息,回车符号(ASC:0x0D)分隔行信息。
举例说明:如果要在EXCEL中实现图(1)中的数据格式(图1)那么对应的文本设置为1 1 12 2 23 3 3对于USB118编程模块,其中有3(行)*2(列)个TAB分隔符,有2个回车符,数字的个数为3*3=9个,所以要写入数组大小定义为17(3*2+2+3*3)个,要写入的字节数组表示为const colsplit=0x09; //Tab分隔符的ASC码const rowsplit=0x0D;//回车符号的ASC码char writechar[17];writechar[0]=0x31;writechar[1]=colsplit; //下一列writechar[2]=0x31;writechar[3]=colsplit; //下一列writechar[4]=0x31;//开始换行writechar[5]=rowsplit;//开始输入内容writechar[6]=0x32;writechar[7]=colsplit;writechar[8]=0x32;writechar[9]=colsplit;writechar[10]=0x32;//开始换行writechar[11]=rowsplit//开始输入内容writechar[12]=0x33;writechar[13]=colsplit;writechar[14]=0x33;writechar[15]=colsplit;writechar[16]=0x33;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*******************************************************/#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; }。