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

📄 ch375ev0.lis

📁 使用ATMEGA128加CH375对U盘扇区进行读写,本程序在ICCAVR上调试,并在相应硬件电路上调试通过!供参考用
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 02D2           ;                               if( 160+col < 230 )
 02D2 C601              movw R24,R12
 02D4 8056              subi R24,96  ; offset = 160
 02D6 9F4F              sbci R25,255
 02D8 863E              cpi R24,230
 02DA E0E0              ldi R30,0
 02DC 9E07              cpc R25,R30
 02DE 20F5              brsh L78
 02E0                   .dbline 265
 02E0           ;                                       {
 02E0                   .dbline 266
 02E0           ;                                    ShowNumber(j,160+col, DATA_BUFFER[mLength]);  //显示
 02E0 80E0              ldi R24,<_DATA_BUFFER
 02E2 90E0              ldi R25,>_DATA_BUFFER
 02E4 EE2D              mov R30,R14
 02E6 FF27              clr R31
 02E8 E80F              add R30,R24
 02EA F91F              adc R31,R25
 02EC 2080              ldd R2,z+0
 02EE 3324              clr R3
 02F0 3982              std y+1,R3
 02F2 2882              std y+0,R2
 02F4 9601              movw R18,R12
 02F6 2056              subi R18,96  ; offset = 160
 02F8 3F4F              sbci R19,255
 02FA 0A81              ldd R16,y+2
 02FC 1B81              ldd R17,y+3
 02FE 0E940000          xcall _ShowNumber
 0302                   .dbline 267
 0302           ;                                    j+=4;
 0302 8A81              ldd R24,y+2
 0304 9B81              ldd R25,y+3
 0306 0496              adiw R24,4
 0308 9B83              std y+3,R25
 030A 8A83              std y+2,R24
 030C                   .dbline 268
 030C           ;                                    if(j>37)
 030C 85E2              ldi R24,37
 030E 90E0              ldi R25,0
 0310 0A80              ldd R0,y+2
 0312 1B80              ldd R1,y+3
 0314 8015              cp R24,R0
 0316 9105              cpc R25,R1
 0318 38F4              brsh L80
 031A                   .dbline 269
 031A           ;                                           {
 031A                   .dbline 270
 031A           ;                                                    j=0;
 031A 0024              clr R0
 031C 1124              clr R1
 031E 1B82              std y+3,R1
 0320 0A82              std y+2,R0
 0322                   .dbline 271
 0322           ;                                              col+=16;
 0322 C601              movw R24,R12
 0324 4096              adiw R24,16
 0326 6C01              movw R12,R24
 0328                   .dbline 272
 0328           ;                                     }
 0328           L80:
 0328                   .dbline 273
 0328           ;                                 }
 0328           L78:
 0328                   .dbline 274
 0328 EA94              dec R14
 032A                   .dbline 275
 032A C501              movw R24,R10
 032C 0196              adiw R24,1
 032E 5C01              movw R10,R24
 0330                   .dbline 276
 0330           L76:
 0330                   .dbline 262
 0330 EE20              tst R14
 0332 09F0              breq X7
 0334 C6CF              xjmp L75
 0336           X7:
 0336                   .dbline 277
 0336           ;                               mLength--;
 0336           ;                               mBufferPoint++;
 0336           ;                       }
 0336           ;                       CH375_WR_CMD_PORT( CMD_DISK_RD_GO );  /* 继续执行USB存储器的读操作 */
 0336 05E5              ldi R16,85
 0338 85DE              xcall _CH375_WR_CMD_PORT
 033A                   .dbline 278
 033A           ;               }
 033A                   .dbline 279
 033A           ;               else break;  /* 返回错误状态 */
 033A           L74:
 033A                   .dbline 280
 033A           L70:
 033A                   .dbline 257
 033A 6150              subi R22,1
 033C 7040              sbci R23,0
 033E           L72:
 033E                   .dbline 257
 033E 6030              cpi R22,0
 0340 6707              cpc R22,R23
 0342 09F0              breq X8
 0344 B4CF              xjmp L69
 0346           X8:
 0346           X4:
 0346           L71:
 0346                   .dbline 281
 0346           ;       }
 0346           ;       if ( mBlockCount == 0 ) {
 0346 6030              cpi R22,0
 0348 6707              cpc R22,R23
 034A 31F4              brne L82
 034C           X5:
 034C                   .dbline 281
 034C                   .dbline 282
 034C           ;               mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
 034C B7DE              xcall _mWaitInterrupt
 034E 402F              mov R20,R16
 0350                   .dbline 283
 0350           ;               if ( mIntStatus == USB_INT_SUCCESS ) return( 0 );  /* 操作成功 */
 0350 0431              cpi R16,20
 0352 11F4              brne L84
 0354                   .dbline 283
 0354 0027              clr R16
 0356 02C0              xjmp L68
 0358           L84:
 0358                   .dbline 284
 0358           ;       }
 0358           L82:
 0358                   .dbline 286
 0358           ; //    if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus );  /* U盘断开 */
 0358           ;       mClearError( );  /* 清除U盘错误以便重试 */
 0358 63DF              xcall _mClearError
 035A                   .dbline 287
 035A           ;       return( mIntStatus );  /* 操作失败 */
 035A 042F              mov R16,R20
 035C                   .dbline -2
 035C           L68:
 035C 2496              adiw R28,4
 035E 0E940000          xcall pop_gset5
 0362 2496              adiw R28,4
 0364                   .dbline 0 ; func end
 0364 0895              ret
 0366                   .dbsym r mBlockCount 22 i
 0366                   .dbsym r mIntStatus 20 c
 0366                   .dbsym r mBufferPoint 10 pc
 0366                   .dbsym r col 12 i
 0366                   .dbsym l j 2 i
 0366                   .dbsym r mLength 14 c
 0366                   .dbsym l iSectorCount 18 c
 0366                   .dbsym l iLbaStart 14 l
 0366                   .dbend
 0366                   .dbfunc e mWriteSector _mWriteSector fc
 0366           ;            col -> R22,R23
 0366           ;              j -> R22,R23
 0366           ;    mBlockCount -> R22,R23
 0366           ;     mIntStatus -> R20
 0366           ;   mBufferPoint -> R10,R11
 0366           ;        mLength -> R12
 0366           ;   iSectorCount -> y+12
 0366           ;      iLbaStart -> y+8
                        .even
 0366           _mWriteSector::
 0366 0E940000          xcall push_arg4
 036A 0E940000          xcall push_gset4
 036E                   .dbline -1
 036E                   .dbline 293
 036E           ; }
 036E           ; 
 036E           ; /* 将缓冲区中的多个扇区的数据块写入U盘 */
 036E           ; unsigned char mWriteSector( unsigned long iLbaStart, unsigned char iSectorCount )
 036E           ; /* iLbaStart 是写入的线起始性扇区号, iSectorCount 是写入的扇区数 */
 036E           ; {
 036E                   .dbline 296
 036E           ;       unsigned char mIntStatus;
 036E           ;       unsigned char *mBufferPoint;
 036E           ;       unsigned int  mBlockCount,j=0,col=0;
 036E 6627              clr R22
 0370 7727              clr R23
 0372                   .dbline 296
 0372                   .dbline 298
 0372           ;       unsigned char mLength;
 0372           ;       CH375_WR_CMD_PORT( CMD_DISK_WRITE );  /* 向USB存储器写数据块 */
 0372 06E5              ldi R16,86
 0374 67DE              xcall _CH375_WR_CMD_PORT
 0376                   .dbline 299
 0376           ;       CH375_WR_DAT_PORT( (unsigned char)iLbaStart );  /* LBA的最低8位 */
 0376 FE01              movw R30,R28
 0378 0085              ldd R16,z+8
 037A 79DE              xcall _CH375_WR_DAT_PORT
 037C                   .dbline 300
 037C           ;       CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) );
 037C 88E0              ldi R24,8
 037E 90E0              ldi R25,0
 0380 FE01              movw R30,R28
 0382 2084              ldd R2,z+8
 0384 3184              ldd R3,z+9
 0386 4284              ldd R4,z+10
 0388 5384              ldd R5,z+11
 038A 8A93              st -y,R24
 038C 8101              movw R16,R2
 038E 9201              movw R18,R4
 0390 0E940000          xcall lsr32
 0394 6CDE              xcall _CH375_WR_DAT_PORT
 0396                   .dbline 301
 0396           ;       CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) );
 0396 FE01              movw R30,R28
 0398 2084              ldd R2,z+8
 039A 3184              ldd R3,z+9
 039C 4284              ldd R4,z+10
 039E 5384              ldd R5,z+11
 03A0 1201              movw R2,R4
 03A2 4424              clr R4
 03A4 5524              clr R5
 03A6 022D              mov R16,R2
 03A8 62DE              xcall _CH375_WR_DAT_PORT
 03AA                   .dbline 302
 03AA           ;       CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) );  /* LBA的最高8位 */
 03AA 88E1              ldi R24,24
 03AC 90E0              ldi R25,0
 03AE FE01              movw R30,R28
 03B0 2084              ldd R2,z+8
 03B2 3184              ldd R3,z+9
 03B4 4284              ldd R4,z+10
 03B6 5384              ldd R5,z+11
 03B8 8A93              st -y,R24
 03BA 8101              movw R16,R2
 03BC 9201              movw R18,R4
 03BE 0E940000          xcall lsr32
 03C2 55DE              xcall _CH375_WR_DAT_PORT
 03C4                   .dbline 303
 03C4           ;       CH375_WR_DAT_PORT( iSectorCount );  /* 扇区数 */
 03C4 0C85              ldd R16,y+12
 03C6 53DE              xcall _CH375_WR_DAT_PORT
 03C8                   .dbline 304
 03C8           ;       mBufferPoint = DATA_BUFFER;  /* 指向缓冲区起始地址 */
 03C8 80E0              ldi R24,<_DATA_BUFFER
 03CA 90E0              ldi R25,>_DATA_BUFFER
 03CC 5C01              movw R10,R24
 03CE                   .dbline 305
 03CE 20900000          lds R2,_BlockPerSector
 03D2 0C84              ldd R0,y+12
 03D4 029C              mul R0,R2
 03D6 B001              movw R22,R0
 03D8 1DC0              xjmp L90
 03DA           L87:
 03DA                   .dbline 305
 03DA           ;       for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount != 0; mBlockCount -- ) {  /* 数据块计数 */
 03DA                   .dbline 306
 03DA           ;               mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
 03DA 70DE              xcall _mWaitInterrupt
 03DC 402F              mov R20,R16
 03DE                   .dbline 307
 03DE           ;               if ( mIntStatus == USB_INT_DISK_WRITE ) {  /* USB存储器写数据块,请求数据写入 */
 03DE 0E31              cpi R16,30
 03E0 E1F4              brne L89
 03E2                   .dbline 307
 03E2                   .dbline 308
 03E2           ;                       CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 );  /* 向CH375缓冲区写入数据块 */
 03E2 0BE2              ldi R16,43
 03E4 2FDE              xcall _CH375_WR_CMD_PORT
 03E6                   .dbline 309
 03E6           ;                       mLength = CH375_BLOCK_SIZE;
 03E6 80E4              ldi R24,64
 03E8 C82E              mov R12,R24
 03EA                   .dbline 310
 03EA           ;                       CH375_WR_DAT_PORT( mLength );  /* 后续数据的长度 */
 03EA 082F              mov R16,R24
 03EC 40DE              xcall _CH375_WR_DAT_PORT
 03EE 0CC0              xjmp L94
 03F0           L93:
 03F0                   .dbline 311
 03F0                   .dbline 312
 03F0 80E0              ldi R24,<_DATA_BUFFER
 03F2 90E0              ldi R25,>_DATA_BUFFER
 03F4 EC2D              mov R30,R12
 03F6 FF27              clr R31
 03F8 E80F              add R30,R24
 03FA F91F              adc R31,R25
 03FC 0081              ldd R16,z+0
 03FE 37DE              xcall _CH375_WR_DAT_PORT
 0400                   .dbline 323
 0400 C501              movw R24,R10
 0402 0196              adiw R24,1
 0404 5C01              movw R10,R24
 0406                   .dbline 324
 0406 CA94              dec R12
 0408                   .dbline 325
 0408           L94:
 0408                   .dbline 311
 0408           ;                 while ( mLength ) {  //根据长度写入数据 
 0408 CC20              tst R12
 040A 91F7              brne L93
 040C                   .dbline 330
 040C           ;                               CH375_WR_DAT_PORT( DATA_BUFFER[mLength]); // 将数据写入 
 040C           ;                       /*      if( 160+col < 240 )
 040C           ;                                       {
 040C           ;                                    ShowNumber(j,160+col,*mBufferPoint);  //显示  *mBufferPoint
 040C           ;                                    j+=4;
 040C           ;                                    if(j>37)
 040C           ;                                           {
 040C           ;                                                    j=0;

⌨️ 快捷键说明

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