dataxfer.c
上传用户:lilishw
上传日期:2021-05-28
资源大小:1542k
文件大小:5k
源码类别:

Modem编程

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------------------------------
  2. //  Project:-   DE8681
  3. //  Filename:-  DATAXFER.C
  4. //  Description:-   Data Transfer routines
  5. //  Programmer:-    D.T.F   
  6. //  Version:-   2.0
  7. //  Created:-   28th February 2002
  8. //  Last modified:- 
  9. //---------------------------------------------------------------------------------------------------
  10. //  (C) Consumer Microcircuits Ltd 2002
  11. //
  12. //  This firmware was designed by:-
  13. //          Consumer Microcircuits Ltd,
  14. //          Langford, Maldon,
  15. //          ESSEX
  16. //          CM9 6WG.
  17. //  in the UK for use with CML evaluation kits only and is based on UK originated technology.
  18. //  Please contact
  19. //          sales@cmlmicro.co.uk
  20. //          +44 (0)1621 875500
  21. //  for licensing details.
  22. //---------------------------------------------------------------------------------------------------
  23. #define DATAXFER_C
  24. #include    "ef8681.h"
  25. void dataxfer(void)
  26. {
  27.     DATABUFLDPTR = 0x00;            // Initialise Data Buffer Load pointer
  28.     DATABUFRDPTR = 0x00;            // Initialise Data Buffer Read pointer
  29.     ESCTMR = S12;                   // Start the Escape Timer
  30.     ESCTMREXP = 0;                  // Clear Escape Timer Expired Flag
  31.     ESC1CHAR = 0;                   // Clear 1st Escape Character Match Flag
  32.     ESC2CHAR = 0;                   // Clear 2nd Escape Character Match Flag
  33.     CMXGENCTRL &= 0xFF80;           // Clear any previous irq settings
  34.     CMXGENCTRL ^= 0x0049;           // Enable IRQN output, Tx Rdy and Rx Rdy irq's
  35.     wr16_cbus(CMXGENCTRL_ADDR,CMXGENCTRL);      // Update CBUS register
  36.     POLLTMR = 20;                   // Start 20ms timer used for Rx Energy polling
  37.     do
  38.     {
  39.         if (MSGBUFLDPTR != MSGBUFRDPTR) TXIE=1; // Ensure Tx SCI Interrupt is enabled
  40.         if (DATABUFRDPTR != DATABUFLDPTR)
  41.         {
  42.             if (TX_WAITING)
  43.             {
  44.                 RCIE = 0;           // Disable Rx USART interrupt to prevent adjustment to Data Buffer
  45.                 CMXTXDATA = DATABUF[DATABUFRDPTR++];    // Update shadow register
  46.                 wr_cbus(CMXTXDATA_ADDR,CMXTXDATA);      // Tx contents of current Data buffer location
  47.                 
  48.                             
  49.                 DATABUFRDPTR &= databufwrap;        // Wrap round buffer if necessary
  50.                 RCIE = 1;               // Re-enable Rx USART interrupt
  51.                 TX_WAITING = 0;
  52.             }
  53.         }
  54.         else
  55.         {
  56.             CTSN = 0;                   // Ensure CTSN is low to allow further characters
  57.         }
  58.         if (!PICIRQN || (POLLTMR == 0)) // If irq occurs or Rx energy polling timer expires
  59.         {
  60.             GIE = 0;
  61.         
  62.             CMXSTAT = rd16_cbus(CMXSTAT_ADDR);  // Update Status shadow register and clear irq
  63.             if (RXRDY)
  64.             {
  65.                 MSGBUF[MSGBUFLDPTR++] = rd_cbus(CMXRXDATA_ADDR);    // Load Message Buffer with Rx Data Reg contents
  66.                 MSGBUFLDPTR &= msgbufwrap;      // Wrap round buffer if necessary
  67.             
  68.             }
  69.             if (TXRDY || TXUF)
  70.             {
  71.                 TX_WAITING = 1;     // Set the Tx waiting flag to indicate CMX868 is waiting to tx
  72.             }   
  73.             if (hangup() != 0)      // If Carrier detect is clear for longer than S10
  74.             {
  75.                 reset_cbus();       // Reset CMX868 into powersave, will cause board to go on-hook
  76.                 DCDIND = 0;         // Turn off CD LED
  77.                 DCDN = 1;           // Set DCDN line
  78.                 DATAXFER = 0;       // Abort data transfer 
  79.                 ATCMDMODE = 1;      // Revert back to AT Command Mode
  80.             }
  81.             POLLTMR = 20;           // Reload 20ms timer used for Rx Energy polling
  82.         }
  83.         GIE = 1;
  84.     } while (!ATCMDMODE);           // Continue to loop until AT command mode is required  
  85.     CMXGENCTRL &= 0xFF80;           // Ensure IRQN enable, Tx and Rx Rdy irqs are cleared
  86.     wr16_cbus(CMXGENCTRL_ADDR, CMXGENCTRL);             // Update CBUS register
  87. }
  88. unsigned char hangup()
  89. {
  90.     if (RXENERGYDET && RLYDRV_ON)
  91.     {
  92.         CDLOST = 0;                 // Clear Carrier Detect lost flag
  93.         return(FALSE);
  94.     }
  95.     if (CDLOST)
  96.     {
  97.         if (CDLOSTTMR == 0) return (TRUE);  // If Lost Carrier Detect timer has expired return true.
  98.     }
  99.     else
  100.     {
  101.         CDLOST = 1;                 // Set the Carrier Detect Lost Flag
  102.         CDLOSTTMR = S10;            // Load Lost Carrier timer (100ms increments)
  103.     }
  104.     return (FALSE);
  105. }