📄 cp2200.lst
字号:
C51 COMPILER V9.00 CP2200 02/08/2010 20:58:32 PAGE 5
241 1 MAC_Write(MACAD0, temp_int.Int);
242 1
243 1 temp_int.Char[0] = pMAC->Char[3];
244 1 temp_int.Char[1] = pMAC->Char[2];
245 1 MAC_Write(MACAD1, temp_int.Int);
246 1
247 1 temp_int.Char[0] = pMAC->Char[1];
248 1 temp_int.Char[1] = pMAC->Char[0];
249 1 MAC_Write(MACAD2, temp_int.Int);
250 1
251 1 return;
252 1 }
253
254
255 /*---------------------------------------------------------------------------*/
256 /*CP2200接收*/
257 void CP220x_Send(void)
258 {
259 1
260 1 u16_t i;
261 1 u16_t ramaddr;
262 1 u8_t *ptr;
263 1
264 1 ptr = uip_buf;
265 1
266 1 // Define Macro to increment the RAM address Pointer
267 1 #define INC_RAMADDR {ramaddr++; \
268 1 RAMADDRH = (ramaddr >> 8);\
269 1 RAMADDRL = (ramaddr & 0x00FF);}
270 1
271 1
272 1 //Step 1: Poll TXBUSY until it becomes 0x00
273 1 while(TXBUSY);
274 1
275 1 // Step 2: Set the TXSTARTH:TXSTARTL address to 0x0000
276 1 TXSTARTH = 0x00;
277 1 TXSTARTL = 0x00;
278 1
279 1
280 1 // Step 3: Load data into transmit buffer
281 1 // When the random access method is used, we do not need to check for
282 1 // aborted packets. This method will be slightly slower than the Autowrite
283 1 // method, however, it reduces code space requirements.
284 1
285 1 // Setup RAM Address Pointer To 0x0000
286 1 RAMADDRH = 0x00;
287 1 RAMADDRL = 0x00;
288 1 ramaddr = 0x0000;
289 1 // Step 3d: Load the packet payload
290 1
291 1 for(i = 0; i < uip_len; i++)
292 1 {
293 2 if(i==40+UIP_LLH_LEN)
294 2 {
295 3 ptr=(u8_t *)uip_appdata; //appdata
296 3 }
297 2 RAMTXDATA = *ptr++;
298 2 INC_RAMADDR
299 2 }
300 1
301 1 // Step 3e: Pad short packets
302 1 while(ramaddr < 64)
C51 COMPILER V9.00 CP2200 02/08/2010 20:58:32 PAGE 6
303 1 {
304 2 RAMTXDATA = 0;
305 2 INC_RAMADDR
306 2 }
307 1
308 1 // Set the TXENDH:TXENDL address to <ramaddr - 1>
309 1 ramaddr--;
310 1 TXENDH = (ramaddr >> 8);
311 1 TXENDL = (ramaddr & 0x00FF);
312 1 // Step 4: Set the TXSTARTH:TXSTARTL address back to 0x0000
313 1 TXSTARTH = 0x00;
314 1 TXSTARTL = 0x00;
315 1 // Step 5: Write '1' to TXGO to begin transmission
316 1 TXCN = 0x01;
317 1
318 1
319 1 }
320 /*---------------------------------------------------------------------------*/
321 /*CP2200发送*/
322 u16_t rcve_frame(void)
323
324 {
325 1 bit rx_ok;
326 1 bit skip = 0;
327 1 UINT1 cplen;
328 1 u16_t i;
329 1
330 1
331 1 u8_t interrupt_read;
332 1 u8_t valid_bits;
333 1 u8_t num_packets;
334 1
335 1 // Clear interrupt flags.
336 1 interrupt_read = INT1;
337 1 interrupt_read = INT0;
338 1
339 1 // Check for packet received interrupt
340 1 if( interrupt_read & RXINT)
341 1 {
342 2 // Count the number of packets in the receive buffer
343 2 // This is equal to the number of bits set to 1 in TLBVALID
344 2 valid_bits = TLBVALID;
345 2 for(num_packets = 0; valid_bits; num_packets++)
346 2 {
347 3 valid_bits &= valid_bits - 1;
348 3 }
349 2
350 2 // If the receive buffer has 7 packets, then disable reception.
351 2 if( num_packets >= 7)
352 2 {
353 3 RXCN = RXINH; // Inhibit New Packet Reception
354 3 }
355 2 }
356 1
357 1 // Step 1: Check the RXOK bit to see if packet was received correctly
358 1 rx_ok = (CPINFOL & RXOK) && (CPINFOH & RXVALID);
359 1
360 1 // Step 2: If packet received correctly, read the length, otherwise, skip packet.
361 1 if(rx_ok)
362 1 {
363 2 // Read the packet length
364 2 cplen.Char[0] = CPLENH;
C51 COMPILER V9.00 CP2200 02/08/2010 20:58:32 PAGE 7
365 2 cplen.Char[1] = CPLENL;
366 2
367 2 }
368 1 else
369 1 {
370 2 // Set packet length to zero
371 2 cplen.Int = 0;
372 2 // Skip packet
373 2 skip = 1;
374 2 return(cplen.Int);
375 2 }
376 1
377 1 // Step 3: Read the entire packet from the buffer
378 1 // If packet will fit in the buffer
379 1 if(1)
380 1 {
381 2
382 2 // Copy entire packet
383 2 for(i = 0; i < cplen.Int; i++)
384 2 {
385 3 *(uip_buf + i)= RXAUTORD;
386 3 }
387 2 skip=0;
388 2
389 2 }
390 1 else
391 1 {
392 2 // Set packet length to zero
393 2 cplen.Int = 0;
394 2 // Skip packet
395 2 skip = 1;
396 2 }
397 1
398 1 // Step 4: Skip the packet, or clear the valid bit if the entire packet
399 1 // has been unloaded from the buffer.
400 1
401 1 if(skip)
402 1 {
403 2 RXCN |= 0x02; // Skip the packet RXSKIP
404 2 }
405 1 else
406 1 {
407 2 RXCN |= 0x04; // Clear the valid bit only
408 2 }
409 1
410 1 // If there are no more packets in the receive buffer, enable reception
411 1 if(TLBVALID == 0x00)
412 1 {
413 2 RXCN = 0x00;
414 2 }
415 1 // Return the number of bytes added to the buffer
416 1
417 1 return(cplen.Int);
418 1 }
419 /*---------------------------------------------------------------------------*/
420 /*发送*/
421 void etherdev_send(void)
422 {
423 1 CP220x_Send();
424 1 }
425 /*---------------------------------------------------------------------------*/
426 /*接收*/
C51 COMPILER V9.00 CP2200 02/08/2010 20:58:32 PAGE 8
427 u16_t etherdev_read(void)
428 {
429 1
430 1 return(rcve_frame());
431 1 }
432 /*---------------------------------------------------------------------------*/
433 /*初始化CP2200*/
434 void etherdev_init(void)
435 {
436 1 u8_t err_val;
437 1
438 1 CP220x_RST_Low();
439 1 Delay1ms(200);
440 1 Delay1ms(200);
441 1 CP220x_RST_High();
442 1 Delay1ms(200);
443 1 Delay1ms(200);
444 1
445 1 INT0EN = 0x03; /* CP2200 中断使能寄存器0*/
446 1 /*1:允许接收FIFO满中断*/
447 1 /*1:允许包接收中断。*/
448 1
449 1
450 1 INT1EN = 0x00; /* CP2200 中断使能寄存器1*/
451 1 /*CP2200 35/106 中文DATASHEET*/
452 1
453 1 /* Clear all Interrupt Flags by reading the self-clearing status registers*/
454 1 /*temp_char = INT0;*/
455 1 /*temp_char = INT1;*/
456 1
457 1 do
458 1 {
459 2 err_val = PHY_Init(); /*PHY初始化 等待完成*/
460 2 }
461 1 while(err_val!=0);
462 1
463 1 Delay1ms(50);
464 1 MAC_Init();
465 1 Delay1ms(50);
466 1
467 1 ET2 = 1; /* Enable timer 2 interrupt*/
468 1 RXCN = RXCLEAR; /*接收缓冲区清除 向该位写1将丢弃接收缓冲区中的所有包*/
469 1 /*并将缓冲区指针和有效位清0。注:当前位于缓冲区中的*/
470 1 /*任何包仍保留在存储器中,但所有信息如每个包的起始*/
471 1 /*地址和长度都将丢失。任何新到达的包都会覆盖现有数据*/
472 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 847 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 12 11
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -