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

📄 avr_usb_disk.lst

📁 USB通信程序开发(附源码 精品)包括详细论文说明
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0023) **工程名称:U盘固件程序开发
(0024) **编译器类型及版本:ICCAVR 6.26C
(0025) **日期:2004.4.30
(0026) **创建人:陈驰
(0027) **所属单位:湖南大学计算机与通信学院
(0028) 
(0029) **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
(0030) **时钟频率:8MHZ
(0031) 
(0032) **函数功能:中断服务处理
(0033) **函数输入参数及说明:无
(0034) 
(0035) **函数返回值:无
(0036) **在本函数以外定义的变量:D12_COMMAND,D12_DATA
(0037) **调用的函数说明:
(0038)   Setup_control():枚举控制函数
(0039)   USB_submit():控制端点提交函数
(0040)   Bulk_Out_Pack(j):处理PC发送的批量传输包
(0041)   Bulk_In_Packet():回应批量传输包
(0042)   void bus_reset(void):总线重置
(0043)   void dma_eot(void):Dma 操作结束
(0044) 
(0045) **修改人:陈驰
(0046) **修改日期:2004.4.30
(0047) **修改说明:创建
(0048) *************************************************************/
(0049) void D12_ISR(void)
(0050) {
(0051) 	unsigned char i,j;
(0052) 	D12_COMMAND = 0xf4;// 读中断寄存器
    040F EF84      LDI	R24,0xF4
    0410 93807C01  STS	R24,0x7C01
(0053) 	cwait1;
    0412 0000      NOP
    0413 0000      NOP
(0054) 	i=D12_DATA;//读取数据赋值给局部变量i
    0414 91407C00  LDS	R20,0x7C00
(0055) 	csram;
    0416 9360FC01  STS	R22,0xFC01
(0056) 	if(i & 0x01)//处理控制输出端点
    0418 FF40      SBRS	R20,0
    0419 C00D      RJMP	0x0427
(0057) 	{
(0058) 		D12_COMMAND = 0x40;//读最后状态
    041A E480      LDI	R24,0x40
    041B 93807C01  STS	R24,0x7C01
(0059) 		cwait1;
    041D 0000      NOP
    041E 0000      NOP
(0060) 		i= D12_DATA;//从端点缓冲区读取数据
    041F 91407C00  LDS	R20,0x7C00
(0061) 		csram;
    0421 9360FC01  STS	R22,0xFC01
(0062) 		if (i & 0x20) //收到SETUP包
    0423 FF45      SBRS	R20,5
    0424 C04F      RJMP	0x0474
(0063) 		{
(0064) 			Setup_control();//枚举控制函数
    0425 D119      RCALL	_Setup_control
(0065) 		}
(0066) 	}else if(i & 0x02)//处理控制输入端点
    0426 C04D      RJMP	0x0474
    0427 FF41      SBRS	R20,1
    0428 C00B      RJMP	0x0434
(0067) 	{
(0068) 		D12_COMMAND = 0x41;//读最后状态
    0429 E481      LDI	R24,0x41
    042A 93807C01  STS	R24,0x7C01
(0069) 		cwait1;
    042C 0000      NOP
    042D 0000      NOP
(0070) 		i = D12_DATA;//从端点缓冲区读取数据
    042E 91407C00  LDS	R20,0x7C00
(0071) 		csram;
    0430 9360FC01  STS	R22,0xFC01
(0072) 		USB_submit();//控制端点提交函数
    0432 D045      RCALL	_USB_submit
(0073) 	}else if(i & 0x04)//处理端点1输出
    0433 C040      RJMP	0x0474
    0434 FF42      SBRS	R20,2
    0435 C001      RJMP	0x0437
(0074) 	{
(0075) 		
(0076) 	}else if(i & 0x08)//处理端点1输入
    0436 C03D      RJMP	0x0474
    0437 FF43      SBRS	R20,3
    0438 C001      RJMP	0x043A
(0077) 	{
(0078) 
(0079) 	}else if(i & 0x10)//处理批量输出端点
    0439 C03A      RJMP	0x0474
    043A FF44      SBRS	R20,4
    043B C01D      RJMP	0x0459
(0080) 	{
(0081) 		D12_COMMAND = 0x44;//读最后状态
    043C E484      LDI	R24,0x44
    043D 93807C01  STS	R24,0x7C01
(0082) 		cwait;
    043F 0000      NOP
(0083) 		i = D12_DATA;
    0440 91407C00  LDS	R20,0x7C00
(0084) 		csram;
    0442 9360FC01  STS	R22,0xFC01
(0085) 		D12_COMMAND = 0x04;//选择端点(指针指向0位置)
    0444 E084      LDI	R24,4
    0445 93807C01  STS	R24,0x7C01
(0086) 		cwait;
    0447 0000      NOP
(0087) 		D12_COMMAND = 0xf0;//读缓冲区
    0448 EF80      LDI	R24,0xF0
    0449 93807C01  STS	R24,0x7C01
(0088) 		/****************************
(0089) 		  缓冲区数据结构:
(0090) 		  字节1:保留,可为任意值
(0091) 		  字节2:数据字节的数目/长度
(0092) 		  字节3:数据字节1
(0093) 		  字节4:数据字节2
(0094) 		*****************************/
(0095) 		cwait1;
    044B 0000      NOP
    044C 0000      NOP
(0096) 		j=D12_DATA;//字节1
    044D 91607C00  LDS	R22,0x7C00
(0097) 		cwait1;
    044F 0000      NOP
    0450 0000      NOP
(0098) 		j=D12_DATA;//字节2
    0451 91607C00  LDS	R22,0x7C00
(0099) 		csram;
    0453 9360FC01  STS	R22,0xFC01
(0100) 		Bulk_Out_Packet(j);//处理PC发送的批量传输包
    0455 2F06      MOV	R16,R22
    0456 2711      CLR	R17
    0457 DCFF      RCALL	_Bulk_Out_Packet
(0101) 	}else if(i & 0x20)//处理批量输入端点
    0458 C01B      RJMP	0x0474
    0459 FF45      SBRS	R20,5
    045A C00D      RJMP	0x0468
(0102) 	{
(0103) 		D12_COMMAND = 0x45;//读 in 最后状态
    045B E485      LDI	R24,0x45
    045C 93807C01  STS	R24,0x7C01
(0104) 		cwait1;
    045E 0000      NOP
    045F 0000      NOP
(0105) 		i = D12_DATA;
    0460 91407C00  LDS	R20,0x7C00
(0106) 		cwait1;
    0462 0000      NOP
    0463 0000      NOP
(0107) 		csram;
    0464 9360FC01  STS	R22,0xFC01
(0108) 		Bulk_In_Packet();//回应批量传输包
    0466 DE43      RCALL	_Bulk_In_Packet
(0109) 	}else if(i & 0x80)//D12_INT_SUSPENDCHANGE D12挂起
    0467 C00C      RJMP	0x0474
    0468 FF47      SBRS	R20,7
    0469 C001      RJMP	0x046B
(0110) 	{
(0111) 	
(0112) 	}else if(i & 0x40)//D12_INT_BUSRESET总线复位
    046A C009      RJMP	0x0474
    046B FF46      SBRS	R20,6
    046C C002      RJMP	0x046F
(0113) 	{
(0114) 		bus_reset();//总线重置
    046D D008      RCALL	_bus_reset
(0115) 	}else
    046E C005      RJMP	0x0474
(0116) 	{
(0117) 		i=D12_DATA; //D12_INT_EOT DMA操作已结束
    046F 91407C00  LDS	R20,0x7C00
(0118) 		if(i & 0x01)
    0471 FF40      SBRS	R20,0
    0472 C001      RJMP	0x0474
(0119) 		{
(0120) 			dma_eot();//Dma 操作结束
    0473 D003      RCALL	_dma_eot
(0121) 		}
(0122) 	}
(0123) }
    0474 D67E      RCALL	pop_gset2
    0475 9508      RET
(0124) 
(0125) void bus_reset(void)//总线重置函数
(0126) {
(0127) }
_bus_reset:
    0476 9508      RET
(0128) 
(0129) void dma_eot(void)//Dma 操作结束函数
(0130) {
(0131) }
_dma_eot:
    0477 9508      RET
_USB_submit:
  j                    --> R16
  k                    --> R18
  i                    --> R20
    0478 D657      RCALL	push_gset1
(0132) /************************************************************
(0133) **工程名称:U盘固件程序开发
(0134) **编译器类型及版本:ICCAVR 6.26C
(0135) **日期:2004.4.30
(0136) **创建人:陈驰
(0137) **所属单位:湖南大学计算机与通信学院
(0138) 
(0139) **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
(0140) **时钟频率:8MHZ
(0141) 
(0142) **函数功能:控制端点传输提交
(0143) **函数输入参数及说明:无
(0144) 
(0145) **函数返回值:无
(0146) **在本函数以外定义的变量:传输结构体
(0147) **调用的函数说明:无
(0148) 
(0149) **修改人:陈驰
(0150) **修改日期:2004.4.30
(0151) **修改说明:创建
(0152) *************************************************************/
(0153) void USB_submit(void)
(0154) {
(0155) 	unsigned char i,j,k;
(0156) 	/*********说明******************
(0157) 	  D12芯片数据手册上说明控制端点
(0158) 	  缓冲区大小为16BYTES,使用时试用
(0159) 	  64BYTES可以完成传输,这里故用64
(0160) 	  来处理
(0161) 	*******************************/
(0162) 	if(64 > XmtBuff.wrLength)
    0479 90300156  LDS	R3,0x156
    047B 90200155  LDS	R2,0x155
    047D E480      LDI	R24,0x40
    047E E090      LDI	R25,0
    047F 1628      CP	R2,R24
    0480 0639      CPC	R3,R25
    0481 F418      BCC	0x0485
(0163) 	{
(0164) 		j = XmtBuff.wrLength;
    0482 2D02      MOV	R16,R2
    0483 2D13      MOV	R17,R3
(0165) 	}else
    0484 C001      RJMP	0x0486
(0166) 	{
(0167) 		j = 64;
    0485 E400      LDI	R16,0x40
(0168) 	}
(0169) 	D12_COMMAND = 0x01;//选择端点(指针指向0位置)
    0486 E081      LDI	R24,1
    0487 93807C01  STS	R24,0x7C01
(0170) 	cwait;
    0489 0000      NOP
(0171) 	D12_COMMAND = 0xf0;//写缓冲区
    048A EF80      LDI	R24,0xF0
    048B 93807C01  STS	R24,0x7C01
(0172) 	cwait;
    048D 0000      NOP
(0173) 	/****************************
(0174) 	  缓冲区数据结构:
(0175) 	  字节1:保留,可为任意值
(0176) 	  字节2:数据字节的数目/长度
(0177) 	  字节3:数据字节1
(0178) 	  字节4:数据字节2
(0179) 	*****************************/
(0180) 	D12_DATA = 0x00;//写字节1
    048E 2422      CLR	R2
    048F 92207C00  STS	R2,0x7C00
(0181) 	cwait;
    0491 0000      NOP
(0182) 	D12_DATA = j;//写字节2
    0492 93007C00  STS	R16,0x7C00
(0183) 	csram;
    0494 9360FC01  STS	R22,0xFC01
(0184) 	for(i=0;i<j;i++)
    0496 2744      CLR	R20
    0497 C011      RJMP	0x04A9
(0185) 	{
(0186) 		k = *(XmtBuff.pp+i);
    0498 90300158  LDS	R3,0x158
    049A 90200157  LDS	R2,0x157
    049C 2E44      MOV	R4,R20
    049D 2455      CLR	R5
    049E 0C42      ADD	R4,R2
    049F 1C53      ADC	R5,R3
    04A0 2DE4      MOV	R30,R4
    04A1 2DF5      MOV	R31,R5
    04A2 95C8      LPM
    04A3 2D20      MOV	R18,R0
(0187) 		D12_DATA = k;//写数据字节
    04A4 93207C00  STS	R18,0x7C00
(0188) 		csram;
    04A6 9360FC01  STS	R22,0xFC01
(0189) 	}
    04A8 9543      INC	R20
    04A9 1740      CP	R20,R16
    04AA F368      BCS	0x0498
(0190) 	XmtBuff.pp += j;
    04AB 90300158  LDS	R3,0x158
    04AD 90200157  LDS	R2,0x157
    04AF 2E40      MOV	R4,R16
    04B0 2455      CLR	R5
    04B1 0C42      ADD	R4,R2
    04B2 1C53      ADC	R5,R3
    04B3 92500158  STS	R5,0x158
    04B5 92400157  STS	R4,0x157
(0191) 	XmtBuff.wrLength -= j;
    04B7 2E20      MOV	R2,R16
    04B8 2433      CLR	R3
    04B9 90500156  LDS	R5,0x156
    04BB 90400155  LDS	R4,0x155
    04BD 1842      SUB	R4,R2
    04BE 0853      SBC	R5,R3
    04BF 92500156  STS	R5,0x156
    04C1 92400155  STS	R4,0x155
(0192) 	D12_COMMAND = 0xfa;//设置缓冲区有效(满标志)
    04C3 EF8A      LDI	R24,0xFA
    04C4 93807C01  STS	R24,0x7C01
(0193) 	csram;
    04C6 9360FC01  STS	R22,0xFC01
(0194) }
    04C8 D60A      RCALL	pop_gset1
    04C9 9508      RET
_BULK_submit:
  j                    --> R16
  k                    --> R18
  i                    --> R20
    04CA D605      RCALL	push_gset1
(0195) /************************************************************
(0196) **工程名称:U盘固件程序开发
(0197) **编译器类型及版本:ICCAVR 6.26C
(0198) **日期:2004.4.30
(0199) **创建人:陈驰
(0200) **所属单位:湖南大学计算机与通信学院
(0201) 
(0202) **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
(0203) **时钟频率:8MHZ
(0204) 
(0205) **函数功能:BULK端点传输提交
(0206) **函数输入参数及说明:无
(0207) 
(0208) **函数返回值:无
(0209) **在本函数以外定义的变量:传输结构体
(0210) **调用的函数说明:
(0211) 
(0212) **修改人:陈驰
(0213) **修改日期:2004.4.30
(0214) **修改说明:创建
(0215) *************************************************************/
(0216) void BULK_submit(void)
(0217) {
(0218) 	unsigned char i,j,k;
(0219) 	if(64 > XmtBuff.wrLength)
    04CB 90300156  LDS	R3,0x156
    04CD 90200155  LDS	R2,0x155
    04CF E480      LDI	R24,0x40
    04D0 E090      LDI	R25,0
    04D1 1628      CP	R2,R24
    04D2 0639      CPC	R3,R25
    04D3 F418      BCC	0x04D7
(0220) 	{
(0221) 		j = XmtBuff.wrLength;
    04D4 2D02      MOV	R16,R2
    04D5 2D13      MOV	R17,R3
(0222) 	}else
    04D6 C001      RJMP	0x04D8
(0223) 	{
(0224) 		j = 64;
    04D7 E400      LDI	R16,0x40
(0225) 	}
(0226) 	D12_COMMAND = 0x05;// 选择端点(指针指向0位置)
    04D8 E085      LDI	R24,5
    04D9 93807C01  STS	R24,0x7C01
(0227) 	cwait;
    04DB 0000      NOP
(0228) 	D12_COMMAND = 0xf0;// 写缓冲区
    04DC EF80      LDI	R24,0xF0
    04DD 93807C01  STS	R24,0x7C01
(0229) 	cwait;
    04DF 0000      NOP
(0230) 	/****************************
(0231) 	  缓冲区数据结构:
(0232) 	  字节1:保留,可为任意值
(0233) 	  字节2:数据字节的数目/长度
(0234) 	  字节3:数据字节1
(0235) 	  字节4:数据字节2
(0236) 	*****************************/
(0237) 	D12_DATA = 0x00;//写字节1
    04E0 2422      CLR	R2
    04E1 92207C00  STS	R2,0x7C00
(0238) 	cwait;
    04E3 0000      NOP
(0239) 	D12_DATA = j;//写字节2
    04E4 93007C00  STS	R16,0x7C00
(0240) 	csram;
    04E6 9360FC01  STS	R22,0xFC01
(0241) 	/*****************************
(0242) 	  判断输出
(0243) 	  XmtBuff.p_p = 0:输出一般数据
(0244) 	  XmtBuff.p_p = 1:输出CONST数据
(0245) 	******************************/
(0246) 	if(XmtBuff.p_p)
    04E8 9020015B  LDS	R2,0x15B
    04EA 2022      TST	R2
    04EB F111      BEQ	0x050E
(0247) 	{
(0248) 		for(i=0;i<j ;i++)
    04EC 2744      CLR	R20

⌨️ 快捷键说明

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