⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataxfer.c

📁 CML CMX868 modem
💻 C
字号:
//---------------------------------------------------------------------------------------------------
//	Project:-	DE8681
//  	Filename:-	DATAXFER.C
//	Description:-	Data Transfer routines
//	Programmer:-	D.T.F	
//	Version:-	2.0
//	Created:-	28th February 2002
//	Last modified:- 
//---------------------------------------------------------------------------------------------------
//	(C) Consumer Microcircuits Ltd 2002
//
//	This firmware was designed by:-
//			Consumer Microcircuits Ltd,
//			Langford, Maldon,
//			ESSEX
//			CM9 6WG.
//	in the UK for use with CML evaluation kits only and is based on UK originated technology.
//	Please contact
//			sales@cmlmicro.co.uk
//			+44 (0)1621 875500
//	for licensing details.
//---------------------------------------------------------------------------------------------------

#define DATAXFER_C

#include	"ef8681.h"

void dataxfer(void)
{
	DATABUFLDPTR = 0x00;				// Initialise Data Buffer Load pointer
	DATABUFRDPTR = 0x00;				// Initialise Data Buffer Read pointer

	ESCTMR = S12;					// Start the Escape Timer

	ESCTMREXP = 0;					// Clear Escape Timer Expired Flag
	ESC1CHAR = 0;					// Clear 1st Escape Character Match Flag
	ESC2CHAR = 0;					// Clear 2nd Escape Character Match Flag

	CMXGENCTRL &= 0xFF80;				// Clear any previous irq settings
	CMXGENCTRL ^= 0x0049;				// Enable IRQN output, Tx Rdy and Rx Rdy irq's
	wr16_cbus(CMXGENCTRL_ADDR,CMXGENCTRL);		// Update CBUS register

	POLLTMR = 20;					// Start 20ms timer used for Rx Energy polling

	do
	{
		if (MSGBUFLDPTR != MSGBUFRDPTR) TXIE=1;			// Ensure Tx SCI Interrupt is enabled

		if (DATABUFRDPTR != DATABUFLDPTR)
		{
			if (TX_WAITING)
			{
				RCIE = 0;				// Disable Rx USART interrupt to prevent adjustment to Data Buffer

				CMXTXDATA = DATABUF[DATABUFRDPTR++];	// Update shadow register

				wr_cbus(CMXTXDATA_ADDR,CMXTXDATA);	// Tx contents of current Data buffer location
				
							
				DATABUFRDPTR &= databufwrap;		// Wrap round buffer if necessary

				RCIE = 1;				// Re-enable Rx USART interrupt

				TX_WAITING = 0;
			}
		}
		else
		{
			CTSN = 0;					// Ensure CTSN is low to allow further characters
		}

		if (!PICIRQN || (POLLTMR == 0))				// If irq occurs or Rx energy polling timer expires
		{
			GIE = 0;
		
			CMXSTAT = rd16_cbus(CMXSTAT_ADDR);	  	// Update Status shadow register and clear irq

			if (RXRDY)
			{
				MSGBUF[MSGBUFLDPTR++] = rd_cbus(CMXRXDATA_ADDR);	// Load Message Buffer with Rx Data Reg contents

				MSGBUFLDPTR &= msgbufwrap;		// Wrap round buffer if necessary
			
			}

			if (TXRDY || TXUF)
			{
				TX_WAITING = 1;				// Set the Tx waiting flag to indicate CMX868 is waiting to tx
			}	

			if (hangup() != 0)				// If Carrier detect is clear for longer than S10
			{
				reset_cbus();				// Reset CMX868 into powersave, will cause board to go on-hook
				DCDIND = 0;				// Turn off CD LED
				DCDN = 1;				// Set DCDN line
				DATAXFER = 0;				// Abort data transfer 
				ATCMDMODE = 1;				// Revert back to AT Command Mode
			}

			POLLTMR = 20;					// Reload 20ms timer used for Rx Energy polling
		}

		GIE = 1;

	} while (!ATCMDMODE);						// Continue to loop until AT command mode is required  

	CMXGENCTRL &= 0xFF80;						// Ensure IRQN enable, Tx and Rx Rdy irqs are cleared
	wr16_cbus(CMXGENCTRL_ADDR, CMXGENCTRL);				// Update CBUS register
}

unsigned char hangup()
{
	if (RXENERGYDET && RLYDRV_ON)
	{
		CDLOST = 0;						// Clear Carrier Detect lost flag
		return(FALSE);
	}

	if (CDLOST)
	{
		if (CDLOSTTMR == 0) return (TRUE);			// If Lost Carrier Detect timer has expired return true.
	}
	else
	{
		CDLOST = 1;						// Set the Carrier Detect Lost Flag

		CDLOSTTMR = S10;					// Load Lost Carrier timer (100ms increments)
	}
	return (FALSE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -