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

📄 d12isr.s

📁 usb开发(基于D12)。。湖南大学计算机与通信学院同学毕业设计及源代码!!好的很啊
💻 S
字号:
	.module D12ISR.c
	.area text(rom, con, rel)
	.dbfile G:\source\D12ISR.c
	.dbfunc s D12_ISR _D12_ISR fI
;              j -> R22
;              i -> R20
	.even
_D12_ISR::
	rcall push_gset2
	.dbline -1
	.dbline 51
; /*++
; 
; Module Name:
; 
;          D12ISR.c
; 
; Abstract:
; 
;          Header file related to D12 module
; 
; Environment:
; 
;         ICCAVR 6.29
; 
; Revision History:
; 
;         04/23/2004      chenchi   created
; 
; --*/
; /******************************************************************/
; #include "io8515v.h"
; #include "d12.h"
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
; 
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
; 
; **函数功能:中断服务处理
; **函数输入参数及说明:无
; 
; **函数返回值:无
; **在本函数以外定义的变量:D12_COMMAND,D12_DATA
; **调用的函数说明:
;   Setup_control():枚举控制函数
;   USB_submit():控制端点提交函数
;   Bulk_Out_Pack(j):处理PC发送的批量传输包
;   Bulk_In_Packet():回应批量传输包
;   void bus_reset(void):总线重置
;   void dma_eot(void):Dma 操作结束
; 
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void D12_ISR(void)
; {
	.dbline 53
; 	unsigned char i,j;
; 	D12_COMMAND = 0xf4;// 读中断寄存器
	ldi R24,244
	sts 31745,R24
	.dbline 54
; 	cwait1;
	nop
	.dbline 54
	nop
	.dbline 55
; 	i=D12_DATA;//读取数据赋值给局部变量i
	lds R20,31744
	.dbline 56
; 	csram;
	sts 0xfc01,R22
	.dbline 56
	.dbline 57
; 	if(i & 0x01)//处理控制输出端点
	sbrs R20,0
	rjmp L3
	.dbline 58
; 	{
	.dbline 59
; 		D12_COMMAND = 0x40;//读最后状态
	ldi R24,64
	sts 31745,R24
	.dbline 60
; 		cwait1;
	nop
	.dbline 60
	nop
	.dbline 61
; 		i= D12_DATA;//从端点缓冲区读取数据
	lds R20,31744
	.dbline 62
; 		csram;
	sts 0xfc01,R22
	.dbline 62
	.dbline 63
; 		if (i & 0x20) //收到SETUP包
	sbrs R20,5
	rjmp L4
	.dbline 64
; 		{
	.dbline 65
; 			Setup_control();//枚举控制函数
	rcall _Setup_control
	.dbline 66
; 		}
	.dbline 67
	rjmp L4
L3:
	.dbline 67
; 	}else if(i & 0x02)//处理控制输入端点
	sbrs R20,1
	rjmp L7
	.dbline 68
; 	{
	.dbline 69
; 		D12_COMMAND = 0x41;//读最后状态
	ldi R24,65
	sts 31745,R24
	.dbline 70
; 		cwait1;
	nop
	.dbline 70
	nop
	.dbline 71
; 		i = D12_DATA;//从端点缓冲区读取数据
	lds R20,31744
	.dbline 72
; 		csram;
	sts 0xfc01,R22
	.dbline 72
	.dbline 73
; 		USB_submit();//控制端点提交函数
	rcall _USB_submit
	.dbline 74
	rjmp L8
L7:
	.dbline 74
; 	}else if(i & 0x04)//处理端点1输出
	sbrs R20,2
	rjmp L9
	.dbline 75
; 	{
	.dbline 77
	rjmp L10
L9:
	.dbline 77
; 		
; 	}else if(i & 0x08)//处理端点1输入
	sbrs R20,3
	rjmp L11
	.dbline 78
; 	{
	.dbline 80
	rjmp L12
L11:
	.dbline 80
; 
; 	}else if(i & 0x10)//处理批量输出端点
	sbrs R20,4
	rjmp L13
	.dbline 81
; 	{
	.dbline 82
; 		D12_COMMAND = 0x44;//读最后状态
	ldi R24,68
	sts 31745,R24
	.dbline 83
; 		cwait;
	nop
	.dbline 84
; 		i = D12_DATA;
	lds R20,31744
	.dbline 85
; 		csram;
	sts 0xfc01,R22
	.dbline 85
	.dbline 86
; 		D12_COMMAND = 0x04;//选择端点(指针指向0位置)
	ldi R24,4
	sts 31745,R24
	.dbline 87
; 		cwait;
	nop
	.dbline 88
; 		D12_COMMAND = 0xf0;//读缓冲区
	ldi R24,240
	sts 31745,R24
	.dbline 96
; 		/****************************
; 		  缓冲区数据结构:
; 		  字节1:保留,可为任意值
; 		  字节2:数据字节的数目/长度
; 		  字节3:数据字节1
; 		  字节4:数据字节2
; 		*****************************/
; 		cwait1;
	nop
	.dbline 96
	nop
	.dbline 97
; 		j=D12_DATA;//字节1
	lds R22,31744
	.dbline 98
; 		cwait1;
	nop
	.dbline 98
	nop
	.dbline 99
; 		j=D12_DATA;//字节2
	lds R22,31744
	.dbline 100
; 		csram;
	sts 0xfc01,R22
	.dbline 100
	.dbline 101
; 		Bulk_Out_Packet(j);//处理PC发送的批量传输包
	mov R16,R22
	clr R17
	rcall _Bulk_Out_Packet
	.dbline 102
	rjmp L14
L13:
	.dbline 102
; 	}else if(i & 0x20)//处理批量输入端点
	sbrs R20,5
	rjmp L15
	.dbline 103
; 	{
	.dbline 104
; 		D12_COMMAND = 0x45;//读 in 最后状态
	ldi R24,69
	sts 31745,R24
	.dbline 105
; 		cwait1;
	nop
	.dbline 105
	nop
	.dbline 106
; 		i = D12_DATA;
	lds R20,31744
	.dbline 107
; 		cwait1;
	nop
	.dbline 107
	nop
	.dbline 108
; 		csram;
	sts 0xfc01,R22
	.dbline 108
	.dbline 109
; 		Bulk_In_Packet();//回应批量传输包
	rcall _Bulk_In_Packet
	.dbline 110
	rjmp L16
L15:
	.dbline 110
; 	}else if(i & 0x80)//D12_INT_SUSPENDCHANGE D12挂起
	sbrs R20,7
	rjmp L17
	.dbline 111
; 	{
	.dbline 113
	rjmp L18
L17:
	.dbline 113
; 	
; 	}else if(i & 0x40)//D12_INT_BUSRESET总线复位
	sbrs R20,6
	rjmp L19
	.dbline 114
; 	{
	.dbline 115
; 		bus_reset();//总线重置
	rcall _bus_reset
	.dbline 116
; 	}else
	rjmp L20
L19:
	.dbline 117
; 	{
	.dbline 118
; 		i=D12_DATA; //D12_INT_EOT DMA操作已结束
	lds R20,31744
	.dbline 119
; 		if(i & 0x01)
	sbrs R20,0
	rjmp L21
	.dbline 120
; 		{
	.dbline 121
; 			dma_eot();//Dma 操作结束
	rcall _dma_eot
	.dbline 122
; 		}
L21:
	.dbline 123
; 	}
L20:
L18:
L16:
L14:
L12:
L10:
L8:
L4:
	.dbline -2
	.dbline 124
; }
L2:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r j 22 c
	.dbsym r i 20 c
	.dbfunc s bus_reset _bus_reset fI
	.even
_bus_reset::
	.dbline -1
	.dbline 127
; 
; void bus_reset(void)//总线重置函数
; {
	.dbline -2
	.dbline 128
; }
L23:
	.dbline 0 ; func end
	ret
	.dbfunc s dma_eot _dma_eot fI
	.even
_dma_eot::
	.dbline -1
	.dbline 131
; 
; void dma_eot(void)//Dma 操作结束函数
; {
	.dbline -2
	.dbline 132
; }
L24:
	.dbline 0 ; func end
	ret
	.dbfunc s USB_submit _USB_submit fI
;              j -> R16
;              k -> R18
;              i -> R20
	.even
_USB_submit::
	rcall push_gset1
	.dbline -1
	.dbline 155
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
; 
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
; 
; **函数功能:控制端点传输提交
; **函数输入参数及说明:无
; 
; **函数返回值:无
; **在本函数以外定义的变量:传输结构体
; **调用的函数说明:无
; 
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void USB_submit(void)
; {
	.dbline 163
; 	unsigned char i,j,k;
; 	/*********说明******************
; 	  D12芯片数据手册上说明控制端点
; 	  缓冲区大小为16BYTES,使用时试用
; 	  64BYTES可以完成传输,这里故用64
; 	  来处理
; 	*******************************/
; 	if(64 > XmtBuff.wrLength)
	lds R3,_XmtBuff+64+1
	lds R2,_XmtBuff+64
	ldi R24,64
	ldi R25,0
	cp R2,R24
	cpc R3,R25
	brsh L26
	.dbline 164
; 	{
	.dbline 165
; 		j = XmtBuff.wrLength;
	mov R16,R2
	mov R17,R3
	.dbline 166
; 	}else
	rjmp L27
L26:
	.dbline 167
; 	{
	.dbline 168
; 		j = 64;
	ldi R16,64
	.dbline 169
; 	}
L27:
	.dbline 170
; 	D12_COMMAND = 0x01;//选择端点(指针指向0位置)
	ldi R24,1
	sts 31745,R24
	.dbline 171
; 	cwait;
	nop
	.dbline 172
; 	D12_COMMAND = 0xf0;//写缓冲区
	ldi R24,240
	sts 31745,R24
	.dbline 173
; 	cwait;
	nop
	.dbline 181
; 	/****************************
; 	  缓冲区数据结构:
; 	  字节1:保留,可为任意值
; 	  字节2:数据字节的数目/长度
; 	  字节3:数据字节1
; 	  字节4:数据字节2
; 	*****************************/
; 	D12_DATA = 0x00;//写字节1
	clr R2
	sts 31744,R2
	.dbline 182
; 	cwait;
	nop
	.dbline 183
; 	D12_DATA = j;//写字节2
	sts 31744,R16
	.dbline 184
; 	csram;
	sts 0xfc01,R22
	.dbline 184
	.dbline 185
; 	for(i=0;i<j;i++)
	clr R20
	rjmp L33
L30:
	.dbline 186
	.dbline 187
	lds R3,_XmtBuff+66+1
	lds R2,_XmtBuff+66
	mov R4,R20
	clr R5
	add R4,R2
	adc R5,R3
	mov R30,R4
	mov R31,R5
	lpm
	mov R18,R0
	.dbline 188
	sts 31744,R18
	.dbline 189
	sts 0xfc01,R22
	.dbline 189
	.dbline 190
L31:
	.dbline 185
	inc R20
L33:
	.dbline 185
	cp R20,R16
	brlo L30
	.dbline 191
; 	{
; 		k = *(XmtBuff.pp+i);
; 		D12_DATA = k;//写数据字节
; 		csram;
; 	}
; 	XmtBuff.pp += j;
	lds R3,_XmtBuff+66+1
	lds R2,_XmtBuff+66
	mov R4,R16
	clr R5
	add R4,R2
	adc R5,R3
	sts _XmtBuff+66+1,R5
	sts _XmtBuff+66,R4
	.dbline 192
; 	XmtBuff.wrLength -= j;
	mov R2,R16
	clr R3
	lds R5,_XmtBuff+64+1
	lds R4,_XmtBuff+64
	sub R4,R2
	sbc R5,R3
	sts _XmtBuff+64+1,R5
	sts _XmtBuff+64,R4
	.dbline 193
; 	D12_COMMAND = 0xfa;//设置缓冲区有效(满标志)
	ldi R24,250
	sts 31745,R24
	.dbline 194
; 	csram;
	sts 0xfc01,R22
	.dbline 194
	.dbline -2
	.dbline 195
; }
L25:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r j 16 c
	.dbsym r k 18 c
	.dbsym r i 20 c
	.dbfunc s BULK_submit _BULK_submit fI
;              j -> R16
;              k -> R18
;              i -> R20
	.even
_BULK_submit::
	rcall push_gset1
	.dbline -1
	.dbline 218
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
; 
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
; 
; **函数功能:BULK端点传输提交
; **函数输入参数及说明:无
; 
; **函数返回值:无
; **在本函数以外定义的变量:传输结构体
; **调用的函数说明:
; 
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void BULK_submit(void)
; {
	.dbline 220
; 	unsigned char i,j,k;
; 	if(64 > XmtBuff.wrLength)
	lds R3,_XmtBuff+64+1
	lds R2,_XmtBuff+64
	ldi R24,64
	ldi R25,0
	cp R2,R24
	cpc R3,R25
	brsh L38
	.dbline 221
; 	{
	.dbline 222
; 		j = XmtBuff.wrLength;
	mov R16,R2
	mov R17,R3
	.dbline 223
; 	}else
	rjmp L39
L38:
	.dbline 224
; 	{
	.dbline 225
; 		j = 64;
	ldi R16,64
	.dbline 226
; 	}
L39:
	.dbline 227
; 	D12_COMMAND = 0x05;// 选择端点(指针指向0位置)
	ldi R24,5
	sts 31745,R24
	.dbline 228
; 	cwait;
	nop
	.dbline 229
; 	D12_COMMAND = 0xf0;// 写缓冲区
	ldi R24,240
	sts 31745,R24
	.dbline 230
; 	cwait;
	nop
	.dbline 238
; 	/****************************
; 	  缓冲区数据结构:
; 	  字节1:保留,可为任意值
; 	  字节2:数据字节的数目/长度
; 	  字节3:数据字节1
; 	  字节4:数据字节2
; 	*****************************/
; 	D12_DATA = 0x00;//写字节1
	clr R2
	sts 31744,R2
	.dbline 239
; 	cwait;
	nop
	.dbline 240
; 	D12_DATA = j;//写字节2
	sts 31744,R16
	.dbline 241
; 	csram;
	sts 0xfc01,R22
	.dbline 241
	.dbline 247
; 	/*****************************
; 	  判断输出
; 	  XmtBuff.p_p = 0:输出一般数据
; 	  XmtBuff.p_p = 1:输出CONST数据
; 	******************************/
; 	if(XmtBuff.p_p)
	lds R2,_XmtBuff+70
	tst R2
	breq L42
	.dbline 248
; 	{
	.dbline 249
; 		for(i=0;i<j ;i++)
	clr R20
	rjmp L48
L45:
	.dbline 250
	.dbline 251
	lds R3,_XmtBuff+66+1
	lds R2,_XmtBuff+66
	mov R4,R20
	clr R5
	add R4,R2
	adc R5,R3
	mov R30,R4
	mov R31,R5
	lpm
	mov R18,R0
	.dbline 252
	sts 31744,R18
	.dbline 253
	sts 0xfc01,R22
	.dbline 253
	.dbline 254
L46:
	.dbline 249
	inc R20
L48:
	.dbline 249
	cp R20,R16
	brlo L45
	.dbline 255
; 		{
; 			k = *(XmtBuff.pp+i);
; 			D12_DATA = k;//写数据字节
; 			csram;
; 		}
; 		XmtBuff.pp += j;
	lds R3,_XmtBuff+66+1
	lds R2,_XmtBuff+66
	mov R4,R16
	clr R5
	add R4,R2
	adc R5,R3
	sts _XmtBuff+66+1,R5
	sts _XmtBuff+66,R4
	.dbline 256
; 	}else
	rjmp L43
L42:
	.dbline 257
; 	{
	.dbline 258
; 	 	for(i=0;i<j;i++)
	clr R20
	rjmp L54
L51:
	.dbline 259
	.dbline 260
	lds R3,_XmtBuff+68+1
	lds R2,_XmtBuff+68
	mov R30,R20
	clr R31
	add R30,R2
	adc R31,R3
	ldd R18,z+0
	.dbline 261
	sts 31744,R18
	.dbline 262
	sts 0xfc01,R22
	.dbline 262
	.dbline 263
L52:
	.dbline 258
	inc R20
L54:
	.dbline 258
	cp R20,R16
	brlo L51
	.dbline 264
; 		{
; 			k = *(XmtBuff.p+i);
; 			D12_DATA = k;//写数据字节
; 			csram;
; 		}
; 		XmtBuff.p += j;
	lds R3,_XmtBuff+68+1
	lds R2,_XmtBuff+68
	mov R4,R16
	clr R5
	add R4,R2
	adc R5,R3
	sts _XmtBuff+68+1,R5
	sts _XmtBuff+68,R4
	.dbline 265
; 	}
L43:
	.dbline 266
; 	XmtBuff.wrLength -= j;
	mov R2,R16
	clr R3
	lds R5,_XmtBuff+64+1
	lds R4,_XmtBuff+64
	sub R4,R2
	sbc R5,R3
	sts _XmtBuff+64+1,R5
	sts _XmtBuff+64,R4
	.dbline 267
; 	D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志)
	ldi R24,250
	sts 31745,R24
	.dbline 268
; 	csram;
	sts 0xfc01,R22
	.dbline 268
	.dbline -2
	.dbline 269
; }
L37:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r j 16 c
	.dbsym r k 18 c
	.dbsym r i 20 c

⌨️ 快捷键说明

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