📄 isr.lst
字号:
C51 COMPILER V7.50 ISR 02/27/2006 15:58:43 PAGE 1
C51 COMPILER V7.50, 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
line 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 #include "Isr.h"
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
37
38 extern BOOL bNoRAM;
39
40 //定时器0中断处理
41 timer_isr() interrupt 1
42 {
43 1 DISABLE;
44 1 ClockTicks++;
45 1 bEPPflags.bits.timer = 1;
46 1 ENABLE;
47 1 }
48
49 //USB中断处理
50 usb_isr() interrupt 0
51 {
52 1 DISABLE;
53 1 fn_usb_isr();
54 1 ENABLE;
55 1 }
C51 COMPILER V7.50 ISR 02/27/2006 15:58:43 PAGE 2
56
57 //USB中断服务子程序
58 void fn_usb_isr()
59 {
60 1 unsigned int i_st;
61 1
62 1 bEPPflags.bits.in_isr = 1;
63 1
64 1 i_st = D12_ReadInterruptRegister();//读取中断寄存器 调用D12ci.c中的子程序
65 1
66 1 if(i_st != 0) {
67 2 if(i_st & D12_INT_BUSRESET) {
68 3 bus_reset();//USB总线服务
69 3 bEPPflags.bits.bus_reset = 1;
70 3 }
71 2
72 2 if(i_st & D12_INT_EOT)
73 2 dma_eot();//DMA传输结束
74 2
75 2 if(i_st & D12_INT_SUSPENDCHANGE)
76 2 bEPPflags.bits.suspend = 1;//挂起改变
77 2
78 2 if(i_st & D12_INT_ENDP0IN)
79 2 ep0_txdone();//端点0IN中断
80 2 if(i_st & D12_INT_ENDP0OUT)
81 2 ep0_rxdone();//端点0OUT中断
82 2 if(i_st & D12_INT_ENDP1IN)
83 2 ep1_txdone();//端点1IN中断
84 2 if(i_st & D12_INT_ENDP1OUT)
85 2 ep1_rxdone();//端点1OUT中断
86 2 if(i_st & D12_INT_ENDP2IN)
87 2 main_txdone();//端点2IN中断
88 2 if(i_st & D12_INT_ENDP2OUT)
89 2 main_rxdone();//端点2OUT中断
90 2 }
91 1
92 1 bEPPflags.bits.in_isr = 0;
93 1 }
94
95 //总线复位处理子程序
96 void bus_reset(void)
97 {
98 1 }
99
100 //端点0OUT中断
101 void ep0_rxdone(void)
102 {
103 1 unsigned char ep_last, i;
104 1
105 1 ep_last = D12_ReadLastTransactionStatus(0); //清中断标志//调用D12ci.c中的子程序
106 1
107 1 if (ep_last & D12_SETUPPACKET) {
108 2 //接收到SETUP包
109 2 ControlData.wLength = 0;
110 2 ControlData.wCount = 0;
111 2
112 2 if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
113 2 (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) )
114 2 {//SETUP包出错,返回
115 3 D12_SetEndpointStatus(0, 1);
116 3 D12_SetEndpointStatus(1, 1);
117 3 bEPPflags.bits.control_state = USB_IDLE;
C51 COMPILER V7.50 ISR 02/27/2006 15:58:43 PAGE 3
118 3 return;
119 3 }
120 2
121 2 ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
122 2 ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
123 2 ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
124 2
125 2 //对控制端点的输入/输出进行应答
126 2 D12_AcknowledgeEndpoint(0);
127 2 D12_AcknowledgeEndpoint(1);
128 2
129 2 ControlData.wLength = ControlData.DeviceRequest.wLength;
130 2 ControlData.wCount = 0;
131 2
132 2 if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
133 3 //向主机传输数据
134 3 bEPPflags.bits.setup_packet = 1;
135 3 bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */
136 3 }
137 2 else {
138 3 if (ControlData.DeviceRequest.wLength == 0) {
139 4 bEPPflags.bits.setup_packet = 1;
140 4 bEPPflags.bits.control_state = USB_IDLE; /* set command */
141 4 }
142 3 else {
143 4 if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
144 5 //接收数据长度为0
145 5 bEPPflags.bits.control_state = USB_IDLE;
146 5 D12_SetEndpointStatus(0, 1);
147 5 D12_SetEndpointStatus(1, 1);
148 5 }
149 4 else {
150 5 bEPPflags.bits.control_state = USB_RECEIVE; //设置接收状态
151 5 }
152 4 } // set command with data
153 3 } // else set command
154 2 } // if setup packet
155 1
156 1 else if (bEPPflags.bits.control_state == USB_RECEIVE) {
157 2 //接收数据
158 2 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
159 2 ControlData.dataBuffer + ControlData.wCount);
160 2 ControlData.wCount += i;
161 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
162 3 //数据接收完毕
163 3 bEPPflags.bits.setup_packet = 1;
164 3 bEPPflags.bits.control_state = USB_IDLE;
165 3 }
166 2 }
167 1 else {
168 2 bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
169 2 }
170 1 }
171
172 //端点0IN处理
173 void ep0_txdone(void)
174 {
175 1 short i = ControlData.wLength - ControlData.wCount;
176 1 D12_ReadLastTransactionStatus(1); //清中断标志位
177 1 if (bEPPflags.bits.control_state != USB_TRANSMIT)
178 1 return;//非发送状态,返回
179 1
C51 COMPILER V7.50 ISR 02/27/2006 15:58:43 PAGE 4
180 1 if( i >= EP0_PACKET_SIZE) {
181 2 //剩下数据大于16字节,发送16字节
182 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
183 2 ControlData.wCount += EP0_PACKET_SIZE;
184 2 bEPPflags.bits.control_state = USB_TRANSMIT;
185 2 }
186 1 else if( i != 0) {
187 2 //发送剩下数据
188 2 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
189 2 ControlData.wCount += i;
190 2 bEPPflags.bits.control_state = USB_IDLE;
191 2 }
192 1 else if (i == 0){
193 2 D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
194 2 bEPPflags.bits.control_state = USB_IDLE;
195 2 }
196 1 }
197
198 //DMA结束处理
199 void dma_eot(void)
200 {
201 1 }
202
203 //端点1OUT处理
204 void ep1_txdone(void)
205 {
206 1 D12_ReadLastTransactionStatus(3); //清中断标志位
207 1 }
208
209 //端点1IN处理
210 void ep1_rxdone(void)
211 {
212 1 unsigned char len;
213 1
214 1 D12_ReadLastTransactionStatus(2); //清中断标志位
215 1 len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
216 1 if(len != 0)
217 1 bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
218 1 }
219
220 //主端点OUT控制
221 void main_txdone(void)
222 {
223 1 // unsigned char len,epstatus;
224 1
225 1 D12_ReadLastTransactionStatus(5); //清中断标志位
226 1 }
227
228 //主端点IN控制
229 void main_rxdone(void)
230 {
231 1 unsigned char len,epstatus;
232 1
233 1 D12_ReadLastTransactionStatus(4); //清中断标志位
234 1
235 1 //接收数据
236 1 len = D12_ReadEndpoint(4, 64, EpBuf);
237 1 epstatus=D12_ReadEndpointStatus(4);
238 1 epstatus &= 0x60;
239 1 if (epstatus == 0x60)
240 1 len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
241 1 }
C51 COMPILER V7.50 ISR 02/27/2006 15:58:43 PAGE 5
242
243
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 + -