📄 isr.lst
字号:
C51 COMPILER V7.06 ISR 04/14/2004 12:09:05 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE ISR
OBJECT MODULE PLACED IN Isr.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Isr.c OPTIMIZE(2,SPEED) DEBUG OBJECTEXTEND
stmt level source
1 #include <stdio.h>
2 #include <string.h>
3
4 #include <reg51.h> /* special function register declarations */
5
6 #include "epphal.h"
7 #include "d12ci.h"
8 #include "mainloop.h"
9 #include "usb100.h"
10
11 extern void bus_reset(void);
12
13 extern void ep0_txdone(void);
14 extern void ep0_rxdone(void);
15
16 extern void ep1_txdone(void);
17 extern void ep1_rxdone(void);
18
19 extern void main_txdone(void);
20 extern void main_rxdone(void);
21
22 extern void dma_eot(void);
23
24 /*
25 //*************************************************************************
26 // Public static data
27 //*************************************************************************
28 */
29
30 EPPFLAGS bEPPflags;
31
32 /* Control endpoint TX/RX buffers */
33 extern CONTROL_XFER ControlData;
34
35 /* ISR static vars */
36 unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
37 unsigned char idata EpBuf[EP2_PACKET_SIZE];
38 IO_REQUEST idata ioRequest;
39 unsigned char ioSize, ioCount;
40 unsigned long ClockTicks = 0;
41
42 extern BOOL bNoRAM;
43
44 //定时器0中断处理
45 timer_isr() interrupt 1
46 {
47 1 DISABLE;
48 1 ClockTicks++;
49 1 bEPPflags.bits.timer = 1;
50 1 ENABLE;
51 1 }
52
53 //USB中断处理
54 usb_isr() interrupt 0
55 {
C51 COMPILER V7.06 ISR 04/14/2004 12:09:05 PAGE 2
56 1 DISABLE;
57 1 fn_usb_isr();
58 1 ENABLE;
59 1 }
60
61 //USB中断服务子程序
62 void fn_usb_isr()
63 {
64 1 unsigned int i_st;
65 1
66 1 bEPPflags.bits.in_isr = 1;
67 1
68 1 i_st = D12_ReadInterruptRegister();//读取中断寄存器
69 1
70 1 if(i_st != 0) {
71 2 if(i_st & D12_INT_BUSRESET) {
72 3 bus_reset();//USB总线服务
73 3 bEPPflags.bits.bus_reset = 1;
74 3 }
75 2
76 2 if(i_st & D12_INT_EOT)
77 2 dma_eot();//DMA传输结束
78 2
79 2 if(i_st & D12_INT_SUSPENDCHANGE)
80 2 bEPPflags.bits.suspend = 1;//挂起改变
81 2
82 2 if(i_st & D12_INT_ENDP0IN)
83 2 ep0_txdone();//端点0IN中断
84 2 if(i_st & D12_INT_ENDP0OUT)
85 2 ep0_rxdone();//端点0OUT中断
86 2 if(i_st & D12_INT_ENDP1IN)
87 2 ep1_txdone();//端点1IN中断
88 2 if(i_st & D12_INT_ENDP1OUT)
89 2 ep1_rxdone();//端点1OUT中断
90 2 if(i_st & D12_INT_ENDP2IN)
91 2 main_txdone();//端点2IN中断
92 2 if(i_st & D12_INT_ENDP2OUT)
93 2 main_rxdone();//端点2OUT中断
94 2 }
95 1
96 1 bEPPflags.bits.in_isr = 0;
97 1 }
98
99 //总线复位处理子程序
100 void bus_reset(void)
101 {
102 1 }
103
104 //端点0OUT中断
105 void ep0_rxdone(void)
106 {
107 1 unsigned char ep_last, i;
108 1
109 1 ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
110 1
111 1 if (ep_last & D12_SETUPPACKET) {
112 2 //接收到SETUP包
113 2 ControlData.wLength = 0;
114 2 ControlData.wCount = 0;
115 2
116 2 if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
117 2 (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
C51 COMPILER V7.06 ISR 04/14/2004 12:09:05 PAGE 3
118 3 //SETUP包出错,返回
119 3 D12_SetEndpointStatus(0, 1);
120 3 D12_SetEndpointStatus(1, 1);
121 3 bEPPflags.bits.control_state = USB_IDLE;
122 3 return;
123 3 }
124 2
125 2 ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
126 2 ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
127 2 ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
128 2
129 2 //对控制端点的输入/输出进行应答
130 2 D12_AcknowledgeEndpoint(0);
131 2 D12_AcknowledgeEndpoint(1);
132 2
133 2 ControlData.wLength = ControlData.DeviceRequest.wLength;
134 2 ControlData.wCount = 0;
135 2
136 2 if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
137 3 //从主机传输数据
138 3 bEPPflags.bits.setup_packet = 1;
139 3 bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */
140 3 }
141 2 else {
142 3 if (ControlData.DeviceRequest.wLength == 0) {
143 4 bEPPflags.bits.setup_packet = 1;
144 4 bEPPflags.bits.control_state = USB_IDLE; /* set command */
145 4 }
146 3 else {
147 4 if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
148 5 //接收数据长度为0
149 5 bEPPflags.bits.control_state = USB_IDLE;
150 5 D12_SetEndpointStatus(0, 1);
151 5 D12_SetEndpointStatus(1, 1);
152 5 }
153 4 else {
154 5 bEPPflags.bits.control_state = USB_RECEIVE; //设置接收状态
155 5 }
156 4 } // set command with data
157 3 } // else set command
158 2 } // if setup packet
159 1
160 1 else if (bEPPflags.bits.control_state == USB_RECEIVE) {
161 2 //接收数据
162 2 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
163 2 ControlData.dataBuffer + ControlData.wCount);
164 2 ControlData.wCount += i;
165 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
166 3 //数据接收完毕
167 3 bEPPflags.bits.setup_packet = 1;
168 3 bEPPflags.bits.control_state = USB_IDLE;
169 3 }
170 2 }
171 1 else {
172 2 bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
173 2 }
174 1 }
175
176 //端点0IN处理
177 void ep0_txdone(void)
178 {
179 1 short i = ControlData.wLength - ControlData.wCount;
C51 COMPILER V7.06 ISR 04/14/2004 12:09:05 PAGE 4
180 1 D12_ReadLastTransactionStatus(1); //清中断标志位
181 1 if (bEPPflags.bits.control_state != USB_TRANSMIT)
182 1 return;//非发送状态,返回
183 1
184 1 if( i >= EP0_PACKET_SIZE) {
185 2 //剩下数据大于16字节,发送16字节
186 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
187 2 ControlData.wCount += EP0_PACKET_SIZE;
188 2 bEPPflags.bits.control_state = USB_TRANSMIT;
189 2 }
190 1 else if( i != 0) {
191 2 //发送剩下数据
192 2 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
193 2 ControlData.wCount += i;
194 2 bEPPflags.bits.control_state = USB_IDLE;
195 2 }
196 1 else if (i == 0){
197 2 D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
198 2 bEPPflags.bits.control_state = USB_IDLE;
199 2 }
200 1 }
201
202 //DMA结束处理
203 void dma_eot(void)
204 {
205 1 }
206
207 //端点1OUT处理
208 void ep1_txdone(void)
209 {
210 1 D12_ReadLastTransactionStatus(3); //清中断标志位
211 1 }
212
213 //端点1IN处理
214 void ep1_rxdone(void)
215 {
216 1 unsigned char len;
217 1
218 1 D12_ReadLastTransactionStatus(2); //清中断标志位
219 1 len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
220 1 if(len != 0)
221 1 bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
222 1 }
223
224 //主端点OUT控制
225 void main_txdone(void)
226 {
227 1 // unsigned char len,epstatus;
228 1
229 1 D12_ReadLastTransactionStatus(5); //清中断标志位
230 1 }
231
232 //主端点IN控制
233 void main_rxdone(void)
234 {
235 1 unsigned char len,epstatus;
236 1
237 1 D12_ReadLastTransactionStatus(4); //清中断标志位
238 1
239 1 //接收数据
240 1 len = D12_ReadEndpoint(4, 64, EpBuf);
241 1 epstatus=D12_ReadEndpointStatus(4);
C51 COMPILER V7.06 ISR 04/14/2004 12:09:05 PAGE 5
242 1 epstatus &= 0x60;
243 1 if (epstatus == 0x60)
244 1 len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
245 1 }
246
247
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 876 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 9
IDATA SIZE = 86 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -