📄 usbd12.lst
字号:
(0567) 功 能: 应答Setup
(0568) 参 数: endp--端点索引号,取值 0 ~ 5
(0569) 返回值 : 无
(0570) /********************************************/
(0571) void Ack_EP(uchar endp)
(0572) {
(0573) OutB(CMD,endp); //选择端点
0348 2F24 MOV R18,R20
0349 E001 LDI R16,1
034A DE56 RCALL _OutB
(0574) Delayus(1);
034B E001 LDI R16,1
034C E010 LDI R17,0
034D DD42 RCALL _Delayus
(0575) OutB(CMD,0xF1); //应答Setup指令
034E EF21 LDI R18,0xF1
034F E001 LDI R16,1
0350 DE50 RCALL _OutB
(0576) Delayus(1);
0351 E001 LDI R16,1
0352 E010 LDI R17,0
0353 DD3C RCALL _Delayus
(0577) if(endp==0)
0354 2344 TST R20
0355 F419 BNE 0x0359
(0578) {
(0579) OutB(CMD,0xF2); //清空该端点缓冲区
0356 EF22 LDI R18,0xF2
0357 E001 LDI R16,1
0358 DE48 RCALL _OutB
(0580) }
(0581) }
0359 940E0744 CALL pop_gset1
035B 9508 RET
_Clear_buf:
endp --> R20
035C 940E0741 CALL push_gset1
035E 2F40 MOV R20,R16
(0582) /*******************************************
(0583) 函数名称: Clear_buf
(0584) 功 能: 清指定端点的缓冲区(包括双缓冲区)
(0585) 参 数: endp--端点索引号,取值 0 ~ 5
(0586) 返回值 : 无
(0587) /********************************************/
(0588) void Clear_buf(uchar endp)
(0589) {
(0590) OutB(CMD,endp); //选择端点
035F 2F24 MOV R18,R20
0360 E001 LDI R16,1
0361 DE3F RCALL _OutB
(0591) Delayus(1);
0362 E001 LDI R16,1
0363 E010 LDI R17,0
0364 DD2B RCALL _Delayus
(0592) OutB(CMD,0xF2); //清空第1个缓冲区
0365 EF22 LDI R18,0xF2
0366 E001 LDI R16,1
0367 DE39 RCALL _OutB
(0593)
(0594) if (endp>=4)
0368 3044 CPI R20,4
0369 F048 BCS 0x0373
(0595) {
(0596) OutB(CMD,endp); //选择端点
036A 2F24 MOV R18,R20
036B E001 LDI R16,1
036C DE34 RCALL _OutB
(0597) Delayus(1);
036D E001 LDI R16,1
036E E010 LDI R17,0
036F DD20 RCALL _Delayus
(0598) OutB(CMD,0xF2); //清空第2个缓冲区
0370 EF22 LDI R18,0xF2
0371 E001 LDI R16,1
0372 DE2E RCALL _OutB
(0599) }
(0600) }
0373 940E0744 CALL pop_gset1
0375 9508 RET
(0601) /*******************************************
(0602) 函数名称: Stall_ep0
(0603) 功 能: 使控制端点处于停止状态
(0604) 参 数: 无
(0605) 返回值 : 无
(0606) /********************************************/
(0607) void Stall_ep0(void)
(0608) {
(0609) Set_EPsta(0,1);
_Stall_ep0:
0376 E021 LDI R18,1
0377 2700 CLR R16
0378 DF31 RCALL _Set_EPsta
(0610) Set_EPsta(1,1);
0379 E021 LDI R18,1
037A E001 LDI R16,1
(0611) }
037B CF2E RJMP _Set_EPsta
_S_trans:
len --> R20
buf --> R22
037C 940E0758 CALL push_gset2
037E 2F42 MOV R20,R18
037F 01B8 MOVW R22,R16
0380 9722 SBIW R28,2
(0612) /*******************************************
(0613) 函数名称: S_trans
(0614) 功 能: 通过端点索引 1 发送数据(DATA 类型)
(0615) 参 数: buf--发送数据指针
(0616) len--发送数据长度
(0617) 返回值 : 无
(0618) /********************************************/
(0619) void S_trans(uchar * buf, uchar len)
(0620) {
(0621) if(len<=EP0_PACKET_SIZE)
0381 E180 LDI R24,0x10
0382 1784 CP R24,R20
0383 F028 BCS 0x0389
(0622) { //长度小于EP0最大信息包大小才允许发送
(0623) Write_EP(1,len,buf);
0384 8368 STD R22,0+Y
0385 8379 STD R23,1+Y
0386 2F24 MOV R18,R20
0387 E001 LDI R16,1
0388 DF7D RCALL _Write_EP
(0624) }
(0625) }
0389 9622 ADIW R28,2
038A 940E0760 CALL pop_gset2
038C 9508 RET
_Code_trans:
len --> R22
pRomData --> R20
038D 940E0758 CALL push_gset2
038F 01B9 MOVW R22,R18
0390 01A8 MOVW R20,R16
0391 9722 SBIW R28,2
(0626) /*******************************************
(0627) 函数名称: Code_trans
(0628) 功 能: 通过端点索引 1 发送数据(CODE类型)
(0629) 参 数: buf--发送数据指针
(0630) len--发送数据长度
(0631) 返回值 : 无
(0632) /********************************************/
(0633) void Code_trans(uchar *pRomData, uint len)
(0634) {
(0635) ControlData.wCount = 0; //传输字节数计数器清0
0392 2422 CLR R2
0393 2433 CLR R3
0394 92300125 STS R3,0x125
0396 92200124 STS R2,0x124
(0636) if(ControlData.wLength > len)
0398 90200122 LDS R2,0x122
039A 90300123 LDS R3,0x123
039C 1562 CP R22,R2
039D 0573 CPC R23,R3
039E F420 BCC 0x03A3
(0637) ControlData.wLength = len; //传输数据总字节数不得超过len
039F 93700123 STS R23,0x123
03A1 93600122 STS R22,0x122
(0638)
(0639) ControlData.pData = pRomData; //传输数据指针指向pRomData
03A3 93500127 STS R21,0x127
03A5 93400126 STS R20,0x126
(0640) if( ControlData.wLength >= EP0_PACKET_SIZE)
03A7 91800122 LDS R24,0x122
03A9 91900123 LDS R25,0x123
03AB 3180 CPI R24,0x10
03AC E0E0 LDI R30,0
03AD 079E CPC R25,R30
03AE F0A8 BCS 0x03C4
(0641) { //传输数据总字节数大于端点0最大信息包大小
(0642) Write_EP(1, EP0_PACKET_SIZE, ControlData.pData); //发送端点0最大信息包大小个字节
03AF 011A MOVW R2,R20
03B0 8228 STD R2,0+Y
03B1 8239 STD R3,1+Y
03B2 E120 LDI R18,0x10
03B3 E001 LDI R16,1
03B4 DF51 RCALL _Write_EP
(0643) ControlData.wCount += EP0_PACKET_SIZE; //统计已发送字节数
03B5 91800124 LDS R24,0x124
03B7 91900125 LDS R25,0x125
03B9 9640 ADIW R24,0x10
03BA 93900125 STS R25,0x125
03BC 93800124 STS R24,0x124
(0644)
(0645) UEN_GINT();
03BE 94F8 BCLR 7
(0646) USB_FLAG.control_state = USB_TRANSMIT; //标志数据发送状态
03BF E081 LDI R24,1
03C0 93800065 STS R24,0x65
(0647) EN_GINT();
03C2 9478 BSET 7
(0648) }
03C3 C019 RJMP 0x03DD
(0649) else
(0650) {
(0651) Write_EP(1, ControlData.wLength, pRomData); //写入传输数据总字节数
03C4 8348 STD R20,0+Y
03C5 8359 STD R21,1+Y
03C6 91200122 LDS R18,0x122
03C8 E001 LDI R16,1
03C9 DF3C RCALL _Write_EP
(0652) ControlData.wCount += ControlData.wLength; //统计已发送字节数
03CA 90200122 LDS R2,0x122
03CC 90300123 LDS R3,0x123
03CE 90400124 LDS R4,0x124
03D0 90500125 LDS R5,0x125
03D2 0C42 ADD R4,R2
03D3 1C53 ADC R5,R3
03D4 92500125 STS R5,0x125
03D6 92400124 STS R4,0x124
(0653) UEN_GINT();
03D8 94F8 BCLR 7
(0654) USB_FLAG.control_state = USB_IDLE; //标志空闲状态
03D9 2422 CLR R2
03DA 92200065 STS R2,0x65
(0655) EN_GINT();
03DC 9478 BSET 7
(0656) }
(0657) }
03DD 9622 ADIW R28,2
03DE 940E0760 CALL pop_gset2
03E0 9508 RET
_USB_INT1:
b --> Y+1
a --> Y+1
int_sta --> R20
03E1 940E0713 CALL push_lset
03E3 940E0741 CALL push_gset1
(0658) /*******************************************
(0659) 函数名称: USB_INT1
(0660) 功 能: D12中断服务函数
(0661) 参 数: 无
(0662) 返回值 : 无
(0663) /********************************************/
(0664) void USB_INT1(void)
(0665) {
(0666) uint int_sta;
(0667) uchar a,b;
(0668) UEN_GINT(); //进入D12中断服务程序时关中断
03E5 94F8 BCLR 7
(0669)
(0670) USB_FLAG.in_isr = 1;//-----------------------------
03E6 E081 LDI R24,1
03E7 93800064 STS R24,0x64
(0671) int_sta=Read_IntR(); //读取PDIUSBD12中断寄存器值
03E9 DE69 RCALL _Read_IntR
03EA 01A8 MOVW R20,R16
(0672) //a=int_sta;
(0673) //b=int_sta>>8;
(0674) //Uart_sendB(a);
(0675) //Uart_sendB(b);
(0676) if(int_sta!=0)
03EB 3000 CPI R16,0
03EC 0701 CPC R16,R17
03ED F0B9 BEQ 0x0405
(0677) {
(0678) if(int_sta&INT_BUSRESET)
03EE FF46 SBRS R20,6
03EF C003 RJMP 0x03F3
(0679) USB_FLAG.bus_reset=1; //USB总线复位标志
03F0 E081 LDI R24,1
03F1 93800060 STS R24,0x60
(0680) if(int_sta&INT_ENDP0IN)
03F3 FF41 SBRS R20,1
03F4 C001 RJMP 0x03F6
(0681) Ep0_txdone(); //控制端点发送数据处理
03F5 D0B4 RCALL _Ep0_txdone
(0682) if(int_sta&INT_ENDP0OUT)
03F6 FF40 SBRS R20,0
03F7 C001 RJMP 0x03F9
(0683) Ep0_rxdone(); //控制端点接收数据处理
03F8 D015 RCALL _Ep0_rxdone
(0684) if(int_sta&INT_ENDP1IN)
03F9 FF43 SBRS R20,3
03FA C001 RJMP 0x03FC
(0685) Ep1_txdone(); //端点 1发送数据处理
03FB D113 RCALL _Ep1_txdone
(0686) if(int_sta&INT_ENDP1OUT)
03FC FF42 SBRS R20,2
03FD C001 RJMP 0x03FF
(0687) Ep1_rxdone(); //端点 1接收数据处理
03FE D112 RCALL _Ep1_rxdone
(0688) if(int_sta&INT_ENDP2IN)
03FF FF45 SBRS R20,5
0400 C001 RJMP 0x0402
(0689) Ep2_txdone(); //端点 2发送数据处理
0401 D125 RCALL _Ep2_txdone
(0690) if(int_sta&INT_ENDP2OUT)
0402 FF44 SBRS R20,4
0403 C001 RJMP 0x0405
(0691) Ep2_rxdone(); //端点 2接收数据处理
0404 D124 RCALL _Ep2_rxdone
(0692) }
(0693) USB_FLAG.in_isr = 0;
0405 2422 CLR R2
0406 92200064 STS R2,0x64
(0694)
(0695) EN_GINT(); //退出D12中断服务程序时开中断
0408 9478 BSET 7
(0696) }
0409 940E0744 CALL pop_gset1
040B 940E072A CALL pop_lset
040D 9518 RETI
_Ep0_rxdone:
i --> R20
ep_last --> R20
040E 940E0741 CALL push_gset1
0410 9722 SBIW R28,2
(0697) /*******************************************
(0698) 函数名称: Ep0_rxdone
(0699) 功 能: 通过端点索引 0 接收数据
(0700) 参 数: 无
(0701) 返回值 : 无
(0702) /********************************************/
(0703) void Ep0_rxdone(void)
(0704) {
(0705) uchar ep_last,i;
(0706) ep_last=Read_LttransSta(0); //清除中断寄存器状态,取得最后处理状态
0411 2700 CLR R16
0412 DE88 RCALL _Read_LttransSta
0413 2F40 MOV R20,R16
(0707) if (ep_last&SETUPPACKET)
0414 FF05 SBRS R16,5
0415 C05F RJMP 0x0475
(0708) { //如果收到了建立包(Setup包)
(0709) ControlData.wLength=0; //传输字节总数清0
0416 2422 CLR R2
0417 2433 CLR R3
0418 92300123 STS R3,0x123
041A 92200122 STS R2,0x122
(0710) ControlData.wCount=0; //传输字节计数器清0
041C 92300125 STS R3,0x125
041E 92200124 STS R2,0x124
(0711) if(Read_EP(0,sizeof(ControlData.DeviceRequest),(uchar * )(&(ControlData.DeviceRequest)))!= sizeof(DEVICE_REQUEST))//从端点0读8个字节失败
0420 E18A LDI R24,0x1A
0421 E091 LDI R25,1
0422 8388 STD R24,0+Y
0423 8399 STD R25,1+Y
0424 E028 LDI R18,0x8
0425 2700 CLR R16
0426 DEA1 RCALL _Read_EP
0427 3008 CPI R16,0x8
0428 F051 BEQ 0x0433
(0712) {
(0713) Set_EPsta(0,1); //停止控制端点0
0429 E021 LDI R18,1
042A 2700 CLR R16
042B DE7E RCALL _Set_EPsta
(0714) Set_EPsta(1,1); //停止控制端点1
042C E021 LDI R18,1
042D E001 LDI R16,1
042E DE7B RCALL _Set_EPsta
(0715) USB_FLAG.control_state = USB_IDLE; //设置为等待状态
042F 2422 CLR R2
0430 92200065 STS R2,0x65
(0716) return;
0432 C073 RJMP 0x04A6
(0717) }
(0718) /******** 接收建立包成功 **********///-------------------------
(0719) Ack_EP(0); //对控制端点0进行建立包应答
0433 2700 CLR R16
0434 DF10 RCALL _Ack_EP
(0720) Ack_EP(1); //对控制端点1进行建立包应答
0435 E001 LDI R16,1
0436 DF0E RCALL _Ack_EP
(0721) ControlData.wLength=ControlData.DeviceRequest.wLength; //取出要传输数据的总字节数
0437 90200120 LDS R2,0x120
0439 90300121 LDS R3,0x121
043B 92300123 STS R3,0x123
043D 92200122 STS R2,0x122
(0722) ControlData.wCount = 0;//------------------------------
043F 2422 CLR R2
0440 2433 CLR R3
0441 92300125 STS R3,0x125
0443 92200124 STS R2,0x124
(0723)
(0724) if(ControlData.DeviceRequest.bmRequestType&(uchar)USB_ENDPOINT_DIRECTION_MASK)
0445 9020011A LDS R2,_ControlData
0447 FE27 SBRS R2,7
0448 C006 RJMP 0x044F
(0725) {
(0726) //如果控制传输是控制读取
(0727) USB_FLAG.setup_packet=1; //通知control_handler()处理Setup包
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -