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

📄 atcmd.c

📁 CML CMX868 modem
💻 C
📖 第 1 页 / 共 2 页
字号:
unsigned char atvcmd(void)					// Modify Word Response bit located in S14 reg
{
	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case '0':
			WORDRES = OFF;				// Enable number responses
			break;
		case '1':
			WORDRES = ON;				// Enable Word responses
			break;
		default:
			return (ERROR);				// Return ERROR to indicate invalid character
	}
	return (OK);						// Return OK to indicate success
}

unsigned char atxcmd(void)					// Modify Call Characteristic bits located in S22 reg
{
	unsigned char tempreg;

	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case '0':
			tempreg = X0CALLING;
			break;
		case '1':
			tempreg = X1CALLING;
			break;
		case '2':
			tempreg = X2CALLING;
			break;
		case '3':
			tempreg = X3CALLING;
			break;
		case '4':
			tempreg = X4CALLING;
			break;
		default:
			return (ERROR);				// Return ERROR to indicate invalid character
	}
	S22 &= 0b00011111;					// Clear existing calling characteristics 

	S22 ^= tempreg;						// Modify S22 to reflect new settings

	return (OK);						// Return OK to indicate success
}

unsigned char atzcmd(void)					// Reset Modem and recall factory profile
{
	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case '0':
			init_sregs(0);				// Recall factory profile 0.
			break;
		case '1':
			init_sregs(1);				// Recall factory profile 1.
			break;
		default:
			return (ERROR);				// Return ERROR to indicate invalid character
	}
	reset_cbus();						// Perform CMX868 General reset and clear device write shadow registers
	return (OK);						// Return OK to indicate success
}

unsigned char xatcmd(void)
{
	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case 'F': case 'f':
			return (xatfcmd());
		case 'G': case 'g':
			return (xatgcmd());
		default:
			return (ERROR);
	}
}

unsigned char xatfcmd(void)					// Recall factory profile
{
	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case '0':
			init_sregs(0);				// Recall factory profile 0.
			break;
		case '1':
			init_sregs(1);				// Recall factory profile 1.
			break;
		default:
			return (ERROR);				// Return ERROR to indicate invalid character
	}
	return (OK);						// Return OK to indicate success
}

unsigned char xatgcmd(void)					// Modify Guard Tone bits located in S23 reg
{
	unsigned char tempreg;

	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case '0':
			tempreg = NOGUARD;
			break;
		case '1':
			tempreg = GUARD550;
			break;
		case '2':
			tempreg = GUARD1800;
			break;
		default:
			return (ERROR);				// Return ERROR to indicate invalid character
	}
	S23 &= 0b00111111;					// Clear existing Guard tone settings 

	S23 ^= tempreg;						// Modify S23 to reflect new settings

	return (OK);						// Return OK to indicate success
}

unsigned char cmlatcmd(void)
{

	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case 'F': case 'f':				// CML Test Functions
			return (cmlatfcmd());
		case 'R': case 'r':
			return (cmlatrcmd());
		default:
			return (ERROR);
	}
}

unsigned char cmlatfcmd(void)					// CML Test Functions
{
	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case '0':
			PORTA = 0b00010000;			// Turn off DCDIND LED
			PORTB |= 0b00000110;			// Ensure RIN and DCDN o/p's are set
			hook(0);				// On-Hook (Hook LED off)
			LED_OVERRIDE = 0;
			break;
		case '1':
			PORTA = 0b00001111;			// Turn on DCDIND, RXDIND, TXDIND, DTRIND and HOOK LEDs
			PORTB &= 0b11111001;			// Clear RIN and DCDN o/p's
			hook(1);				// Off-Hook (Hook LED on)
			LED_OVERRIDE = 1;
			break;
		case '2':
			DelayMs(100);				// Wait 100ms
			break;
		case '3':
			Delay1s(1);				// Wait 1s
			break;
		case '4':
			T0IE = 0;				// Initially disable Timer interrupt
			BERTEND = 0;				// BERT Rx End
			BERTFLAG = 1;				// Set BERT Flag
			break;
		case '5':
			T0IE = 0;				// Initially disable Timer interrupt
			BERTEND = 1;				// BERT Tx End
			BERTFLAG = 1;				// Set BERT Flag
			break;
		case '6':
			TESTFUNC1 = 1;				// Set Test Function One flag
			break;
		case '7':
			GPT6 = 30;				// Load GPT6 for 30 second

			while (PICIRQN != 0)
			{
				if (GPT6 == 0)
				{
					return (ERROR);		// Return ERROR to indicate invalid character
				}
			}
			CMXSTAT = rd16_cbus(CMXSTAT_ADDR);	// Update CMX868 Status Shadow register

			if (HEXOP)
			{
				hexnum2scrn(CMXSTAT,4,WORDRES);	// Send LF char if word results enabled
			}
			else
			{
				decnum2scrn(CMXSTAT,5,WORDRES);	// Send LF char if word results enabled
			}
			break;
		case '8':
			return (NYI);				// Return NYI to indicate function not implemented yet
		case '9':
			return (NYI);				// Return NYI to indicate function not implemented yet
		default:
			return (ERROR);				// Return ERROR to indicate invalid character
	}
	return (OK);						// Return OK to indicate success
}

unsigned char cmlatrcmd(void)
{
	unsigned int j;

	unsigned long i;

	volatile unsigned char bank3 * byteregptr;

	volatile unsigned int bank3 * wordregptr;

	unsigned char cbus_addr, reg16bit, writereg;

	ATBUFPTR++;						// Increment AT Command Buffer pointer.

	switch(ATBUF[ATBUFPTR])
	{
		case 'E': case 'e':

			ATBUFPTR++;				// Increment AT Command Buffer pointer.

			reg16bit = 1;				// Assume 16 bit word unless modified
			writereg = 1;				// Assume write register unless modified

			switch(ATBUF[ATBUFPTR])
			{
				case '0':
					cbus_addr = CMXGENCTRL_ADDR;
					wordregptr = &CMXGENCTRL;
					break;
				case '1':
					cbus_addr = CMXTXMODE_ADDR;
					wordregptr = &CMXTXMODE;
					break;
				case '2':
					cbus_addr = CMXRXMODE_ADDR;
					wordregptr = &CMXRXMODE;
					break;
				case '3':
					reg16bit = 0;
					cbus_addr = CMXTXDATA_ADDR;
					byteregptr = &CMXTXDATA;
					break;
				case '4':
					reg16bit = 0;
					cbus_addr = CMXTXDATAV14_ADDR;
					byteregptr = &CMXTXDATAV14;
					break;
				case '5':
					writereg = 0;
					reg16bit = 0;
					cbus_addr = CMXRXDATA_ADDR;
					byteregptr = &CMXRXDATA;
					break;
				case '6':
					writereg = 0;
					cbus_addr = CMXSTAT_ADDR;
					wordregptr = &CMXSTAT;
					break;
				case '8':
					cbus_addr = CMXPROG_ADDR;
					wordregptr = &CMXPROG;
					break;
				case '9':
					cbus_addr = CMXTESTADDR_ADDR;
					wordregptr = &CMXTESTADDR;
					break;
				case 'A': case 'a':
					cbus_addr = CMXTESTWR_ADDR;
					wordregptr = &CMXTESTWR;
					break;
				case 'B': case 'b':
					writereg = 0;
					cbus_addr = CMXTESTRD_ADDR;
					wordregptr = &CMXTESTRD;
					break;
				default:
					return (ERROR);
			}					

			ATBUFPTR++;				// Increment AT Command Buffer pointer.

			if ((ATBUF[ATBUFPTR] == '=') && writereg)
			{
				ATBUFPTR++;			// Increment AT Command Buffer pointer.

				i = ascregtolong();
				if ((i > 65535) || (!reg16bit && (i > 255)))	// If 8-bit register and value exceeds 255 return error.
				{
					return (ERROR);
				}

				if (reg16bit)
				{
					*wordregptr = i & 0xFFFF;
					wr16_cbus(cbus_addr,*wordregptr);
				}
				else
				{
					*byteregptr = i & 0xFF;					
					wr_cbus(cbus_addr,*byteregptr);
				}
				break;
			}
			else if ((ATBUF[ATBUFPTR] == '?'))
			{
				if (reg16bit)
				{
					if (!writereg)		// Read CBUS if 16 bit read register 
					{
						*wordregptr = rd16_cbus(cbus_addr);	// Place CBUS reply data into shadow register
					}
					j = *wordregptr & 0xFFFF;			// Copy 16 bit shadow register
				}
				else
				{
					if (!writereg)		// Read CBUS if 8 bit read register 
					{
						*byteregptr = rd_cbus(cbus_addr);	// Place CBUS reply data into shadow register
					}
					j = *byteregptr & 0xFF;	// Copy 8 bit shadow register
				}

				if (HEXOP)
				{
					hexnum2scrn(j,4,WORDRES);			// Send LF char if word results enabled
				}
				else
				{
					decnum2scrn(j,5,WORDRES);			// Send LF char if word results enabled
				}
				break;
			}
			else
			{
				return (ERROR);
			}
		case 'R': case 'r':
			reset_cbus();				// Perform CMX868 General Reset and clear device write shadow registers
			break;
		default:
			return (ERROR);
	}
	return (OK);						// Return OK to indicate success
}

unsigned long ascregtolong(void)
{
	unsigned char tempbuf[6];

	unsigned long tempnum=0;

	unsigned long j=1;

	signed char i,k;

	i=0;

	// Loop while characters are decimal digits  
	// and are no more than 5 digits long i.e. 65535

	while ((ATBUF[ATBUFPTR] <= '9') && (ATBUF[ATBUFPTR] >= '0') && (i < 6))
	{
		tempbuf[i++] = ATBUF[ATBUFPTR++];
	}

	ATBUFPTR--;

	i--;

	for (k=i;k>=0;k--)
	{
		tempnum += (tempbuf[k] - 0x30) * j;
		j *= 10;
	}

	return (tempnum);
}

⌨️ 快捷键说明

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