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

📄 ch375ev0.s

📁 使用ATMEGA128加CH375对U盘扇区进行读写,本程序在ICCAVR上调试,并在相应硬件电路上调试通过!供参考用
💻 S
📖 第 1 页 / 共 3 页
字号:
; 	if ( i == 0x04 )
	cpi R20,4
	brne L61
	.dbline 214
; 		  BlockPerSector = 1024/CH375_BLOCK_SIZE;  /* 磁盘的物理扇区是1K字节 */
	ldi R24,16
	sts _BlockPerSector,R24
	xjmp L62
L61:
	.dbline 215
; 	else if ( i == 0x08 ) 
	cpi R20,8
	brne L63
	.dbline 216
; 		  BlockPerSector = 2048/CH375_BLOCK_SIZE;  /* 磁盘的物理扇区是2K字节 */
	ldi R24,32
	sts _BlockPerSector,R24
	xjmp L64
L63:
	.dbline 217
; 	else if ( i == 0x10 ) 
	cpi R20,16
	brne L65
	.dbline 218
; 		  BlockPerSector = 4096/CH375_BLOCK_SIZE;  /* 磁盘的物理扇区是4K字节 */
	ldi R24,64
	sts _BlockPerSector,R24
	xjmp L66
L65:
	.dbline 220
; 	else 
; 		  BlockPerSector = 512/CH375_BLOCK_SIZE;  /* 默认的磁盘的物理扇区是512字节 */
	ldi R24,8
	sts _BlockPerSector,R24
L66:
L64:
L62:
	.dbline 222
; 
; 	BytePerSector = BlockPerSector*CH375_BLOCK_SIZE;  /* 物理磁盘的扇区大小 */  // 512
	lds R2,_BlockPerSector
	ldi R24,64
	mul R24,R2
	sts _BytePerSector+1,R1
	sts _BytePerSector,R0
	.dbline 225
; 
; 
; 	ShowNumber(2, 0,BytePerSector);
	movw R2,R0
	std y+1,R3
	std y+0,R2
	clr R18
	clr R19
	ldi R16,2
	ldi R17,0
	xcall _ShowNumber
	.dbline 227
; 	
; 	CH375_WR_CMD_PORT( CMD_SET_PKT_P_SEC );  /* 设置USB存储器的每扇区数据包总数 */
	ldi R16,11
	xcall _CH375_WR_CMD_PORT
	.dbline 228
; 	CH375_WR_DAT_PORT( 0x39 );
	ldi R16,57
	xcall _CH375_WR_DAT_PORT
	.dbline 229
; 	CH375_WR_DAT_PORT( BlockPerSector );  /* 设置每扇区数据包总数 */    //512
	lds R16,_BlockPerSector
	xcall _CH375_WR_DAT_PORT
	.dbline 230
; 	return( 0 );  /* U盘已经成功初始化 */
	clr R16
	.dbline -2
L45:
	adiw R28,2
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r mIntStatus 20 c
	.dbsym r i 20 c
	.dbend
	.dbfunc e mClearError _mClearError fV
	.even
_mClearError::
	.dbline -1
	.dbline 235
; }
; 
; /* 清除U盘错误以便重试 */
; void	mClearError( void )
; {
	.dbline 236
; 	mDelaymS( 10 );  /* 延时10mS */
	ldi R16,10
	xcall _mDelaymS
	.dbline 237
; 	CH375_WR_CMD_PORT( CMD_DISK_R_SENSE );  /* 检查USB存储器错误 */
	ldi R16,90
	xcall _CH375_WR_CMD_PORT
	.dbline 238
; 	mDelaymS( 10 );  /* 延时10mS */
	ldi R16,10
	xcall _mDelaymS
	.dbline 239
; 	mWaitInterrupt( );  /* 等待中断并获取状态 */
	xcall _mWaitInterrupt
	.dbline -2
L67:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e mReadSector _mReadSector fc
;    mBlockCount -> R22,R23
;     mIntStatus -> R20
;   mBufferPoint -> R10,R11
;            col -> R12,R13
;              j -> y+2
;        mLength -> R14
;   iSectorCount -> y+18
;      iLbaStart -> y+14
	.even
_mReadSector::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,4
	.dbline -1
	.dbline 245
; }
; 
; /* 从U盘读取多个扇区的数据块到缓冲区 */
; unsigned char	mReadSector( unsigned long iLbaStart, unsigned char iSectorCount )
; /* iLbaStart 是准备读取的线性起始扇区号, iSectorCount 是准备读取的扇区数 */
; {
	.dbline 248
; 	unsigned char mIntStatus;
; 	unsigned char *mBufferPoint;
; 	unsigned int  mBlockCount,j=0,col=0;
	clr R0
	clr R1
	std y+3,R1
	std y+2,R0
	.dbline 248
	clr R12
	clr R13
	.dbline 250
; 	unsigned char mLength;
; 	CH375_WR_CMD_PORT( CMD_DISK_READ );  /* 从USB存储器读数据块 */
	ldi R16,84
	xcall _CH375_WR_CMD_PORT
	.dbline 251
; 	CH375_WR_DAT_PORT( (unsigned char)iLbaStart );  /* LBA的最低8位 */
	movw R30,R28
	ldd R16,z+14
	xcall _CH375_WR_DAT_PORT
	.dbline 252
; 	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) );
	ldi R24,8
	ldi R25,0
	movw R30,R28
	ldd R2,z+14
	ldd R3,z+15
	ldd R4,z+16
	ldd R5,z+17
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	xcall _CH375_WR_DAT_PORT
	.dbline 253
; 	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) );
	movw R30,R28
	ldd R2,z+14
	ldd R3,z+15
	ldd R4,z+16
	ldd R5,z+17
	movw R2,R4
	clr R4
	clr R5
	mov R16,R2
	xcall _CH375_WR_DAT_PORT
	.dbline 254
; 	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) );  /* LBA的最高8位 */
	ldi R24,24
	ldi R25,0
	movw R30,R28
	ldd R2,z+14
	ldd R3,z+15
	ldd R4,z+16
	ldd R5,z+17
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	xcall _CH375_WR_DAT_PORT
	.dbline 255
; 	CH375_WR_DAT_PORT( iSectorCount );  /* 扇区数 */
	ldd R16,y+18
	xcall _CH375_WR_DAT_PORT
	.dbline 256
; 	mBufferPoint = DATA_BUFFER;  /* 指向缓冲区起始地址 */
	ldi R24,<_DATA_BUFFER
	ldi R25,>_DATA_BUFFER
	movw R10,R24
	.dbline 257
	lds R2,_BlockPerSector
	ldd R0,y+18
	mul R0,R2
	movw R22,R0
	xjmp L72
L69:
	.dbline 257
; 	for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount != 0; mBlockCount -- ) {  /* 数据块计数 */
	.dbline 258
; 		mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
	xcall _mWaitInterrupt
	mov R20,R16
	.dbline 259
; 		if ( mIntStatus == USB_INT_DISK_READ ) {  /* USB存储器读数据块,请求数据读出 */
	cpi R16,29
	breq X6
	xjmp L71
X6:
	.dbline 259
	.dbline 260
; 			CH375_WR_CMD_PORT( CMD_RD_USB_DATA );  /* 从CH375缓冲区读取数据块 */
	ldi R16,40
	xcall _CH375_WR_CMD_PORT
	.dbline 261
; 		  mLength = CH375_RD_DAT_PORT( );  /* 后续数据的长度 */
	xcall _CH375_RD_DAT_PORT
	mov R14,R16
	xjmp L76
L75:
	.dbline 262
; 			while ( mLength ) {  /* 根据长度读取数据 */
	.dbline 263
; 			DATA_BUFFER[mLength] = CH375_RD_DAT_PORT();  /* 读出数据并保存 */
	xcall _CH375_RD_DAT_PORT
	ldi R24,<_DATA_BUFFER
	ldi R25,>_DATA_BUFFER
	mov R30,R14
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 264
; 				if( 160+col < 230 )
	movw R24,R12
	subi R24,96  ; offset = 160
	sbci R25,255
	cpi R24,230
	ldi R30,0
	cpc R25,R30
	brsh L78
	.dbline 265
; 					{
	.dbline 266
; 				     ShowNumber(j,160+col, DATA_BUFFER[mLength]);  //显示
	ldi R24,<_DATA_BUFFER
	ldi R25,>_DATA_BUFFER
	mov R30,R14
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	std y+1,R3
	std y+0,R2
	movw R18,R12
	subi R18,96  ; offset = 160
	sbci R19,255
	ldd R16,y+2
	ldd R17,y+3
	xcall _ShowNumber
	.dbline 267
; 				     j+=4;
	ldd R24,y+2
	ldd R25,y+3
	adiw R24,4
	std y+3,R25
	std y+2,R24
	.dbline 268
; 				     if(j>37)
	ldi R24,37
	ldi R25,0
	ldd R0,y+2
	ldd R1,y+3
	cp R24,R0
	cpc R25,R1
	brsh L80
	.dbline 269
; 					    {
	.dbline 270
; 						     j=0;
	clr R0
	clr R1
	std y+3,R1
	std y+2,R0
	.dbline 271
; 					       col+=16;
	movw R24,R12
	adiw R24,16
	movw R12,R24
	.dbline 272
; 				      }
L80:
	.dbline 273
; 				  }
L78:
	.dbline 274
	dec R14
	.dbline 275
	movw R24,R10
	adiw R24,1
	movw R10,R24
	.dbline 276
L76:
	.dbline 262
	tst R14
	breq X7
	xjmp L75
X7:
	.dbline 277
; 				mLength--;
; 				mBufferPoint++;
; 			}
; 			CH375_WR_CMD_PORT( CMD_DISK_RD_GO );  /* 继续执行USB存储器的读操作 */
	ldi R16,85
	xcall _CH375_WR_CMD_PORT
	.dbline 278
; 		}
	.dbline 279
; 		else break;  /* 返回错误状态 */
L74:
	.dbline 280
L70:
	.dbline 257
	subi R22,1
	sbci R23,0
L72:
	.dbline 257
	cpi R22,0
	cpc R22,R23
	breq X8
	xjmp L69
X8:
X4:
L71:
	.dbline 281
; 	}
; 	if ( mBlockCount == 0 ) {
	cpi R22,0
	cpc R22,R23
	brne L82
X5:
	.dbline 281
	.dbline 282
; 		mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
	xcall _mWaitInterrupt
	mov R20,R16
	.dbline 283
; 		if ( mIntStatus == USB_INT_SUCCESS ) return( 0 );  /* 操作成功 */
	cpi R16,20
	brne L84
	.dbline 283
	clr R16
	xjmp L68
L84:
	.dbline 284
; 	}
L82:
	.dbline 286
