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

📄 main.lis

📁 AVR单片机制作U盘的源码
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .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 + -