⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udisk.lst

📁 AVR单片机平台Atmega32+CH375A芯片读写U盘代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0678) UINT8	CH375FileWrite( void )		/* 向当前文件写入数据 */
(0679) {
(0680) 	mCmdParam.WriteX.mDataBuffer = &FILE_DATA_BUF[0];  /* 指向文件数据缓冲区 */
_CH375FileWrite:
    006A EA80      LDI	R24,0xA0
    006B E092      LDI	R25,2
    006C 939006A9  STS	0x6A9,R25
    006E 938006A8  STS	0x6A8,R24
(0681) 	return( CH375FileWriteX( ) );
    0070 940E0F1A  CALL	_CH375FileWriteX
    0072 9508      RET
_CH375FileQuery:
  count                --> R20
  buf                  --> R22
    0073 940E249D  CALL	push_gset2
(0682) }
(0683) #endif
(0684) #endif
(0685) 
(0686) /* 以下程序可以根据需要修改 */
(0687) 
(0688) #ifndef NO_DEFAULT_CH375_F_ENUM			/* 在应用程序中定义NO_DEFAULT_CH375_F_ENUM可以禁止默认的枚举文件程序,然后用自行编写的程序代替它 */
(0689) UINT8	CH375FileEnumer( void )			/* 枚举文件 */
(0690) {
(0691) 	UINT8	status;
(0692) 	status = CH375FileOpen( );
(0693) 	if ( status == ERR_FOUND_NAME ) status = ERR_SUCCESS;  /* 操作成功 */
(0694) 	return( status );
(0695) }
(0696) #endif
(0697) 
(0698) #ifndef NO_DEFAULT_CH375_F_QUERY		/* 在应用程序中定义NO_DEFAULT_CH375_F_QUERY可以禁止默认的查询当前文件的信息程序,然后用自行编写的程序代替它 */
(0699) UINT8	CH375FileQuery( void )			/* 查询当前文件的信息 */
(0700) {
(0701) 	PUINT8	buf;
(0702) 	UINT8	count;
(0703) 	buf = (PUINT8)( & mCmdParam.Modify.mFileSize );
    0075 EA60      LDI	R22,0xA0
    0076 E076      LDI	R23,6
(0704) 	for ( count = sizeof( mCmdParam.Modify ); count != 0; count -- ) {
    0077 E049      LDI	R20,0x9
    0078 C006      RJMP	0x007F
(0705) 		*buf = 0xFF;  /* 输入参数全部无效,仅查询不修改 */
    0079 EF8F      LDI	R24,0xFF
    007A 01FB      MOVW	R30,R22
    007B 8380      STD	Z+0,R24
(0706) 		buf ++;
    007C 5F6F      SUBI	R22,0xFF
    007D 4F7F      SBCI	R23,0xFF
    007E 954A      DEC	R20
    007F 2344      TST	R20
    0080 F7C1      BNE	0x0079
(0707) 	}
(0708) 	return( CH375FileModify( ) );
    0081 940E20D9  CALL	_CH375FileModify
    0083 940E248B  CALL	pop_gset2
    0085 9508      RET
(0709) }
(0710) #endif
(0711) 
(0712) #ifndef NO_DEFAULT_CH375_INT			/* 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */
(0713) #if LIB_CFG_INT_EN == 0					/* CH375的INT#引脚连接方式为"查询方式" */
(0714) void xQueryInterrupt( void )			/* 查询CH375中断并更新中断状态 */
(0715) {
(0716) 	while ( CH375_INT_WIRE );  /* 如果CH375的中断引脚输出高电平则等待 */
_xQueryInterrupt:
    0086 9982      SBIC	0x10,2
    0087 CFFE      RJMP	_xQueryInterrupt
(0717) 	xWriteCH375Cmd( CMD_GET_STATUS );  /* 获取当前中断状态,发出命令后至少延时2uS */
    0088 E202      LDI	R16,0x22
    0089 D0D8      RCALL	_xWriteCH375Cmd
(0718) 	CH375IntStatus = xReadCH375Data( );  /* 获取中断状态 */
    008A D0FF      RCALL	_xReadCH375Data
    008B 930007FD  STS	CH375IntStatus,R16
(0719) 	if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT;  /* 检测到USB设备断开事件 */
    008D 918007FD  LDS	R24,CH375IntStatus
    008F 3186      CPI	R24,0x16
    0090 F421      BNE	0x0095
    0091 E081      LDI	R24,1
    0092 938007FC  STS	CH375DiskStatus,R24
    0094 C007      RJMP	0x009C
(0720) 	else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT;  /* 检测到USB设备连接事件 */
    0095 918007FD  LDS	R24,CH375IntStatus
    0097 3185      CPI	R24,0x15
    0098 F419      BNE	0x009C
    0099 E082      LDI	R24,2
    009A 938007FC  STS	CH375DiskStatus,R24
    009C 9508      RET
(0721) }
(0722) #else									/* LIB_CFG_INT_EN != 0, CH375的INT#引脚连接方式为"中断方式" */
(0723) void xQueryInterrupt( void )			/* 查询中断状态,等待硬件中断 */
(0724) {
(0725) 	while ( CH375IntStatus == 0 );		/* 子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回 */
(0726) }
(0727) #ifndef CH375_INT_NO
(0728) #define CH375_INT_NO		2
(0729) #endif
(0730) #pragma interrupt_handler CH375Interrupt:CH375_INT_NO
(0731) void	CH375Interrupt( void )			/* CH375中断服务程序,由CH375的INT#的低电平或者下降沿触发单片机中断 */
(0732) {
(0733) 	xWriteCH375Cmd( CMD_GET_STATUS );  /* 获取中断状态并取消中断请求 */
(0734) 	CH375IntStatus = xReadCH375Data( );  /* 获取中断状态 */
(0735) 	if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT;  /* 检测到USB设备断开事件 */
(0736) 	else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT;  /* 检测到USB设备连接事件 */
(0737) #ifdef CLEAR_INT_MARK
(0738) 	CLEAR_INT_MARK( );  /* 某些单片机需要由软件清除中断标志 */
(0739) #endif
(0740) }
(0741) #endif
(0742) #endif
(0743) 
(0744) #ifndef NO_DEFAULT_DELAY_100US			/* 在应用程序中定义NO_DEFAULT_DELAY_100US可以禁止默认的延时100uS子程序,然后用自行编写的程序代替它 */
(0745) void xDelay100uS( void )				/* 延时100uS */
(0746) {
(0747) 	UINT16	count;
(0748) 	for ( count = 330; count != 0; count -- );  /* 延时100uS,6x50nS@20MHz */
(0749) }
(0750) #endif
(0751) 
(0752) #ifdef EN_DISK_WRITE
(0753) #ifndef NO_DEFAULT_DELAY_WRITE			/* 在应用程序中定义NO_DEFAULT_DELAY_WRITE可以禁止默认的写操作后延时程序,然后用自行编写的程序代替它 */
(0754) void xDelayAfterWrite( void )			/* 写操作后延时 */
(0755) {
(0756) 	UINT16	count;
(0757) 	for ( count = 650; count != 0; count -- );  /* 延时200uS左右 */
(0758) }
(0759) #endif
(0760) #endif
(0761) 
(0762) #ifndef NO_DEFAULT_FILE_ENUMER			/* 在应用程序中定义NO_DEFAULT_FILE_ENUMER可以禁止默认的文件名枚举回调程序,然后用自行编写的程序代替它 */
(0763) void xFileNameEnumer( void )			/* 文件名枚举回调子程序 */
(0764) {
_xFileNameEnumer:
    009D 9508      RET
(0765) /* 如果指定枚举序号CH375vFileSize为0xFFFFFFFF后调用FileOpen,那么每搜索到一个文件FileOpen都会调用本回调程序,
(0766)    回调程序xFileNameEnumer返回后,FileOpen递减CH375vFileSize并继续枚举直到搜索不到文件或者目录。建议做法是,
(0767)    在调用FileOpen之前定义一个全局变量为0,当FileOpen回调本程序后,本程序由CH375vFdtOffset得到结构FAT_DIR_INFO,
(0768)    分析结构中的DIR_Attr以及DIR_Name判断是否为所需文件名或者目录名,记录相关信息,并将全局变量计数增量,
(0769)    当FileOpen返回后,判断返回值如果是ERR_MISS_FILE或ERR_FOUND_NAME都视为操作成功,全局变量为搜索到的有效文件数。
(0770)    如果在本回调程序xFileNameEnumer中将CH375vFileSize置为1,那么可以通知FileOpen提前结束搜索。以下是回调程序例子 */
(0771) #if 0
(0772) #ifdef FILE_DATA_BUF_LEN
(0773) 	UINT8			i;
(0774) 	UINT16			FileCount;
(0775) 	P_FAT_DIR_INFO	pFileDir;
(0776) 	PUINT8			NameBuf;
(0777) 	pFileDir = (P_FAT_DIR_INFO)( (PUINT8)(&DISK_BASE_BUF[0]) + CH375vFdtOffset );  /* 当前FDT的起始地址 */
(0778) 	FileCount = (UINT16)( 0xFFFFFFFF - CH375vFileSize );  /* 当前文件名的枚举序号,CH375vFileSize初值是0xFFFFFFFF,找到文件名后递减 */
(0779) 	if ( FileCount < FILE_DATA_BUF_LEN / 12 ) {  /* 检查缓冲区是否足够存放,假定每个文件名需占用12个字节存放 */
(0780) 		NameBuf = & FILE_DATA_BUF[ FileCount * 12 ];  /* 计算保存当前文件名的缓冲区地址 */
(0781) 		for ( i = 0; i < 11; i ++ ) NameBuf[ i ] = pFileDir -> DIR_Name[ i ];  /* 复制文件名,长度为11个字符,未处理空格 */
(0782) 		if ( pFileDir -> DIR_Attr & ATTR_DIRECTORY ) NameBuf[ i ] = 1;  /* 判断是目录名 */
(0783) 		NameBuf[ i ] = 0;  /* 文件名结束符 */
(0784) 	}
(0785) #endif
(0786) #endif
(0787) }
(0788) #endif
(0789) 
(0790) #ifdef EXT_BLK_INTERFACE
(0791) #if LIB_CFG_FILE_IO == 0				/* 文件读写的数据的复制方式为"外部子程序" */
(0792) #ifdef LIB_CFG_FILE_IO_DEFAULT			/* 如果应用程序中定义该值则使用默认"外部子程序",否则应该自行编写程序代替 */
(0793) unsigned char *current_buffer;	/* 保存文件数据读写时的缓冲区的当前指针,由应用程序在调用CH375FileReadX和CH375FileWriteX子程序前设置初值 */
(0794) void xWriteToExtBuf( UINT8 mLength )	/* 该子程序由CH375的子程序库调用,用于从CH375读取文件数据到外部缓冲区,被CH375FileReadX调用 */
(0795) {
(0796) /*	if ( (UINT32)current_buffer + mLength >= (UINT32)&FILE_DATA_BUF + sizeof( FILE_DATA_BUF ) ) return;*/  /* 防止缓冲区溢出 */
(0797) 	if ( mLength ) {
(0798) 		do {  /* 根据长度读取数据,实际上长度总是CH375_MAX_DATA_LEN,也就是64 */
(0799) 			*current_buffer = xReadCH375Data( );  /* 读出数据并保存,可以用这种方式将文件数据保存到单片机的各种串行存储器中 */
(0800) 			current_buffer ++;
(0801) 		} while ( -- mLength );
(0802) 	}  /* 复制上述数据的总时间不得超过2mS */
(0803) 	else {  /* 重试,恢复缓冲区起址,如果将文件数据读写的缓冲区的当前指针放在mCmdParam.ReadX.mDataBuffer中则会被自动恢复,无需下面的两行程序 */
(0804) 		current_buffer += (UINT16)mCmdParam.ReadX.mDataBuffer;  /* mDataBuffer中为负值 */
(0805) 		mCmdParam.ReadX.mDataBuffer = 0;  /* 为了支持重试,在调用CH375FileReadX之前也应该清0 */
(0806) 	}
(0807) }
(0808) #ifdef EN_DISK_WRITE
(0809) void xReadFromExtBuf( UINT8 mLength )	/* 该子程序由CH375的子程序库调用,用于从外部缓冲区读取文件数据到CH375,被CH375FileWriteX调用 */
(0810) {
(0811) 	if ( mLength ) {
(0812) 		do {  /* 根据长度写入数据,实际上长度总是CH375_MAX_DATA_LEN,也就是64 */
(0813) 			xWriteCH375Data( *current_buffer );  /* 将数据写入,可以用这种方式从单片机的各种串行存储器中取出文件数据 */
(0814) 			current_buffer ++;
(0815) 		} while ( -- mLength );
(0816) 	}  /* 复制上述数据的总时间不得超过2mS */
(0817) 	else {  /* 重试,恢复缓冲区起址,如果将文件数据读写的缓冲区的当前指针放在mCmdParam.WriteX.mDataBuffer中则会被自动恢复,无需下面的两行程序 */
(0818) 		current_buffer += (UINT16)mCmdParam.WriteX.mDataBuffer;  /* mDataBuffer中为负值 */
(0819) 		mCmdParam.WriteX.mDataBuffer = 0;  /* 为了支持重试,在调用CH375FileWriteX之前也应该清0 */
(0820) 	}
(0821) }
(0822) #endif
(0823) #endif
(0824) #else									/* LIB_CFG_FILE_IO != 0,文件读写的数据的复制方式不是"外部子程序" */
(0825) #ifdef FILE_DATA_BUF_LEN
(0826) void xWriteToExtBuf( UINT8 mLength )	/* 不会调用该子程序 */
(0827) {
(0828) 	mLength --;  /* 该操作无意义,只是避免出现警告信息 */
_xWriteToExtBuf:
  mLength              --> R16
    009E 950A      DEC	R16
    009F 9508      RET
(0829) }
(0830) #ifdef EN_DISK_WRITE
(0831) void xReadFromExtBuf( UINT8 mLength )	/* 不会调用该子程序 */
(0832) {
(0833) 	mLength --;  /* 该操作无意义,只是避免出现警告信息 */
_xReadFromExtBuf:
  mLength              --> R16
    00A0 950A      DEC	R16
    00A1 9508      RET
(0834) }
(0835) #endif
(0836) #endif
(0837) #endif
(0838) #endif
(0839) 
(0840) UINT8	CH375LibInit( void )  /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
(0841) {
(0842) 	CH375LibConfig = LIB_CFG_VALUE;  /* CH375程序库配置值 */
_CH375LibInit:
    00A2 E085      LDI	R24,5
    00A3 938007FB  STS	CH375LibConfig,R24
(0843) 	DISK_BASE_BUF[0] = 0;  /* 该操作无意义,只是为了防止编译器优化时不产生DISK_BASE_BUF缓冲区 */
    00A5 2422      CLR	R2
    00A6 922004A0  STS	DISK_BASE_BUF,R2
(0844) 	if ( CH375GetVer( ) < CH375_LIB_VER ) return( 0xFF );  /* 获取当前子程序库的版本号,版本太低则返回错误 */
    00A8 940E10B5  CALL	_CH375GetVer
    00AA 3300      CPI	R16,0x30
    00AB F410      BCC	0x00AE
    00AC EF0F      LDI	R16,0xFF
    00AD C002      RJMP	0x00B0
(0845) 	return( CH375Init( ) );  /* 初始化CH375 */
    00AE 940E1195  CALL	_CH375Init
    00B0 9508      RET
FILE: E:\xm\jxf\u盘读写模块\code\udisk_test0827\udisk.c
(0001) //此版本为测试375自带模块函数设计,
(0002) //测试读取文件,新建文件,写入文件,修改属性
(0003) 
(0004) 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -