单片机U盘读写参考程序

合集下载

用C语言来实现单片机对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盘源代码

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文件系统

关于单片机读写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芯片之欧阳法创编

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盘

单片机读写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盘方案

单片机读写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烧写程序

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示例源程序

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 );}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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; }。

相关文档
最新文档