; //	if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus );  /* U盘断开 */
; 	mClearError( );  /* 清除U盘错误以便重试 */
	xcall _mClearError
	.dbline 287
; 	return( mIntStatus );  /* 操作失败 */
	mov R16,R20
	.dbline -2
L68:
	adiw R28,4
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r mBlockCount 22 i
	.dbsym r mIntStatus 20 c
	.dbsym r mBufferPoint 10 pc
	.dbsym r col 12 i
	.dbsym l j 2 i
	.dbsym r mLength 14 c
	.dbsym l iSectorCount 18 c
	.dbsym l iLbaStart 14 l
	.dbend
	.dbfunc e mWriteSector _mWriteSector fc
;            col -> R22,R23
;              j -> R22,R23
;    mBlockCount -> R22,R23
;     mIntStatus -> R20
;   mBufferPoint -> R10,R11
;        mLength -> R12
;   iSectorCount -> y+12
;      iLbaStart -> y+8
	.even
_mWriteSector::
	xcall push_arg4
	xcall push_gset4
	.dbline -1
	.dbline 293
; }
; 
; /* 将缓冲区中的多个扇区的数据块写入U盘 */
; unsigned char	mWriteSector( unsigned long iLbaStart, unsigned char iSectorCount )
; /* iLbaStart 是写入的线起始性扇区号, iSectorCount 是写入的扇区数 */
; {
	.dbline 296
; 	unsigned char mIntStatus;
; 	unsigned char *mBufferPoint;
; 	unsigned int  mBlockCount,j=0,col=0;
	clr R22
	clr R23
	.dbline 296
	.dbline 298
; 	unsigned char mLength;
; 	CH375_WR_CMD_PORT( CMD_DISK_WRITE );  /* 向USB存储器写数据块 */
	ldi R16,86
	xcall _CH375_WR_CMD_PORT
	.dbline 299
; 	CH375_WR_DAT_PORT( (unsigned char)iLbaStart );  /* LBA的最低8位 */
	movw R30,R28
	ldd R16,z+8
	xcall _CH375_WR_DAT_PORT
	.dbline 300
; 	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) );
	ldi R24,8
	ldi R25,0
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	xcall _CH375_WR_DAT_PORT
	.dbline 301
; 	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) );
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	movw R2,R4
	clr R4
	clr R5
	mov R16,R2
	xcall _CH375_WR_DAT_PORT
	.dbline 302
; 	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) );  /* LBA的最高8位 */
	ldi R24,24
	ldi R25,0
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	xcall _CH375_WR_DAT_PORT
	.dbline 303
; 	CH375_WR_DAT_PORT( iSectorCount );  /* 扇区数 */
	ldd R16,y+12
	xcall _CH375_WR_DAT_PORT
	.dbline 304
; 	mBufferPoint = DATA_BUFFER;  /* 指向缓冲区起始地址 */
	ldi R24,<_DATA_BUFFER
	ldi R25,>_DATA_BUFFER
	movw R10,R24
	.dbline 305
	lds R2,_BlockPerSector
	ldd R0,y+12
	mul R0,R2
	movw R22,R0
	xjmp L90
L87:
	.dbline 305
; 	for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount != 0; mBlockCount -- ) {  /* 数据块计数 */
	.dbline 306
; 		mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
	xcall _mWaitInterrupt
	mov R20,R16
	.dbline 307
; 		if ( mIntStatus == USB_INT_DISK_WRITE ) {  /* USB存储器写数据块,请求数据写入 */
	cpi R16,30
	brne L89
	.dbline 307
	.dbline 308
; 			CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 );  /* 向CH375缓冲区写入数据块 */
	ldi R16,43
	xcall _CH375_WR_CMD_PORT
	.dbline 309
; 			mLength = CH375_BLOCK_SIZE;
	ldi R24,64
	mov R12,R24
	.dbline 310
; 			CH375_WR_DAT_PORT( mLength );  /* 后续数据的长度 */
	mov R16,R24
	xcall _CH375_WR_DAT_PORT
	xjmp L94
L93:
	.dbline 311
	.dbline 312
	ldi R24,<_DATA_BUFFER
	ldi R25,>_DATA_BUFFER
	mov R30,R12
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _CH375_WR_DAT_PORT
	.dbline 323
	movw R24,R10
	adiw R24,1
	movw R10,R24
	.dbline 324
	dec R12
	.dbline 325
L94:
	.dbline 311
; 		  while ( mLength ) {  //根据长度写入数据 
	tst R12
	brne L93
	.dbline 330
; 				CH375_WR_DAT_PORT( DATA_BUFFER[mLength]); // 将数据写入 
; 			/*	if( 160+col < 240 )
; 					{
; 				     ShowNumber(j,160+col,*mBufferPoint);  //显示  *mBufferPoint
; 				     j+=4;
; 				     if(j>37)
; 					    {
; 						     j=0;
; 					       col+=16;
; 				      }
; 				  }*/
; 				mBufferPoint++;
; 				mLength--;
; 			}
; 		/*	do { //对于C51,这个DO+WHILE结构比上面的WHILE效率高,速度快
; 				CH375_WR_DAT_PORT( DATA_BUFFER[mLength] );
; 				mBufferPoint++;
; 			} while ( --mLength );*/
; 			CH375_WR_CMD_PORT( CMD_DISK_WR_GO );  /* 继续执行USB存储器的写操作 */
	ldi R16,87
	xcall _CH375_WR_CMD_PORT
	.dbline 331
; 		}
	.dbline 332
; 		else break;  /* 返回错误状态 */
L92:
	.dbline 333
L88:
	.dbline 305
	subi R22,1
	sbci R23,0
L90:
	.dbline 305
	cpi R22,0
	cpc R22,R23
	brne L87
X9:
L89:
	.dbline 334
; 	}
; 	if ( mBlockCount == 0 ) {
	cpi R22,0
	cpc R22,R23
	brne L96
X10:
	.dbline 334
	.dbline 335
; 		mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
	xcall _mWaitInterrupt
	mov R20,R16
	.dbline 336
; 		if ( mIntStatus == USB_INT_SUCCESS ) return( 0 );  /* 操作成功 */
	cpi R16,20
	brne L98
	.dbline 336
	clr R16
	xjmp L86
L98:
	.dbline 337
; 	}
L96:
	.dbline 339
; //	if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus );  /* U盘断开 */
; 	mClearError( );  /* 清除U盘错误以便重试 */
	xcall _mClearError
	.dbline 340
; 	return( mIntStatus );  /* 操作失败 */
	mov R16,R20
	.dbline -2
L86:
	xcall pop_gset4
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r col 22 i
	.dbsym r j 22 i
	.dbsym r mBlockCount 22 i
	.dbsym r mIntStatus 20 c
	.dbsym r mBufferPoint 10 pc
	.dbsym r mLength 12 c
	.dbsym l iSectorCount 12 c
	.dbsym l iLbaStart 8 l
	.dbend
	.dbfunc e mInitSTDIO _mInitSTDIO fV
	.even
_mInitSTDIO::
	.dbline -1
	.dbline 356
; }
; 
; struct _HD_MBR_DPT {
; 	unsigned char	PartState;
; 	unsigned char	StartHead;
; 	unsigned int	StartSec;
; 	unsigned char	PartType;
; 	unsigned char	EndHead;
; 	unsigned int	EndSec;
; 	unsigned long	StartSector;
; 	unsigned long	TotalSector;
; };
; 
; /* 为printf和getkey输入输出初始化串口 */
; void	mInitSTDIO( )
; {
	.dbline 364
; /*	SCON = 0x50;
; 	PCON = 0x80;
; 	TMOD = 0x20;
; 	TH1 = 0xf3;  // 24MHz晶振, 9600bps//
; 	TR1 = 1;

⌨️ 快捷键说明

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