📄 udisk.lst
字号:
(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 + -