📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile E:\电子项目\北极熊模块\例程\AVR\main.c
0000 .dbfunc e initPort _initPort fV
.even
0000 _initPort::
0000 .dbline -1
0000 .dbline 110
0000 ; /*
0000 ; name:main.c
0000 ; writer:xiaowu
0000 ; date:2009/1/6
0000 ; ****************************************
0000 ; ** Copyright (C) fifth 2008-2009 **
0000 ; ** Web: http://www.chinamcu.com **
0000 ; ****************************************
0000 ; ** USB Host File Module @PB375 **
0000 ; ** AVR ATMega32 **
0000 ; ** 深圳第五元素科技有限公司 **
0000 ; ** 联系方式:0755-29739852
0000 ; ** 技术email:xiaowuyeah@163.com **
0000 ; discription:
0000 ;
0000 ; U盘文件读写模块, 连接方式: 软件模拟SPI时序+查询
0000 ; AVR单片机C语言示例程序
0000 ;
0000 ; 以字节为单位进行U盘文件读写,单片机的RAM只需要几十个字节,不需要外部RAM
0000 ; *********************************************
0000 ; */
0000 ;
0000 ;
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ;
0000 ;
0000 ; #define PB375_VER 0x30 /* 当前模块版本 */
0000 ;
0000 ; /* ********************************************************************************************************************* */
0000 ; /* 返回的操作状态码 */
0000 ; /* 以下是事件通知状态码,检测到当前U盘已经连接或者已经断开,可以作为最终状态码 */
0000 ; #define ERR_USB_CONNECT 0x15 /* 检测到USB设备连接事件,磁盘已经连接 */
0000 ; #define ERR_DISK_DISCON 0x82 /* 检测到USB设备连接事件,磁盘已经断开,或者磁盘尚未连接 */
0000 ; /* 代码0XH用于USB设备方式的操作状态代码,由PB375返回,是USB设备模式的中断状态 */
0000 ; #define ERR_USB_DAT_DOWN 0x02 /* USB设备模式: 数据下传成功,上位机下传的数据已经在模块中 */
0000 ; #define ERR_USB_DAT_UP 0x0A /* USB设备模式: 数据上传成功,模块中的上传数据已经被上位机取走 */
0000 ;
0000 ;
0000 ; /* 最终状态码 */
0000 ; #define ERR_SUCCESS 0x00 /* 操作成功 */
0000 ; #define ERR_PB375_ERROR 0x81 /* PB375硬件错误,可能需要复位PB375 */
0000 ; #define ERR_STATUS_ERR 0x83 /* 磁盘状态错误,可能正在连接或者断开磁盘 */
0000 ; #define ERR_MBR_ERROR 0x91 /* 磁盘的主引导记录无效,可能磁盘尚未分区或者尚未格式化 */
0000 ; #define ERR_TYPE_ERROR 0x92 /* 磁盘分区类型不支持,只支持FAT12/FAT16/BigDOS/FAT32,需要由磁盘管理工具重新分区 */
0000 ; #define ERR_BPB_ERROR 0xA1 /* 磁盘尚未格式化,或者参数错误,需要由WINDOWS采用默认参数重新格式化 */
0000 ; #define ERR_TOO_LARGE 0xA2 /* 磁盘非正常格式化并且容量大于4GB,或者容量大于250GB,需要由WINDOWS采用默认参数重新格式化 */
0000 ; #define ERR_FAT_ERROR 0xA3 /* 磁盘的文件系统不支持,只支持FAT12/FAT16/FAT32,需要由WINDOWS采用默认参数重新格式化 */
0000 ; #define ERR_DISK_FULL 0xB1 /* 磁盘文件太满,剩余空间太少或者已经没有,需要磁盘整理 */
0000 ; #define ERR_FDT_OVER 0xB2 /* 目录内文件太多,没有空闲的目录项,FAT12/FAT16根目录下的文件数应该少于500个,需要磁盘整理 */
0000 ; #define ERR_MISS_DIR 0xB3 /* 指定路径的某个子目录没有找到,可能是目录名称错误 */
0000 ; #define ERR_FILE_CLOSE 0xB4 /* 文件已经关闭,如果需要使用,应该重新打开文件 */
0000 ; #define ERR_OPEN_DIR 0x41 /* 指定路径的目录被打开 */
0000 ; #define ERR_MISS_FILE 0x42 /* 指定路径的文件没有找到,可能是文件名称错误 */
0000 ; #define ERR_FOUND_NAME 0x43 /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中,如果需要使用,应该打开该文件 */
0000 ; #define ERR_USB_DISK_ERR 0x1F /* USB存储器操作失败,在初始化时可能是USB存储器不支持,在读写操作中可能是磁盘损坏或者已经断开 */
0000 ; /* 其余错误代码未定义,可以发出命令CMD_QueryStatus查询模块状态并分析 */
0000 ;
0000 ; /* ********************************************************************************************************************* */
0000 ; /* 磁盘及文件状态,适用于CMD_PARAM.Status.mDiskStatus */
0000 ; #define DISK_UNKNOWN 0x00 /* 尚未初始化,未知状态 */
0000 ; #define DISK_DISCONNECT 0x01 /* 磁盘没有连接或者已经断开 */
0000 ; #define DISK_CONNECT 0x02 /* 磁盘已经连接,但是尚未初始化或者无法识别该磁盘 */
0000 ; #define DISK_MOUNTED 0x03 /* 磁盘已经初始化成功,但是尚未分析文件系统或者文件系统不支持 */
0000 ; #define DISK_READY 0x10 /* 已经分析磁盘的文件系统并且能够支持 */
0000 ; #define DISK_OPEN_ROOT 0x12 /* 已经打开根目录,扇区模式,只能以扇区为单位读写目录的内容,使用后必须关闭,注意FAT12/FAT16根目录是固定长度 */
0000 ; #define DISK_OPEN_DIR 0x13 /* 已经打开子目录,扇区模式,只能以扇区为单位读写目录的内容 */
0000 ; #define DISK_OPEN_FILE 0x14 /* 已经打开文件,扇区模式,可以以扇区为单位进行数据读写 */
0000 ; #define DISK_OPEN_FILE_B 0x15 /* 已经打开文件,字节模式,可以以字节为单位进行数据读写 */
0000 ;
0000 ;
0000 ; /* 外部命令码 */
0000 ; #define CMD_DiskQuery 0x61 /* 查询磁盘信息 */
0000 ; #define CMD_FileOpen 0x64 /* 打开文件 */
0000 ; #define CMD_FileCreate 0x65 /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
0000 ; #define CMD_FileErase 0x66 /* 删除文件并关闭 */
0000 ; #define CMD_FileClose 0x67 /* 关闭当前文件 */
0000 ; #define CMD_ByteLocate 0x7A /* 以字节为单位移动当前文件指针 */
0000 ; #define CMD_ByteRead 0x7B /* 以字节为单位从当前文件读取数据块 */
0000 ; #define CMD_ByteWrite 0x7C /* 以字节为单位向当前文件写入数据块 */
0000 ; #define CMD_DiskReady 0x71 /* 查询磁盘是否准备好 */
0000 ;
0000 ;
0000 ; /*
0000 ; CS------PB0
0000 ; SCK-----PB1
0000 ; SDI-----PB2
0000 ; SDO-----PB3
0000 ; */
0000 ;
0000 ; #define PB375_CS_SET PORTB |= (1<<PB0)
0000 ; #define PB375_CS_CLR PORTB &= ~(1<<PB0)
0000 ; #define PB375_SCK_SET PORTB |= (1<<PB1)
0000 ; #define PB375_SCK_CLR PORTB &= ~(1<<PB1)
0000 ; #define PB375_SDI_SET PORTB |= (1<<PB2)
0000 ; #define PB375_SDI_CLR PORTB &= ~(1<<PB2)
0000 ; #define PB375_SDO (PINB &(1<<PB3))
0000 ;
0000 ; #define MAXBUFLEN 128
0000 ;
0000 ; //发送缓冲区
0000 ; unsigned char sendBuff[MAXBUFLEN];
0000 ; //接收缓冲区
0000 ; unsigned char recBuff[MAXBUFLEN];
0000 ;
0000 ;
0000 ;
0000 ; //初始化IO口 设置CS SCK SDI 为输出 SDO为输入
0000 ; void initPort()
0000 ; {
0000 .dbline 111
0000 ; PORTB |= 0x07;
0000 88B3 in R24,0x18
0002 8760 ori R24,7
0004 88BB out 0x18,R24
0006 .dbline 112
0006 ; DDRB |= 0x07;
0006 87B3 in R24,0x17
0008 8760 ori R24,7
000A 87BB out 0x17,R24
000C .dbline 113
000C ; DDRB &= 0xF7;
000C 87B3 in R24,0x17
000E 877F andi R24,247
0010 87BB out 0x17,R24
0012 .dbline -2
0012 L1:
0012 .dbline 0 ; func end
0012 0895 ret
0014 .dbend
0014 .dbfunc e mDelaymS _mDelaymS fV
0014 ; i -> R20
0014 ; c -> R10
0014 ; j -> R22
0014 ; delay -> R16
.even
0014 _mDelaymS::
0014 0E940000 xcall push_gset3
0018 .dbline -1
0018 .dbline 119
0018 ; }
0018 ;
0018 ;
0018 ; /* 以毫秒为单位延时,适用于24MHz时钟 */
0018 ; void mDelaymS( unsigned char delay )
0018 ; {
0018 .dbline 121
0018 402F mov R20,R16
001A 11C0 xjmp L6
001C L3:
001C .dbline 121
001C ; unsigned char i, j, c;
001C ; for ( i = delay; i != 0; i -- ) {
001C .dbline 122
001C 68EC ldi R22,200
001E 04C0 xjmp L10
0020 L7:
0020 .dbline 122
0020 8A2D mov R24,R10
0022 8D5F subi R24,253 ; addi 3
0024 A82E mov R10,R24
0026 L8:
0026 .dbline 122
0026 6A95 dec R22
0028 L10:
0028 .dbline 122
0028 ; for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */
0028 6623 tst R22
002A D1F7 brne L7
002C .dbline 123
002C 68EC ldi R22,200
002E 04C0 xjmp L14
0030 L11:
0030 .dbline 123
0030 8A2D mov R24,R10
0032 8D5F subi R24,253 ; addi 3
0034 A82E mov R10,R24
0036 L12:
0036 .dbline 123
0036 6A95 dec R22
0038 L14:
0038 .dbline 123
0038 6623 tst R22
003A D1F7 brne L11
003C .dbline 124
003C L4:
003C .dbline 121
003C 4A95 dec R20
003E L6:
003E .dbline 121
003E 4423 tst R20
0040 69F7 brne L3
0042 .dbline -2
0042 L2:
0042 0E940000 xcall pop_gset3
0046 .dbline 0 ; func end
0046 0895 ret
0048 .dbsym r i 20 c
0048 .dbsym r c 10 c
0048 .dbsym r j 22 c
0048 .dbsym r delay 16 c
0048 .dbend
0048 .dbfunc e mSpiExchange _mSpiExchange fc
0048 ; d -> R20
0048 ; i -> R22
0048 ; c -> R16
.even
0048 _mSpiExchange::
0048 0E940000 xcall push_gset2
004C .dbline -1
004C .dbline 129
004C ; for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */
004C ; }
004C ; }
004C ;
004C ; /* 发送一个字节数据给PB375模块,同时接收一个字节,以SPI模式0方式(SPI_SCK默认为0) */
004C ; unsigned char mSpiExchange( unsigned char c )
004C ; {
004C .dbline 131
004C ; unsigned char i, d;
004C ; d = 0;
004C 4427 clr R20
004E .dbline 132
004E ; PB375_SCK_CLR;
004E C198 cbi 0x18,1
0050 .dbline 133
0050 68E0 ldi R22,8
0052 0DC0 xjmp L19
0054 L16:
0054 .dbline 133
0054 ; for ( i = 8; i != 0; i -- ) { /* 8个位 */
0054 .dbline 134
0054 ; if ( c & 0x80 )
0054 07FF sbrs R16,7
0056 02C0 rjmp L20
0058 .dbline 135
0058 ; PB375_SDI_SET; /* 向模块的SDI输入引脚输出数据 */
0058 C29A sbi 0x18,2
005A 01C0 xjmp L21
005C L20:
005C .dbline 137
005C ; else
005C ; PB375_SDI_CLR;
005C C298 cbi 0x18,2
005E L21:
005E .dbline 138
005E ; d <<= 1;
005E 440F lsl R20
0060 .dbline 139
0060 ; if ( PB375_SDO )
0060 B39B sbis 0x16,3
0062 01C0 rjmp L22
0064 .dbline 140
0064 ; d++; /* 如果模块的SDO输出引脚为高电平则输入位1 PB375_SDO */
0064 4395 inc R20
0066 L22:
0066 .dbline 141
0066 C19A sbi 0x18,1
0068 .dbline 142
0068 000F lsl R16
006A .dbline 143
006A C198 cbi 0x18,1
006C .dbline 144
006C L17:
006C .dbline 133
006C 6A95 dec R22
006E L19:
006E .dbline 133
006E 6623 tst R22
0070 89F7 brne L16
0072 .dbline 145
0072 ; PB375_SCK_SET; /* SPI时钟上升沿,模块接收数据并输出数据 */
0072 ; c <<= 1;
0072 ; PB375_SCK_CLR;
0072 ; }
0072 ; return( d );
0072 042F mov R16,R20
0074 .dbline -2
0074 L15:
0074 0E940000 xcall pop_gset2
0078 .dbline 0 ; func end
0078 0895 ret
007A .dbsym r d 20 c
007A .dbsym r i 22 c
007A .dbsym r c 16 c
007A .dbend
007A .dbfunc e ExecCommand _ExecCommand fc
007A ; status -> R20
007A ; i -> R22
007A ; j -> R10
007A ; len -> R10
007A ; cmd -> R20
.even
007A _ExecCommand::
007A 0E940000 xcall push_gset3
007E A22E mov R10,R18
0080 402F mov R20,R16
0082 .dbline -1
0082 .dbline 152
0082 ; }
0082 ;
0082 ;
0082 ;
0082 ; /* 执行命令 */
0082 ; unsigned char ExecCommand( unsigned char cmd, unsigned char len )
0082 ; {
0082 .dbline 154
0082 ; unsigned char i, j, status;
0082 ; PB375_CS_CLR; /* 产生SPI片选 */
0082 C098 cbi 0x18,0
0084 .dbline 155
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -