📄 isr.lst
字号:
C51 COMPILER V8.02 ISR 12/19/2007 17:51:24 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE ISR
OBJECT MODULE PLACED IN Isr.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Isr.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "define.h"
2 #include "epphal.h"
3 #include "d12ci.h"
4 #include "mainloop.h"
5 #include "usb100.h"
6 #include "otp.h"
7 #include "isr.h"
8 #include "mainloop.h"
9 #define VERSION 0x20
10
11 unsigned int addr=0;
12 unsigned char two_ci=0;
13 unsigned char dir_otp_flash;
14 bit busb_tx=0;
15
16 /*
17 //*************************************************************************
18 // Public static data
19 //*************************************************************************
20 */
21
22 EPPFLAGS bEPPflags;
23
24 /* Control endpoint TX/RX buffers */
25 extern CONTROL_XFER ControlData;
26
27 /* ISR static vars */
28 unsigned char idata GenEpBuf[5];
29 unsigned char idata EpBuf[128];
30
31 //USB中断处理
32 usb_isr() interrupt 0
33 {
34 1 DISABLE;
35 1 fn_usb_isr();
36 1 ENABLE;
37 1
38 1 //============== 自动检测USB设备
39 1 P3_2=1;
40 1 if (P3_2)
41 1 {
42 2 IT0=0;
43 2 }
44 1 else
45 1 {
46 2 IT0=1;
47 2 }
48 1 }
49
50 //USB中断服务子程序
51 void fn_usb_isr()
52 {
53 1 unsigned int i_st;
54 1
55 1 bEPPflags.bits.in_isr = 1;
C51 COMPILER V8.02 ISR 12/19/2007 17:51:24 PAGE 2
56 1
57 1 i_st = D12_ReadInterruptRegister();//读取中断寄存器
58 1
59 1
60 1 if(i_st != 0) {
61 2
62 2 if(i_st & D12_INT_ENDP0IN)
63 2 ep0_txdone();//端点0IN中断
64 2
65 2 if(i_st & D12_INT_ENDP0OUT)
66 2 ep0_rxdone();//端点0OUT中断
67 2 if(i_st & D12_INT_ENDP1IN)
68 2 ep1_txdone();//端点1IN中断
69 2 if(i_st & D12_INT_ENDP1OUT)
70 2 ep1_rxdone();//端点1OUT中断
71 2 if(i_st & D12_INT_ENDP2IN)
72 2 main_txdone();//端点2IN中断
73 2 if(i_st & D12_INT_ENDP2OUT)
74 2 main_rxdone();//端点2OUT中断
75 2 }
76 1
77 1 bEPPflags.bits.in_isr = 0;
78 1
79 1 }
80
81
82 //端点0OUT中断
83 void ep0_rxdone(void)
84 {
85 1 unsigned char ep_last, i;
86 1
87 1 ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
88 1
89 1 if (ep_last & D12_SETUPPACKET) {
90 2 //接收到SETUP包
91 2 ControlData.wLength = 0;
92 2 ControlData.wCount = 0;
93 2
94 2 if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
95 2 (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
96 3 //SETUP包出错,返回
97 3 D12_SetEndpointStatus(0, 1);
98 3 D12_SetEndpointStatus(1, 1);
99 3 bEPPflags.bits.control_state = USB_IDLE;
100 3 return;
101 3 }
102 2
103 2 ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
104 2 ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
105 2 ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
106 2
107 2 //对控制端点的输入/输出进行应答
108 2 D12_AcknowledgeEndpoint(0);
109 2 D12_AcknowledgeEndpoint(1);
110 2
111 2 ControlData.wLength = ControlData.DeviceRequest.wLength;
112 2 ControlData.wCount = 0;
113 2
114 2 if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
115 3 //从主机传输数据
116 3 bEPPflags.bits.setup_packet = 1;
117 3 bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */
C51 COMPILER V8.02 ISR 12/19/2007 17:51:24 PAGE 3
118 3 }
119 2 else {
120 3 if (ControlData.DeviceRequest.wLength == 0) {
121 4 bEPPflags.bits.setup_packet = 1;
122 4 bEPPflags.bits.control_state = USB_IDLE; /* set command */
123 4 }
124 3 else {
125 4 if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
126 5 //接收数据长度为0
127 5 bEPPflags.bits.control_state = USB_IDLE;
128 5 D12_SetEndpointStatus(0, 1);
129 5 D12_SetEndpointStatus(1, 1);
130 5 }
131 4 else {
132 5 bEPPflags.bits.control_state = USB_RECEIVE; //设置接收状态
133 5 }
134 4 } // set command with data
135 3 } // else set command
136 2 } // if setup packet
137 1
138 1 else if (bEPPflags.bits.control_state == USB_RECEIVE) {
139 2 //接收数据
140 2 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
141 2 ControlData.dataBuffer + ControlData.wCount);
142 2 ControlData.wCount += i;
143 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
144 3 //数据接收完毕
145 3 bEPPflags.bits.setup_packet = 1;
146 3 bEPPflags.bits.control_state = USB_IDLE;
147 3 }
148 2 }
149 1 else {
150 2 bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
151 2 }
152 1 }
153
154 //端点0IN处理
155 void ep0_txdone(void)
156 {
157 1 short i = ControlData.wLength - ControlData.wCount;
158 1 D12_ReadLastTransactionStatus(1); //清中断标志位
159 1 if (bEPPflags.bits.control_state != USB_TRANSMIT)
160 1 return;//非发送状态,返回
161 1
162 1 if( i >= EP0_PACKET_SIZE) {
163 2 //剩下数据大于16字节,发送16字节
164 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
165 2 ControlData.wCount += EP0_PACKET_SIZE;
166 2 bEPPflags.bits.control_state = USB_TRANSMIT;
167 2 }
168 1 else if( i != 0) {
169 2 //发送剩下数据
170 2 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
171 2 ControlData.wCount += i;
172 2 bEPPflags.bits.control_state = USB_IDLE;
173 2 }
174 1 else if (i == 0){
175 2 D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
176 2 bEPPflags.bits.control_state = USB_IDLE;
177 2 }
178 1 }
179
C51 COMPILER V8.02 ISR 12/19/2007 17:51:24 PAGE 4
180 //端点1OUT处理
181 void ep1_txdone(void)
182 {
183 1 D12_ReadLastTransactionStatus(3); //清中断标志位
184 1
185 1 }
186
187
188
189
190
191
192
193 //端点1IN处理
194 void ep1_rxdone(void)
195 {
196 1 unsigned char len;
197 1
198 1 D12_ReadLastTransactionStatus(2); //表示清除端点1接收中断标志位
199 1 len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
200 1 // if(len != 0) //???
201 1 // bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
202 1 switch (GenEpBuf[0])
203 1 {
204 2
205 2 case 0xa0://下载FILE-->FLASH
206 2 {
207 3 addr =0;two_ci =0;
208 3 dir_otp_flash =1; //数据在端点2里面接收
209 3 }
210 2 break;
211 2
212 2 case 0xa1: //上传OTP-->PC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -