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

📄 urw.lst

📁 使用ATMEGA128加CH375对U盘扇区进行读写,本程序在ICCAVR上调试,并在相应硬件电路上调试通过!供参考用
💻 LST
📖 第 1 页 / 共 5 页
字号:
    015C 9508      RET
_mInitDisk:
  mIntStatus           --> R20
  i                    --> R20
    015D 940E06FB  CALL	push_gset1
    015F 9722      SBIW	R28,2
(0180) 	  } /* CH375出错,例如芯片型号错或者处于串口方式或者不支持 */
(0181) }
(0182) 
(0183) /* 初始化磁盘 */
(0184) unsigned char	mInitDisk( )
(0185) {
(0186) 	unsigned char mIntStatus, i;
(0187) 	CH375_WR_CMD_PORT( CMD_GET_STATUS );  /* 产生操作完成中断, 获取中断状态 */
    0160 E202      LDI	R16,0x22
    0161 DF77      RCALL	_CH375_WR_CMD_PORT
(0188) 	mIntStatus = CH375_RD_DAT_PORT( );  //获取中断状态
    0162 DF9F      RCALL	_CH375_RD_DAT_PORT
    0163 2F40      MOV	R20,R16
(0189) 	if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus );  /* USB设备断开 */
    0164 3106      CPI	R16,0x16
    0165 F409      BNE	0x0167
    0166 C05C      RJMP	0x01C3
(0190) 	CH375_WR_CMD_PORT( CMD_DISK_INIT );  /* 初始化USB存储器 */
    0167 E501      LDI	R16,0x51
    0168 DF70      RCALL	_CH375_WR_CMD_PORT
(0191) 	mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
    0169 DFAB      RCALL	_mWaitInterrupt
    016A 2F40      MOV	R20,R16
(0192) 	if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus );  /* 出现错误 */
    016B 3104      CPI	R16,0x14
    016C F009      BEQ	0x016E
    016D C055      RJMP	0x01C3
(0193) 	CH375_WR_CMD_PORT( CMD_DISK_SIZE );  /* 获取USB存储器的容量 */
    016E E503      LDI	R16,0x53
    016F DF69      RCALL	_CH375_WR_CMD_PORT
(0194) 	mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
    0170 DFA4      RCALL	_mWaitInterrupt
    0171 2F40      MOV	R20,R16
(0195) 	if ( mIntStatus != USB_INT_SUCCESS ) 
    0172 3104      CPI	R16,0x14
    0173 F031      BEQ	0x017A
(0196) 		{  /* 出错重试 */
(0197) 		  mDelaymS( 200 );
    0174 EC08      LDI	R16,0xC8
    0175 DF50      RCALL	_mDelaymS
(0198) 		  CH375_WR_CMD_PORT( CMD_DISK_SIZE );  /* 获取USB存储器的容量 */
    0176 E503      LDI	R16,0x53
    0177 DF61      RCALL	_CH375_WR_CMD_PORT
(0199) 		  mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
    0178 DF9C      RCALL	_mWaitInterrupt
    0179 2F40      MOV	R20,R16
(0200) 	  }
(0201) 	if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus );  /* 出现错误 */
    017A 3144      CPI	R20,0x14
    017B F011      BEQ	0x017E
    017C 2F04      MOV	R16,R20
    017D C045      RJMP	0x01C3
(0202) 
(0203) /* 可以由CMD_RD_USB_DATA命令将容量数据读出,分析每扇区字节数 */
(0204) 	CH375_WR_CMD_PORT( CMD_RD_USB_DATA );  /* 从CH375缓冲区读取数据块 */
    017E E208      LDI	R16,0x28
    017F DF59      RCALL	_CH375_WR_CMD_PORT
(0205) 	i = CH375_RD_DAT_PORT( );  /* 后续数据的长度 */
    0180 DF81      RCALL	_CH375_RD_DAT_PORT
    0181 2F40      MOV	R20,R16
(0206) 	if ( i != 8 ) return( USB_INT_DISK_ERR );  /* 异常 */
    0182 3008      CPI	R16,0x8
    0183 F011      BEQ	0x0186
    0184 E10F      LDI	R16,0x1F
    0185 C03D      RJMP	0x01C3
(0207) 	for ( i = 0; i != 8; i ++ )
    0186 2744      CLR	R20
    0187 C009      RJMP	0x0191
(0208) 	 {  /* 根据长度读取数据 */
(0209) 		  DATA_BUFFER[ i ] = CH375_RD_DAT_PORT( );  /* 读出数据并保存 */
    0188 DF79      RCALL	_CH375_RD_DAT_PORT
    0189 EA83      LDI	R24,0xA3
    018A E091      LDI	R25,1
    018B 2FE4      MOV	R30,R20
    018C 27FF      CLR	R31
    018D 0FE8      ADD	R30,R24
    018E 1FF9      ADC	R31,R25
    018F 8300      STD	Z+0,R16
    0190 9543      INC	R20
    0191 3048      CPI	R20,0x8
    0192 F7A9      BNE	0x0188
(0210) 	 }
(0211) 	i = DATA_BUFFER[ 6 ];  /* U盘容量数据中的每扇区字节数,大端格式 */
    0193 914001A9  LDS	R20,0x1A9
(0212) 
(0213) 	if ( i == 0x04 )
    0195 3044      CPI	R20,4
    0196 F421      BNE	0x019B
(0214) 		  BlockPerSector = 1024/CH375_BLOCK_SIZE;  /* 磁盘的物理扇区是1K字节 */
    0197 E180      LDI	R24,0x10
    0198 938001A0  STS	BlockPerSector,R24
    019A C00F      RJMP	0x01AA
(0215) 	else if ( i == 0x08 ) 
    019B 3048      CPI	R20,0x8
    019C F421      BNE	0x01A1
(0216) 		  BlockPerSector = 2048/CH375_BLOCK_SIZE;  /* 磁盘的物理扇区是2K字节 */
    019D E280      LDI	R24,0x20
    019E 938001A0  STS	BlockPerSector,R24
    01A0 C009      RJMP	0x01AA
(0217) 	else if ( i == 0x10 ) 
    01A1 3140      CPI	R20,0x10
    01A2 F421      BNE	0x01A7
(0218) 		  BlockPerSector = 4096/CH375_BLOCK_SIZE;  /* 磁盘的物理扇区是4K字节 */
    01A3 E480      LDI	R24,0x40
    01A4 938001A0  STS	BlockPerSector,R24
    01A6 C003      RJMP	0x01AA
(0219) 	else 
(0220) 		  BlockPerSector = 512/CH375_BLOCK_SIZE;  /* 默认的磁盘的物理扇区是512字节 */
    01A7 E088      LDI	R24,0x8
    01A8 938001A0  STS	BlockPerSector,R24
(0221) 
(0222) 	BytePerSector = BlockPerSector*CH375_BLOCK_SIZE;  /* 物理磁盘的扇区大小 */  // 512
    01AA 902001A0  LDS	R2,BlockPerSector
    01AC E480      LDI	R24,0x40
    01AD 9D82      MUL	R24,R2
    01AE 921001A2  STS	BytePerSector+1,R1
    01B0 920001A1  STS	BytePerSector,R0
(0223) 
(0224) 
(0225) 	ShowNumber(2, 0,BytePerSector);
    01B2 0110      MOVW	R2,R0
    01B3 8239      STD	Y+1,R3
    01B4 8228      STD	Y+0,R2
    01B5 2722      CLR	R18
    01B6 2733      CLR	R19
    01B7 E002      LDI	R16,2
    01B8 E010      LDI	R17,0
    01B9 940E059A  CALL	_ShowNumber
(0226) 	
(0227) 	CH375_WR_CMD_PORT( CMD_SET_PKT_P_SEC );  /* 设置USB存储器的每扇区数据包总数 */
    01BB E00B      LDI	R16,0xB
    01BC DF1C      RCALL	_CH375_WR_CMD_PORT
(0228) 	CH375_WR_DAT_PORT( 0x39 );
    01BD E309      LDI	R16,0x39
    01BE DF2F      RCALL	_CH375_WR_DAT_PORT
(0229) 	CH375_WR_DAT_PORT( BlockPerSector );  /* 设置每扇区数据包总数 */    //512
    01BF 910001A0  LDS	R16,BlockPerSector
    01C1 DF2C      RCALL	_CH375_WR_DAT_PORT
(0230) 	return( 0 );  /* U盘已经成功初始化 */
    01C2 2700      CLR	R16
    01C3 9622      ADIW	R28,2
    01C4 940E06FE  CALL	pop_gset1
    01C6 9508      RET
(0231) }
(0232) 
(0233) /* 清除U盘错误以便重试 */
(0234) void	mClearError( void )
(0235) {
(0236) 	mDelaymS( 10 );  /* 延时10mS */
_mClearError:
    01C7 E00A      LDI	R16,0xA
    01C8 DEFD      RCALL	_mDelaymS
(0237) 	CH375_WR_CMD_PORT( CMD_DISK_R_SENSE );  /* 检查USB存储器错误 */
    01C9 E50A      LDI	R16,0x5A
    01CA DF0E      RCALL	_CH375_WR_CMD_PORT
(0238) 	mDelaymS( 10 );  /* 延时10mS */
    01CB E00A      LDI	R16,0xA
    01CC DEF9      RCALL	_mDelaymS
(0239) 	mWaitInterrupt( );  /* 等待中断并获取状态 */
    01CD DF47      RCALL	_mWaitInterrupt
    01CE 9508      RET
_mReadSector:
  mBlockCount          --> R22
  mIntStatus           --> R20
  mBufferPoint         --> R10
  col                  --> R12
  j                    --> Y+2
  mLength              --> R14
  iSectorCount         --> Y+18
  iLbaStart            --> Y+14
    01CF 940E0655  CALL	push_arg4
    01D1 940E06F3  CALL	push_gset5
    01D3 9724      SBIW	R28,4
(0240) }
(0241) 
(0242) /* 从U盘读取多个扇区的数据块到缓冲区 */
(0243) unsigned char	mReadSector( unsigned long iLbaStart, unsigned char iSectorCount )
(0244) /* iLbaStart 是准备读取的线性起始扇区号, iSectorCount 是准备读取的扇区数 */
(0245) {
(0246) 	unsigned char mIntStatus;
(0247) 	unsigned char *mBufferPoint;
(0248) 	unsigned int  mBlockCount,j=0,col=0;
    01D4 2400      CLR	R0
    01D5 2411      CLR	R1
    01D6 821B      STD	Y+3,R1
    01D7 820A      STD	Y+2,R0
    01D8 24CC      CLR	R12
    01D9 24DD      CLR	R13
(0249) 	unsigned char mLength;
(0250) 	CH375_WR_CMD_PORT( CMD_DISK_READ );  /* 从USB存储器读数据块 */
    01DA E504      LDI	R16,0x54
    01DB DEFD      RCALL	_CH375_WR_CMD_PORT
(0251) 	CH375_WR_DAT_PORT( (unsigned char)iLbaStart );  /* LBA的最低8位 */
    01DC 01FE      MOVW	R30,R28
    01DD 8506      LDD	R16,Z+14
    01DE DF0F      RCALL	_CH375_WR_DAT_PORT
(0252) 	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) );
    01DF E088      LDI	R24,0x8
    01E0 E090      LDI	R25,0
    01E1 01FE      MOVW	R30,R28
    01E2 8426      LDD	R2,Z+14
    01E3 8437      LDD	R3,Z+15
    01E4 8840      LDD	R4,Z+16
    01E5 8851      LDD	R5,Z+17
    01E6 938A      ST	R24,-Y
    01E7 0181      MOVW	R16,R2
    01E8 0192      MOVW	R18,R4
    01E9 940E0712  CALL	lsr32
    01EB DF02      RCALL	_CH375_WR_DAT_PORT
(0253) 	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) );
    01EC 01FE      MOVW	R30,R28
    01ED 8426      LDD	R2,Z+14
    01EE 8437      LDD	R3,Z+15
    01EF 8840      LDD	R4,Z+16
    01F0 8851      LDD	R5,Z+17
    01F1 0112      MOVW	R2,R4
    01F2 2444      CLR	R4
    01F3 2455      CLR	R5
    01F4 2D02      MOV	R16,R2
    01F5 DEF8      RCALL	_CH375_WR_DAT_PORT
(0254) 	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) );  /* LBA的最高8位 */
    01F6 E188      LDI	R24,0x18
    01F7 E090      LDI	R25,0
    01F8 01FE      MOVW	R30,R28
    01F9 8426      LDD	R2,Z+14
    01FA 8437      LDD	R3,Z+15
    01FB 8840      LDD	R4,Z+16
    01FC 8851      LDD	R5,Z+17
    01FD 938A      ST	R24,-Y
    01FE 0181      MOVW	R16,R2
    01FF 0192      MOVW	R18,R4
    0200 940E0712  CALL	lsr32
    0202 DEEB      RCALL	_CH375_WR_DAT_PORT
(0255) 	CH375_WR_DAT_PORT( iSectorCount );  /* 扇区数 */
    0203 890A      LDD	R16,Y+18
    0204 DEE9      RCALL	_CH375_WR_DAT_PORT
(0256) 	mBufferPoint = DATA_BUFFER;  /* 指向缓冲区起始地址 */
    0205 EA83      LDI	R24,0xA3
    0206 E091      LDI	R25,1
    0207 015C      MOVW	R10,R24
(0257) 	for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount != 0; mBlockCount -- ) {  /* 数据块计数 */
    0208 902001A0  LDS	R2,BlockPerSector
    020A 880A      LDD	R0,Y+18
    020B 9C02      MUL	R0,R2
    020C 01B0      MOVW	R22,R0
    020D C048      RJMP	0x0256
(0258) 		mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
    020E DF06      RCALL	_mWaitInterrupt
    020F 2F40      MOV	R20,R16
(0259) 		if ( mIntStatus == USB_INT_DISK_READ ) {  /* USB存储器读数据块,请求数据读出 */
    0210 310D      CPI	R16,0x1D
    0211 F009      BEQ	0x0213
    0212 C047      RJMP	0x025A
(0260) 			CH375_WR_CMD_PORT( CMD_RD_USB_DATA );  /* 从CH375缓冲区读取数据块 */
    0213 E208      LDI	R16,0x28
    0214 DEC4      RCALL	_CH375_WR_CMD_PORT
(0261) 		  mLength = CH375_RD_DAT_PORT( );  /* 后续数据的长度 */
    0215 DEEC      RCALL	_CH375_RD_DAT_PORT
    0216 2EE0      MOV	R14,R16
    0217 C037      RJMP	0x024F
(0262) 			while ( mLength ) {  /* 根据长度读取数据 */
(0263) 			DATA_BUFFER[mLength] = CH375_RD_DAT_PORT();  /* 读出数据并保存 */
    0218 DEE9      RCALL	_CH375_RD_DAT_PORT
    0219 EA83      LDI	R24,0xA3
    021A E091      LDI	R25,1
    021B 2DEE      MOV	R30,R14
    021C 27FF      CLR	R31
    021D 0FE8      ADD	R30,R24
    021E 1FF9      ADC	R31,R25
    021F 8300      STD	Z+0,R16
(0264) 				if( 160+col < 230 )
    0220 01C6      MOVW	R24,R12
    0221 5680      SUBI	R24,0x60
    0222 4F9F      SBCI	R25,0xFF
    0223 3E86      CPI	R24,0xE6
    0224 E0E0      LDI	R30,0
    0225 079E      CPC	R25,R30
    0226 F520      BCC	0x024B
(0265) 					{
(0266) 				     ShowNumber(j,160+col, DATA_BUFFER[mLength]);  //显示
    0227 EA83      LDI	R24,0xA3
    0228 E091      LDI	R25,1
    0229 2DEE      MOV	R30,R14
    022A 27FF      CLR	R31
    022B 0FE8      ADD	R30,R24
    022C 1FF9      ADC	R31,R25
    022D 8020      LDD	R2,Z+0
    022E 2433      CLR	R3
    022F 8239      STD	Y+1,R3
    0230 8228      STD	Y+0,R2
    0231 0196      MOVW	R18,R12
    0232 5620      SUBI	R18,0x60
    0233 4F3F      SBCI	R19,0xFF
    0234 810A      LDD	R16,Y+2
    0235 811B      LDD	R17,Y+3
    0236 940E059A  CALL	_ShowNumber
(0267) 				     j+=4;
    0238 818A      LDD	R24,Y+2
    0239 819B      LDD	R25,Y+3
    023A 9604      ADIW	R24,4
    023B 839B      STD	Y+3,R25
    023C 838A      STD	Y+2,R24
(0268) 				     if(j>37)
    023D E285      LDI	R24,0x25
    023E E090      LDI	R25,0
    023F 800A      LDD	R0,Y+2
    0240 801B      LDD	R1,Y+3
    0241 1580      CP	R24,R0
    0242 0591      CPC	R25,R1
    0243 F438      BCC	0x024B
(0269) 					    {
(0270) 						     j=0;
    0244 2400      CLR	R0
    0245 2411      CLR	R1
    0246 821B      STD	Y+3,R1
    0247 820A      STD	Y+2,R0
(0271) 					       col+=16;
    0248 01C6      MOVW	R24,R12
    0249 9640      ADIW	R24,0x10
    024A 016C      MOVW	R12,R24
(0272) 				      }
(0273) 				  }
(0274) 				mLength--;
    024B 94EA      DEC	R14
(0275) 				mBufferPoint++;
    024C 01C5      MOVW	R24,R10
    024D 9601      ADIW	R24,1
    024E 015C      MOVW	R10,R24
    024F 20EE      TST	R14
    0250 F009      BEQ	0x0252
    0251 CFC6      RJMP	0x0218
(0276) 			}
(0277) 			CH375_WR_CMD_PORT( CMD_DISK_RD_GO );  /* 继续执行USB存储器的读操作 */
    0252 E505      LDI	R16,0x55
    0253 DE85      RCALL	_CH375_WR_CMD_PORT
    0254 5061      SUBI	R22,1
    0255 4070      SBCI	R23,0
    0256 3060      CPI	R22,0
    0257 0767      CPC	R22,R23
    0258 F009      BEQ	0x025A
    0259 CFB4      RJMP	0x020E
(0278) 		}
(0279) 		else break;  /* 返回错误状态 */
(0280) 	}
(0281) 	if ( mBlockCount == 0 ) {
    025A 3060      CPI	R22,0
    025B 0767      CPC	R22,R23
    025C F431      BNE	0x0263
(0282) 		mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
    025D DEB7      RCALL	_mWaitInterrupt
    025E 2F40      MOV	R20,R16
(0283) 		if ( mIntStatus == USB_INT_SUCCESS ) return( 0 );  /* 操作成功 */
    025F 3104      CPI	R16,0x14
    0260 F411      BNE	0x0263
    0261 2700      CLR	R16
    0262 C002      RJMP	0x0265
(0284) 	}
(0285) //	if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus );  /* U盘断开 */
(0286) 	mClearError( );  /* 清除U盘错误以便重试 */
    0263 DF63      RCALL	_mClearError
(0287) 	return( mIntStatus );  /* 操作失败 */
    0264 2F04      MOV	R16,R20

⌨️ 快捷键说明

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