📄 usbd12.lst
字号:
(0398) }
(0399) /*******************************************
(0400) 函数名称: Sel_EP
(0401) 功 能: 端点选择,将内部指针初始化到选择的缓冲区起始位置
(0402) 参 数: endp--端点索引号,取值0 ~ 5
(0403) 返回值 : byte--一个字节的返回数据
(0404) /********************************************/
(0405) uchar Sel_EP(uchar endp)
(0406) {
(0407) uchar byte;
(0408) if(USB_FLAG.in_isr == 0)
026E 90200064 LDS R2,0x64
0270 2022 TST R2
0271 F409 BNE 0x0273
(0409) UEN_GINT();
0272 94F8 BCLR 7
(0410)
(0411) OutB(CMD,endp); //端点选择
0273 2F24 MOV R18,R20
0274 E001 LDI R16,1
0275 DF2B RCALL _OutB
(0412) Delayus(1);
0276 E001 LDI R16,1
0277 E010 LDI R17,0
0278 DE17 RCALL _Delayus
(0413) byte=InB( ); //读出一个字节
0279 DF4B RCALL _InB
027A 2F40 MOV R20,R16
(0414)
(0415) if(USB_FLAG.in_isr == 0)
027B 90200064 LDS R2,0x64
027D 2022 TST R2
027E F409 BNE 0x0280
(0416) EN_GINT();
027F 9478 BSET 7
(0417)
(0418) return byte;
0280 2F04 MOV R16,R20
0281 940E0744 CALL pop_gset1
0283 9508 RET
_Read_EPsta:
status --> R20
endp --> R20
0284 940E0741 CALL push_gset1
0286 2F40 MOV R20,R16
(0419) }
(0420) /*******************************************
(0421) 函数名称: Sel_EP
(0422) 功 能: 读取端点状态
(0423) 参 数: endp--端点索引号,取值0 ~ 5
(0424) 返回值 : status--端点状态
(0425) /********************************************/
(0426) uchar Read_EPsta(uchar endp)//-----------------
(0427) {
(0428) uchar status;
(0429)
(0430) if(USB_FLAG.in_isr == 0)
0287 90200064 LDS R2,0x64
0289 2022 TST R2
028A F409 BNE 0x028C
(0431) UEN_GINT();
028B 94F8 BCLR 7
(0432)
(0433) OutB(CMD,0x80+endp); //读取端点状态命令
028C 2F24 MOV R18,R20
028D 5820 SUBI R18,0x80
028E E001 LDI R16,1
028F DF11 RCALL _OutB
(0434) status=InB( ); //读取端点状态
0290 DF34 RCALL _InB
0291 2F40 MOV R20,R16
(0435)
(0436) if(USB_FLAG.in_isr == 0)
0292 90200064 LDS R2,0x64
0294 2022 TST R2
0295 F409 BNE 0x0297
(0437) EN_GINT();
0296 9478 BSET 7
(0438)
(0439) return status;
0297 2F04 MOV R16,R20
0298 940E0744 CALL pop_gset1
029A 9508 RET
_Read_LttransSta:
status --> R20
endp --> R20
029B 940E0741 CALL push_gset1
029D 2F40 MOV R20,R16
(0440) }
(0441) /*******************************************
(0442) 函数名称: Read_LttransSta
(0443) 功 能: 读取最后处理状态寄存器
(0444) 参 数: endp--端点索引号,取值0 ~ 5
(0445) 返回值 : status--端点最后处理的状态
(0446) /********************************************/
(0447) uchar Read_LttransSta(uchar endp)
(0448) {
(0449) uchar status;
(0450) OutB(CMD,0x40+endp); //输出读取最后处理状态寄存器命令
029E 2F24 MOV R18,R20
029F 5C20 SUBI R18,0xC0
02A0 E001 LDI R16,1
02A1 DEFF RCALL _OutB
(0451) Delayus(5);
02A2 E005 LDI R16,5
02A3 E010 LDI R17,0
02A4 DDEB RCALL _Delayus
(0452) status=InB( );
02A5 DF1F RCALL _InB
02A6 2F40 MOV R20,R16
(0453) return status; //读取状态
02A7 940E0744 CALL pop_gset1
02A9 9508 RET
_Set_EPsta:
stall --> R20
endp --> R22
02AA 940E0758 CALL push_gset2
02AC 2F42 MOV R20,R18
02AD 2F60 MOV R22,R16
(0454) }
(0455) /*******************************************
(0456) 函数名称: Set_EPsta
(0457) 功 能: 设置端点状态
(0458) 参 数: endp--端点索引号,取值0 ~ 5
(0459) stall--设置状态值
(0460) 返回值 : 无
(0461) /********************************************/
(0462) void Set_EPsta(uchar endp,uchar stall)
(0463) {
(0464) if(USB_FLAG.in_isr == 0)
02AE 90200064 LDS R2,0x64
02B0 2022 TST R2
02B1 F409 BNE 0x02B3
(0465) UEN_GINT();
02B2 94F8 BCLR 7
(0466)
(0467) OutB(CMD,0x40+endp); //发送设置端点状态命令
02B3 2F26 MOV R18,R22
02B4 5C20 SUBI R18,0xC0
02B5 E001 LDI R16,1
02B6 DEEA RCALL _OutB
(0468) Delayus(1);
02B7 E001 LDI R16,1
02B8 E010 LDI R17,0
02B9 DDD6 RCALL _Delayus
(0469) OutB(CMD,stall); //设置端点状态
02BA 2F24 MOV R18,R20
02BB E001 LDI R16,1
02BC DEE4 RCALL _OutB
(0470)
(0471) if(USB_FLAG.in_isr == 0)
02BD 90200064 LDS R2,0x64
02BF 2022 TST R2
02C0 F409 BNE 0x02C2
(0472) EN_GINT();
02C1 9478 BSET 7
(0473) }
02C2 940E0760 CALL pop_gset2
02C4 9508 RET
(0474) /*******************************************
(0475) 函数名称: Set_Sresume
(0476) 功 能: 设置发送恢复
(0477) 参 数: 无
(0478) 返回值 : 无
(0479) /********************************************/
(0480) void Set_Sresume(void)
(0481) {
(0482) OutB(CMD,0xF6); //设置发送恢复
_Set_Sresume:
02C5 EF26 LDI R18,0xF6
02C6 E001 LDI R16,1
(0483) }
02C7 CED9 RJMP _OutB
_Read_EP:
num --> R20
i --> R22
buf --> R10
len --> R22
endp --> R20
02C8 940E075C CALL push_gset3
02CA 2F62 MOV R22,R18
02CB 2F40 MOV R20,R16
02CC 80AE LDD R10,6+Y
02CD 80BF LDD R11,7+Y
(0484) /*******************************************
(0485) 函数名称: Read_EP
(0486) 功 能: 读取端点数据
(0487) 参 数: endp--端点索引号,取值 0 ~ 5
(0488) len--要读取的数据长度
(0489) buf--接收数据指针
(0490) 返回值 : num--实际读到的字节数
(0491) /********************************************/
(0492) uchar Read_EP(uchar endp,uchar len,uchar * buf)
(0493) {
(0494) uchar i,num;
(0495)
(0496) if(USB_FLAG.in_isr == 0)
02CE 90200064 LDS R2,0x64
02D0 2022 TST R2
02D1 F409 BNE 0x02D3
(0497) UEN_GINT();
02D2 94F8 BCLR 7
(0498)
(0499) OutB(CMD,endp); //发送选择端点命令
02D3 2F24 MOV R18,R20
02D4 E001 LDI R16,1
02D5 DECB RCALL _OutB
(0500) Delayus(1);
02D6 E001 LDI R16,1
02D7 E010 LDI R17,0
02D8 DDB7 RCALL _Delayus
(0501) if((InB( )&FULLEMPTY)==0)
02D9 DEEB RCALL _InB
02DA FD00 SBRC R16,0
02DB C007 RJMP 0x02E3
(0502) { //如果缓冲区为空----------------------------------------
(0503) if(USB_FLAG.in_isr == 0)
02DC 90200064 LDS R2,0x64
02DE 2022 TST R2
02DF F409 BNE 0x02E1
(0504) EN_GINT();
02E0 9478 BSET 7
(0505) return 0; //则返回读到0字节
02E1 2700 CLR R16
02E2 C020 RJMP 0x0303
(0506) }
(0507)
(0508) OutB(CMD,0xF0); //发送读缓冲区命令
02E3 EF20 LDI R18,0xF0
02E4 E001 LDI R16,1
02E5 DEBB RCALL _OutB
(0509) Delayus(1);
02E6 E001 LDI R16,1
02E7 E010 LDI R17,0
02E8 DDA7 RCALL _Delayus
(0510) num=InB( ); //读取保留字节
02E9 DEDB RCALL _InB
(0511) num=InB( ); //读取数据字节的数目/长度
02EA DEDA RCALL _InB
02EB 2F40 MOV R20,R16
(0512)
(0513) if(num>len) //如果大于要求读的字节数目
02EC 1760 CP R22,R16
02ED F408 BCC 0x02EF
(0514) {
(0515) num=len; //则只读取要求的字节长度
02EE 2F46 MOV R20,R22
(0516) }
(0517) for(i=0; i<num; i++)
02EF 2766 CLR R22
02F0 C007 RJMP 0x02F8
(0518) *(buf+i)=InB( ); //读取要求的字节数目/长度
02F1 DED3 RCALL _InB
02F2 2FE6 MOV R30,R22
02F3 27FF CLR R31
02F4 0DEA ADD R30,R10
02F5 1DFB ADC R31,R11
02F6 8300 STD R16,0+Z
02F7 9563 INC R22
02F8 1764 CP R22,R20
02F9 F3B8 BCS 0x02F1
(0519)
(0520) OutB(CMD,0xF2); //清缓冲区,新的信息包才可以重新被接受
02FA EF22 LDI R18,0xF2
02FB E001 LDI R16,1
02FC DEA4 RCALL _OutB
(0521)
(0522) if(USB_FLAG.in_isr == 0)
02FD 90200064 LDS R2,0x64
02FF 2022 TST R2
0300 F409 BNE 0x0302
(0523) EN_GINT();
0301 9478 BSET 7
(0524)
(0525) return num; //返回读到的字节数
0302 2F04 MOV R16,R20
0303 940E0763 CALL pop_gset3
0305 9508 RET
_Write_EP:
i --> R20
buf --> R22
len --> R10
endp --> R20
0306 940E075C CALL push_gset3
0308 2EA2 MOV R10,R18
0309 2F40 MOV R20,R16
030A 816E LDD R22,6+Y
030B 817F LDD R23,7+Y
(0526) }
(0527) /*******************************************
(0528) 函数名称: Write_EP
(0529) 功 能: 将数据写入端点
(0530) 参 数: endp--端点索引号,取值 0 ~ 5
(0531) len--要写入的数据长度
(0532) buf--发送数据指针
(0533) 返回值 : num--实际写入的字节数
(0534) /********************************************/
(0535) uchar Write_EP(uchar endp,uchar len,uchar * buf)
(0536) {
(0537) uchar i;
(0538)
(0539) if(USB_FLAG.in_isr == 0)
030C 90200064 LDS R2,0x64
030E 2022 TST R2
030F F409 BNE 0x0311
(0540) UEN_GINT();
0310 94F8 BCLR 7
(0541)
(0542) OutB(CMD,endp); //发送选择端点命令
0311 2F24 MOV R18,R20
0312 E001 LDI R16,1
0313 DE8D RCALL _OutB
(0543) Delayus(1);
0314 E001 LDI R16,1
0315 E010 LDI R17,0
0316 DD79 RCALL _Delayus
(0544) i=InB( ); //可选地读取一个字节
0317 DEAD RCALL _InB
(0545)
(0546) OutB(CMD,0xF0); //发送写缓冲区命令
0318 EF20 LDI R18,0xF0
0319 E001 LDI R16,1
031A DE86 RCALL _OutB
(0547) Delayus(1);
031B E001 LDI R16,1
031C E010 LDI R17,0
031D DD72 RCALL _Delayus
(0548) OutB(DAT,0); //写入一个保留字节
031E 2722 CLR R18
031F 2700 CLR R16
0320 DE80 RCALL _OutB
(0549) Delayus(1);
0321 E001 LDI R16,1
0322 E010 LDI R17,0
0323 DD6C RCALL _Delayus
(0550) OutB(DAT,len); //写入即将写入的字节数目
0324 2D2A MOV R18,R10
0325 2700 CLR R16
0326 DE7A RCALL _OutB
(0551) Delayus(1);
0327 E001 LDI R16,1
0328 E010 LDI R17,0
0329 DD66 RCALL _Delayus
(0552)
(0553) for(i=0; i<len; i++)
032A 2744 CLR R20
032B C008 RJMP 0x0334
(0554) {
(0555) OutB(DAT,*(buf+i)); //写入指定的字节
032C 2FE4 MOV R30,R20
032D 27FF CLR R31
032E 0FE6 ADD R30,R22
032F 1FF7 ADC R31,R23
0330 8120 LDD R18,0+Z
0331 2700 CLR R16
0332 DE6E RCALL _OutB
0333 9543 INC R20
0334 154A CP R20,R10
0335 F3B0 BCS 0x032C
(0556) }
(0557) Delayus(1);
0336 E001 LDI R16,1
0337 E010 LDI R17,0
0338 DD57 RCALL _Delayus
(0558) OutB(CMD,0xFA); //使缓冲区有效
0339 EF2A LDI R18,0xFA
033A E001 LDI R16,1
033B DE65 RCALL _OutB
(0559)
(0560) if(USB_FLAG.in_isr == 0)
033C 90200064 LDS R2,0x64
033E 2022 TST R2
033F F409 BNE 0x0341
(0561) EN_GINT();
0340 9478 BSET 7
(0562)
(0563) return len; //返回写入的字节数
0341 2D0A MOV R16,R10
0342 940E0763 CALL pop_gset3
0344 9508 RET
_Ack_EP:
endp --> R20
0345 940E0741 CALL push_gset1
0347 2F40 MOV R20,R16
(0564) }
(0565) /*******************************************
(0566) 函数名称: Ack_EP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -