📄 mainloop.lst
字号:
178 1 }
179
C51 COMPILER V7.06 MAINLOOP 12/06/2003 10:37:16 PAGE 4
180 //返回stall应答
181 void stall_ep0(void)
182 {
183 1 D12_SetEndpointStatus(0, 1);
184 1 D12_SetEndpointStatus(1, 1);
185 1 }
186
187 //断开USB总线
188 void disconnect_USB(void)
189 {
190 1 // Initialize D12 configuration
191 1 D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
192 1 }
193
194 //连接USB总线
195 void connect_USB(void)
196 {
197 1 // reset event flags
198 1 DISABLE;
199 1 bEPPflags.value = 0;//清除所有状态
200 1 ENABLE;
201 1
202 1 // V2.1 enable normal+sof interrupt
203 1 D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
204 1
205 1 // Initialize D12 configuration
206 1 D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
207 1 }
208
209 //重新连接到USB总线
210 void reconnect_USB(void)
211 {
212 1 unsigned long clk_cnt;
213 1
214 1 // Pull-down D12's SUSPEND pin
215 1 // Disable 74HCT123 pulse generation before disconnect
216 1 // Release D12's SUSPEND pin after receiving bus reset from host
217 1 D12SUSPD = 0;
218 1 disconnect_USB();
219 1
220 1 clk_cnt = ClockTicks;
221 1 while(ClockTicks < clk_cnt + 20)
222 1 ;
223 1
224 1 connect_USB();
225 1
226 1 }
227
228 //恢复到未配置状态
229 void init_unconfig(void)
230 {
231 1 // unsigned char i;
232 1
233 1 D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
234 1 }
235
236 //设置配置状态
237 void init_config(void)
238 {
239 1 D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
240 1 }
241
C51 COMPILER V7.06 MAINLOOP 12/06/2003 10:37:16 PAGE 5
242 //从端点号1发送数据
243 void single_transmit(unsigned char * buf, unsigned char len)
244 {
245 1 if( len <= EP0_PACKET_SIZE) {
246 2 D12_WriteEndpoint(1, len, buf);
247 2 }
248 1 }
249
250 //发送端点号1建立代码
251 void code_transmit(unsigned char code * pRomData, unsigned short len)
252 {
253 1 ControlData.wCount = 0;
254 1 if(ControlData.wLength > len)
255 1 ControlData.wLength = len;
256 1
257 1 ControlData.pData = pRomData;
258 1 if( ControlData.wLength >= EP0_PACKET_SIZE) {
259 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
260 2 ControlData.wCount += EP0_PACKET_SIZE;
261 2 DISABLE;
262 2 bEPPflags.bits.control_state = USB_TRANSMIT;
263 2 ENABLE;
264 2 }
265 1 else {
266 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
267 2 ControlData.wCount += ControlData.wLength;
268 2 DISABLE;
269 2 bEPPflags.bits.control_state = USB_IDLE;
270 2 ENABLE;
271 2 }
272 1 }
273
274
275 //LED和按键处理子程序
276 void check_key_LED(void)
277 {
278 1 static unsigned char kk=0x00;
279 1 static unsigned char c = 0xff;
280 1 static bit last_key = 1;
281 1 LED_CS=1;
282 1 KD_KEY=1;
283 1 send(0x00);
284 1
285 1 if(KD_KEY^last_key )
286 1 {
287 2 last_key = ~last_key;
288 2 c=~c;
289 2 D12_WriteEndpoint(3, 1, &c);//发送按键状态
290 2 }
291 1
292 1 if(bEPPflags.bits.ep1_rxdone)
293 1 {
294 2 DISABLE;
295 2 bEPPflags.bits.ep1_rxdone = 0;
296 2 ENABLE;
297 2 kk=~GenEpBuf[3]; ;//改变LED状态
298 2
299 2 }
300 1 send(kk);
301 1 LED_CS=0;
302 1 delay(0x01);
303 1 LED_CS=1;
C51 COMPILER V7.06 MAINLOOP 12/06/2003 10:37:16 PAGE 6
304 1 }
305
306 //DMA建立子程序
307 void setup_dma()
308 {
309 1 ioSize = ioRequest.uSize;
310 1 ioCount = 0;
311 1
312 1 DISABLE;
313 1 bEPPflags.bits.dma_state = DMA_RUNNING;
314 1 ENABLE;
315 1
316 1 single_transmit(0, 0);
317 1
318 1 if(ioRequest.bCommand & 0x1) {
319 2 if(ioSize > 64 || ioSize == 0) {
320 3 //传输大于64字节数据
321 3 D12_WriteEndpoint(5, 64, EpBuf);
322 3 ioCount += 64;
323 3 }
324 2 else {
325 3 //传输64字节数据
326 3 D12_WriteEndpoint(5, ioSize, EpBuf);
327 3 ioCount += ioSize;
328 3 }
329 2 }
330 1 }
331
332 //请求处理子程序
333 void control_handler()
334 {
335 1 unsigned char type, req;
336 1
337 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
338 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
339 1
340 1 if (type == USB_STANDARD_REQUEST)
341 1 (*StandardDeviceRequest[req])();//调用标准请求
342 1 else if (type == USB_VENDOR_REQUEST)
343 1 (*VendorDeviceRequest[req])();//调用厂商请求
344 1 else
345 1 stall_ep0();
346 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 703 ----
CONSTANT SIZE = 96 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 26 8
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -