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

📄 ch375ev0.lis

📁 使用ATMEGA128加CH375对U盘扇区进行读写,本程序在ICCAVR上调试,并在相应硬件电路上调试通过!供参考用
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 018C 45C0              xjmp L45
 018E           L52:
 018E                   .dbline 204
 018E           ; 
 018E           ; /* 可以由CMD_RD_USB_DATA命令将容量数据读出,分析每扇区字节数 */
 018E           ;       CH375_WR_CMD_PORT( CMD_RD_USB_DATA );  /* 从CH375缓冲区读取数据块 */
 018E 08E2              ldi R16,40
 0190 59DF              xcall _CH375_WR_CMD_PORT
 0192                   .dbline 205
 0192           ;       i = CH375_RD_DAT_PORT( );  /* 后续数据的长度 */
 0192 81DF              xcall _CH375_RD_DAT_PORT
 0194 402F              mov R20,R16
 0196                   .dbline 206
 0196           ;       if ( i != 8 ) return( USB_INT_DISK_ERR );  /* 异常 */
 0196 0830              cpi R16,8
 0198 11F0              breq L54
 019A                   .dbline 206
 019A 0FE1              ldi R16,31
 019C 3DC0              xjmp L45
 019E           L54:
 019E                   .dbline 207
 019E           ;       for ( i = 0; i != 8; i ++ )
 019E 4427              clr R20
 01A0 09C0              xjmp L59
 01A2           L56:
 01A2                   .dbline 208
 01A2                   .dbline 209
 01A2 79DF              xcall _CH375_RD_DAT_PORT
 01A4 80E0              ldi R24,<_DATA_BUFFER
 01A6 90E0              ldi R25,>_DATA_BUFFER
 01A8 E42F              mov R30,R20
 01AA FF27              clr R31
 01AC E80F              add R30,R24
 01AE F91F              adc R31,R25
 01B0 0083              std z+0,R16
 01B2                   .dbline 210
 01B2           L57:
 01B2                   .dbline 207
 01B2 4395              inc R20
 01B4           L59:
 01B4                   .dbline 207
 01B4 4830              cpi R20,8
 01B6 A9F7              brne L56
 01B8                   .dbline 211
 01B8           ;        {  /* 根据长度读取数据 */
 01B8           ;                 DATA_BUFFER[ i ] = CH375_RD_DAT_PORT( );  /* 读出数据并保存 */
 01B8           ;        }
 01B8           ;       i = DATA_BUFFER[ 6 ];  /* U盘容量数据中的每扇区字节数,大端格式 */
 01B8 40910900          lds R20,_DATA_BUFFER+6
 01BC                   .dbline 213
 01BC           ; 
 01BC           ;       if ( i == 0x04 )
 01BC 4430              cpi R20,4
 01BE 21F4              brne L61
 01C0                   .dbline 214
 01C0           ;                 BlockPerSector = 1024/CH375_BLOCK_SIZE;  /* 磁盘的物理扇区是1K字节 */
 01C0 80E1              ldi R24,16
 01C2 80930000          sts _BlockPerSector,R24
 01C6 0FC0              xjmp L62
 01C8           L61:
 01C8                   .dbline 215
 01C8           ;       else if ( i == 0x08 ) 
 01C8 4830              cpi R20,8
 01CA 21F4              brne L63
 01CC                   .dbline 216
 01CC           ;                 BlockPerSector = 2048/CH375_BLOCK_SIZE;  /* 磁盘的物理扇区是2K字节 */
 01CC 80E2              ldi R24,32
 01CE 80930000          sts _BlockPerSector,R24
 01D2 09C0              xjmp L64
 01D4           L63:
 01D4                   .dbline 217
 01D4           ;       else if ( i == 0x10 ) 
 01D4 4031              cpi R20,16
 01D6 21F4              brne L65
 01D8                   .dbline 218
 01D8           ;                 BlockPerSector = 4096/CH375_BLOCK_SIZE;  /* 磁盘的物理扇区是4K字节 */
 01D8 80E4              ldi R24,64
 01DA 80930000          sts _BlockPerSector,R24
 01DE 03C0              xjmp L66
 01E0           L65:
 01E0                   .dbline 220
 01E0           ;       else 
 01E0           ;                 BlockPerSector = 512/CH375_BLOCK_SIZE;  /* 默认的磁盘的物理扇区是512字节 */
 01E0 88E0              ldi R24,8
 01E2 80930000          sts _BlockPerSector,R24
 01E6           L66:
 01E6           L64:
 01E6           L62:
 01E6                   .dbline 222
 01E6           ; 
 01E6           ;       BytePerSector = BlockPerSector*CH375_BLOCK_SIZE;  /* 物理磁盘的扇区大小 */  // 512
 01E6 20900000          lds R2,_BlockPerSector
 01EA 80E4              ldi R24,64
 01EC 829D              mul R24,R2
 01EE 10920200          sts _BytePerSector+1,R1
 01F2 00920100          sts _BytePerSector,R0
 01F6                   .dbline 225
 01F6           ; 
 01F6           ; 
 01F6           ;       ShowNumber(2, 0,BytePerSector);
 01F6 1001              movw R2,R0
 01F8 3982              std y+1,R3
 01FA 2882              std y+0,R2
 01FC 2227              clr R18
 01FE 3327              clr R19
 0200 02E0              ldi R16,2
 0202 10E0              ldi R17,0
 0204 0E940000          xcall _ShowNumber
 0208                   .dbline 227
 0208           ;       
 0208           ;       CH375_WR_CMD_PORT( CMD_SET_PKT_P_SEC );  /* 设置USB存储器的每扇区数据包总数 */
 0208 0BE0              ldi R16,11
 020A 1CDF              xcall _CH375_WR_CMD_PORT
 020C                   .dbline 228
 020C           ;       CH375_WR_DAT_PORT( 0x39 );
 020C 09E3              ldi R16,57
 020E 2FDF              xcall _CH375_WR_DAT_PORT
 0210                   .dbline 229
 0210           ;       CH375_WR_DAT_PORT( BlockPerSector );  /* 设置每扇区数据包总数 */    //512
 0210 00910000          lds R16,_BlockPerSector
 0214 2CDF              xcall _CH375_WR_DAT_PORT
 0216                   .dbline 230
 0216           ;       return( 0 );  /* U盘已经成功初始化 */
 0216 0027              clr R16
 0218                   .dbline -2
 0218           L45:
 0218 2296              adiw R28,2
 021A 0E940000          xcall pop_gset1
 021E                   .dbline 0 ; func end
 021E 0895              ret
 0220                   .dbsym r mIntStatus 20 c
 0220                   .dbsym r i 20 c
 0220                   .dbend
 0220                   .dbfunc e mClearError _mClearError fV
                        .even
 0220           _mClearError::
 0220                   .dbline -1
 0220                   .dbline 235
 0220           ; }
 0220           ; 
 0220           ; /* 清除U盘错误以便重试 */
 0220           ; void  mClearError( void )
 0220           ; {
 0220                   .dbline 236
 0220           ;       mDelaymS( 10 );  /* 延时10mS */
 0220 0AE0              ldi R16,10
 0222 FDDE              xcall _mDelaymS
 0224                   .dbline 237
 0224           ;       CH375_WR_CMD_PORT( CMD_DISK_R_SENSE );  /* 检查USB存储器错误 */
 0224 0AE5              ldi R16,90
 0226 0EDF              xcall _CH375_WR_CMD_PORT
 0228                   .dbline 238
 0228           ;       mDelaymS( 10 );  /* 延时10mS */
 0228 0AE0              ldi R16,10
 022A F9DE              xcall _mDelaymS
 022C                   .dbline 239
 022C           ;       mWaitInterrupt( );  /* 等待中断并获取状态 */
 022C 47DF              xcall _mWaitInterrupt
 022E                   .dbline -2
 022E           L67:
 022E                   .dbline 0 ; func end
 022E 0895              ret
 0230                   .dbend
 0230                   .dbfunc e mReadSector _mReadSector fc
 0230           ;    mBlockCount -> R22,R23
 0230           ;     mIntStatus -> R20
 0230           ;   mBufferPoint -> R10,R11
 0230           ;            col -> R12,R13
 0230           ;              j -> y+2
 0230           ;        mLength -> R14
 0230           ;   iSectorCount -> y+18
 0230           ;      iLbaStart -> y+14
                        .even
 0230           _mReadSector::
 0230 0E940000          xcall push_arg4
 0234 0E940000          xcall push_gset5
 0238 2497              sbiw R28,4
 023A                   .dbline -1
 023A                   .dbline 245
 023A           ; }
 023A           ; 
 023A           ; /* 从U盘读取多个扇区的数据块到缓冲区 */
 023A           ; unsigned char mReadSector( unsigned long iLbaStart, unsigned char iSectorCount )
 023A           ; /* iLbaStart 是准备读取的线性起始扇区号, iSectorCount 是准备读取的扇区数 */
 023A           ; {
 023A                   .dbline 248
 023A           ;       unsigned char mIntStatus;
 023A           ;       unsigned char *mBufferPoint;
 023A           ;       unsigned int  mBlockCount,j=0,col=0;
 023A 0024              clr R0
 023C 1124              clr R1
 023E 1B82              std y+3,R1
 0240 0A82              std y+2,R0
 0242                   .dbline 248
 0242 CC24              clr R12
 0244 DD24              clr R13
 0246                   .dbline 250
 0246           ;       unsigned char mLength;
 0246           ;       CH375_WR_CMD_PORT( CMD_DISK_READ );  /* 从USB存储器读数据块 */
 0246 04E5              ldi R16,84
 0248 FDDE              xcall _CH375_WR_CMD_PORT
 024A                   .dbline 251
 024A           ;       CH375_WR_DAT_PORT( (unsigned char)iLbaStart );  /* LBA的最低8位 */
 024A FE01              movw R30,R28
 024C 0685              ldd R16,z+14
 024E 0FDF              xcall _CH375_WR_DAT_PORT
 0250                   .dbline 252
 0250           ;       CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) );
 0250 88E0              ldi R24,8
 0252 90E0              ldi R25,0
 0254 FE01              movw R30,R28
 0256 2684              ldd R2,z+14
 0258 3784              ldd R3,z+15
 025A 4088              ldd R4,z+16
 025C 5188              ldd R5,z+17
 025E 8A93              st -y,R24
 0260 8101              movw R16,R2
 0262 9201              movw R18,R4
 0264 0E940000          xcall lsr32
 0268 02DF              xcall _CH375_WR_DAT_PORT
 026A                   .dbline 253
 026A           ;       CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) );
 026A FE01              movw R30,R28
 026C 2684              ldd R2,z+14
 026E 3784              ldd R3,z+15
 0270 4088              ldd R4,z+16
 0272 5188              ldd R5,z+17
 0274 1201              movw R2,R4
 0276 4424              clr R4
 0278 5524              clr R5
 027A 022D              mov R16,R2
 027C F8DE              xcall _CH375_WR_DAT_PORT
 027E                   .dbline 254
 027E           ;       CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) );  /* LBA的最高8位 */
 027E 88E1              ldi R24,24
 0280 90E0              ldi R25,0
 0282 FE01              movw R30,R28
 0284 2684              ldd R2,z+14
 0286 3784              ldd R3,z+15
 0288 4088              ldd R4,z+16
 028A 5188              ldd R5,z+17
 028C 8A93              st -y,R24
 028E 8101              movw R16,R2
 0290 9201              movw R18,R4
 0292 0E940000          xcall lsr32
 0296 EBDE              xcall _CH375_WR_DAT_PORT
 0298                   .dbline 255
 0298           ;       CH375_WR_DAT_PORT( iSectorCount );  /* 扇区数 */
 0298 0A89              ldd R16,y+18
 029A E9DE              xcall _CH375_WR_DAT_PORT
 029C                   .dbline 256
 029C           ;       mBufferPoint = DATA_BUFFER;  /* 指向缓冲区起始地址 */
 029C 80E0              ldi R24,<_DATA_BUFFER
 029E 90E0              ldi R25,>_DATA_BUFFER
 02A0 5C01              movw R10,R24
 02A2                   .dbline 257
 02A2 20900000          lds R2,_BlockPerSector
 02A6 0A88              ldd R0,y+18
 02A8 029C              mul R0,R2
 02AA B001              movw R22,R0
 02AC 48C0              xjmp L72
 02AE           L69:
 02AE                   .dbline 257
 02AE           ;       for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount != 0; mBlockCount -- ) {  /* 数据块计数 */
 02AE                   .dbline 258
 02AE           ;               mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
 02AE 06DF              xcall _mWaitInterrupt
 02B0 402F              mov R20,R16
 02B2                   .dbline 259
 02B2           ;               if ( mIntStatus == USB_INT_DISK_READ ) {  /* USB存储器读数据块,请求数据读出 */
 02B2 0D31              cpi R16,29
 02B4 09F0              breq X6
 02B6 47C0              xjmp L71
 02B8           X6:
 02B8                   .dbline 259
 02B8                   .dbline 260
 02B8           ;                       CH375_WR_CMD_PORT( CMD_RD_USB_DATA );  /* 从CH375缓冲区读取数据块 */
 02B8 08E2              ldi R16,40
 02BA C4DE              xcall _CH375_WR_CMD_PORT
 02BC                   .dbline 261
 02BC           ;                 mLength = CH375_RD_DAT_PORT( );  /* 后续数据的长度 */
 02BC ECDE              xcall _CH375_RD_DAT_PORT
 02BE E02E              mov R14,R16
 02C0 37C0              xjmp L76
 02C2           L75:
 02C2                   .dbline 262
 02C2           ;                       while ( mLength ) {  /* 根据长度读取数据 */
 02C2                   .dbline 263
 02C2           ;                       DATA_BUFFER[mLength] = CH375_RD_DAT_PORT();  /* 读出数据并保存 */
 02C2 E9DE              xcall _CH375_RD_DAT_PORT
 02C4 80E0              ldi R24,<_DATA_BUFFER
 02C6 90E0              ldi R25,>_DATA_BUFFER
 02C8 EE2D              mov R30,R14
 02CA FF27              clr R31
 02CC E80F              add R30,R24
 02CE F91F              adc R31,R25
 02D0 0083              std z+0,R16
 02D2                   .dbline 264

⌨️ 快捷键说明

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