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

📄 softuart300.c

📁 SIM卡双卡通C源码,支持C8051F304芯片Keil环境
💻 C
字号:
//------------------------------------------------------------------------------------
// FILE NAME		: SoftUart300.c
// TARGET DEVICE	: C8051F30X
// Modify ON		: 03/30/05
// Modify BY		: Maqingbo
//
//本程序用于半双工串口通信(P00用于接收发送,P01接收时钟)


#include "dsim.h"
#include "SoftUart300.h"

//#define	SBAUDRATE0			9600					//用户定义的SW_UART 波特率
//#define	SUART0_TIMER		SYSCLK/SBAUDRATE0/4		//对应一个位时间的PCA 计数值(PCA 配置为对SYSCLK/4 计数)
//#define	SUART0_STARTTIME	SUART0_TIMER*3/2		// 3/2 位时间用于接收到一个起始位后在起始位边沿之后RX 
														//应在一个位时间内保持低电平第一个位采样在下一个位时间的中间开始

//------------------------------------------------------------------------------------------
// - 配置PCA:  模块0 设置为软件定时方式
//   PCA 时基 = 由ECI提供
//

extern unsigned char GetChar;
extern bit FlagVFrist;
void 	WaitCCF0(void)
{
	while (CCF0 == 0)
	{
		if (RST == 0) 	
			RSTSRC |= 0x10;	//软件强制复位
	}
	CCF0 = 0;
}

void	PCA_INIT0(void)
{
	PCA0CN = 0;				// Leave PCA disabled
	XBR0 |= 0x01;			// P00 SKIP
    XBR2 |= 0x01;			// P01 ECI
	PCA0MD = 0x06;			// PCA时钟由ECI提供
	CR = 0;					// Stop PCA counter.
	PCA0CPM0 = 0x48;		// Change module 0 to software timer mode.
}
unsigned int  PCA_TEMP0;			// Temporary storage variable for manipulating PCA module high & low bytes.	  
//注意读PCA0时必须先读低位
void DelayCLKCount(unsigned int count)
{
 	PCA_TEMP0 = PCA0L;					// Read PCA counter value into
	PCA_TEMP0 |= (PCA0H << 8);
	PCA_TEMP0 +=count;
	PCA0CPL0 = PCA_TEMP0;				// Restore PCA0CPL0 and PCA0CPH0
	PCA0CPH0 = (PCA_TEMP0 >> 8);		// with the updated value
	CCF0 = 0;
	CR = 1;								// Start PCA counter.
	WaitCCF0();
	CR = 0;
}

void SetPCAToPCA0CPH(void)
{
	PCA_TEMP0 = PCA0L;					// Read PCA counter value into
	PCA_TEMP0 |= (PCA0H << 8);
	PCA_TEMP0 += SUART0_TIMER;			// Add 1 bit times to PCA_TEMP
	PCA0CPL0 = PCA_TEMP0;				// Restore PCA0CPL0 and PCA0CPH0
	PCA0CPH0 = (PCA_TEMP0 >> 8);		// with the updated value
}
void SetPCA0CPHToPCA0CPH(void)
{
	PCA_TEMP0 = (PCA0CPH0 << 8);		// Read module 0 contents into
	PCA_TEMP0 |= PCA0CPL0;				// PCA_TEMP.
	PCA_TEMP0 += SUART0_TIMER;				// Add 1 bit time to PCA_TEMP
	PCA0CPL0 = PCA_TEMP0;					// Restore PCA0CPL0 and PCA0CPH0
	PCA0CPH0 = (PCA_TEMP0 >> 8);			// with the updated value
	WaitCCF0();
}

unsigned char GetSCommChar0(unsigned char src,unsigned char tag)	//读取一字节数据,  有数据返回
					//Src = ME:从ME读数据   = SIM1:从SimCard 1读数据    = SIM2:从SimCard 2读数据
					//tag = 0 :不转发  =ME 转发至ME	 = SIM1:转发至SimCard1  = SIM2:转发至SimCard2
{ 
	unsigned char i;

	unsigned char RXSHIFT0 = 0;
	bit VerBit0;
	P0MDOUT &= ~src;					// Open-Drain
	while ((P0 & src) != 0) 			// 等待起始位
	{
		if (RST == 0) 	RSTSRC |= 0x10;	//软件强制复位
	}
	DelayCLKCount(80);

	SetPCAToPCA0CPH();
	CR = 1;								// Start PCA counter.
	if (tag) 
	{
		P0MDOUT |= tag;
		P0  &= ~tag;
	}
	WaitCCF0();
	for (i = 0; i<8 ;i++)
	{
				RXSHIFT0 = RXSHIFT0 >> 1;				// Shift right 1 bit
				if ((P0 & src) != 0)				// If SW_RX=1, 
				{
					RXSHIFT0 |= 0x80;					// shift '1' into RXSHIFT msb
					if (tag) 	P0  |= tag;
				}
				else
				{
					if (tag) 	P0  &= ~tag;
				}
				SetPCA0CPHToPCA0CPH();
	}
			// State 9: 8-bits received, Capture Verify  bit.
	VerBit0 = 0;
	if ((P0 & src) != 0)
	{
		VerBit0 = 1;
		if (tag) 	P0  |= tag;
	}
	else
	{
		if (tag) 	P0  &= ~tag;
	}
	SetPCA0CPHToPCA0CPH();
			// State 10: 8-bits,Verify bit received, Capture STOP bit.
	if (tag) 	P0  |= tag;
	SetPCA0CPHToPCA0CPH();
	CR = 0;									// Stop PCA Counter
	return RXSHIFT0;
}

void SendSCommChar0(unsigned char ch,unsigned char No)			//发送一字节
												//No = 0:向ME写数据
												//   = 1:向SimCard 1写数据
												//   = 2:向SimCard 2写数据
{
	bit VerBit0;
	unsigned char i;
	P0MDOUT |= No;						// Push-Pull
	P0  |=  No;
	ACC = ch;
	if (_testbit_(P))
		VerBit0 = 1;
	else
		VerBit0 = 0;
	DelayCLKCount(380);
	SetPCAToPCA0CPH();
	CCF0 = 0;
	P0  &= ~No;							// 发送起始位
	CR = 1;										// Start PCA counter.

	WaitCCF0();
	for (i = 0; i<8 ;i++)
	{
		if (ch & 0x01)
			P0  |=  No;				// Output LSB of TDR onto SW_TX pin.
		else
			P0  &= ~No;			
		ch >>= 1;							// Shift TDR right 1 bit.
		SetPCA0CPHToPCA0CPH();
	}
	if (VerBit0)
		P0  |=  No;					// Output LSB of TDR onto SW_TX pin.
	else
		P0  &= ~No;			
	SetPCA0CPHToPCA0CPH();
	P0  |=  No;
	SetPCA0CPHToPCA0CPH();
	CR = 0;									// Stop PCA Counter	

}

extern unsigned char DataBuffer[];
void SendSCommStr0(unsigned char *str,unsigned char len,unsigned char No)
{
	unsigned char i;
	for ( i=0; i<len ;i++)
	{
		SendSCommChar0(str[i],No);
	}

}

unsigned char Reverse(unsigned char ch)
{
unsigned char i,j;
	i = 0x1; j = 0;
	while (i != 0x80)
	{
		if ((ch & i)==0)
		{
			j++;
		}
		j = j*2;
		i = i*2;
	}
	if ((ch & i) == 0)
	{
		j++;
	}
	return j;
}

void SendSCommChar0V(unsigned char ch,unsigned char No)			//发送一字节
												//No = 0:向ME写数据
												//   = 1:向SimCard 1写数据
												//   = 2:向SimCard 2写数据
{
	bit VerBit0;
	unsigned char i;
	P0MDOUT |= No;						// Push-Pull
	P0  |=  No;
	ACC = ch;
	if (_testbit_(P))
		VerBit0 = 1;
	else
		VerBit0 = 0;
	if (No != ME)
		VerBit0 = !VerBit0;
	DelayCLKCount(380);
	SetPCAToPCA0CPH();
	CCF0 = 0;
	P0  &= ~No;							// 发送起始位
	CR = 1;										// Start PCA counter.
	WaitCCF0();

	for (i = 0; i<8 ;i++)
	{
		if (ch & 0x80)
			P0  &= ~No;				// Output LSB of TDR onto SW_TX pin.
		else
			P0  |= No;			
		ch <<= 1;							// Shift TDR right 1 bit.
		SetPCA0CPHToPCA0CPH();
	}

	if (VerBit0)
		P0  |=  No;					// Output LSB of TDR onto SW_TX pin.
	else
		P0  &= ~No;			
	SetPCA0CPHToPCA0CPH();

	P0  |=  No;
	SetPCA0CPHToPCA0CPH();

	CR = 0;									// Stop PCA Counter	

}

void SendSCommStr0V(unsigned char *str,unsigned char len,unsigned char No)
{
	unsigned char i;
	for ( i=0; i<len ;i++)
	{
		SendSCommChar0V(str[i],No);
	}
}



unsigned char GetSCommChar0_Test(unsigned char src,unsigned char tag)
{ 

	unsigned char i;
	unsigned char RXSHIFT0 = 0;
	bit VerBit0;
	P0MDOUT &= ~src;
	while ((P0 & src) != 0) 			// 等待起始位
	{
		DelayCLKCount(1);
		if (Test_Count) Test_Count --;
		else return 0xff;
	}
	DelayCLKCount(80);

	SetPCAToPCA0CPH();
	CR = 1;								// Start PCA counter.
	if (tag) 
	{
		P0MDOUT |= tag;
		P0  &= ~tag;
	}
	WaitCCF0();
	for (i = 0; i<8 ;i++)
	{
				RXSHIFT0 = RXSHIFT0 >> 1;				// Shift right 1 bit
				if ((P0 & src) != 0)				// If SW_RX=1, 
				{
					RXSHIFT0 |= 0x80;					// shift '1' into RXSHIFT msb
					if (tag) 	P0  |= tag;
				}
				else
				{
					if (tag) 	P0  &= ~tag;
				}
				SetPCA0CPHToPCA0CPH();
	}
			// State 9: 8-bits received, Capture Verify  bit.
	VerBit0 = 0;
	if ((P0 & src) != 0)
	{
		VerBit0 = 1;
		if (tag) 	P0  |= tag;
	}
	else
	{
		if (tag) 	P0  &= ~tag;
	}
	SetPCA0CPHToPCA0CPH();
			// State 10: 8-bits,Verify bit received, Capture STOP bit.
	if (tag) 	P0  |= tag;
	SetPCA0CPHToPCA0CPH();
	CR = 0;									// Stop PCA Counter
	return RXSHIFT0;
}



 
unsigned char GetSCommChar0V(unsigned char src,unsigned char tag)	//读取一字节数据,  数据返回
					//Src = ME:从ME读数据   = SIM1:从SimCard 1读数据    = SIM2:从SimCard 2读数据
					//tag = 0 :不转发  =ME 转发至ME	 = SIM1:转发至SimCard1  = SIM2:转发至SimCard2
{ 
	unsigned char i;
	unsigned char tag1;
	unsigned char RXSHIFT0 = 0;
	bit VerBit0;
	ACC = GetChar;

	if (_testbit_(P))
		VerBit0 = 1;
	else
		VerBit0 = 0;

	if (tag != ME)
		VerBit0 = !VerBit0;

	if (FlagVFrist) tag1 = 0;
	else tag1 = tag;

	P0MDOUT &= ~src;					// Open-Drain
	while ((P0 & src) != 0) 			// 等待起始位
	{
		if (RST == 0) 	RSTSRC |= 0x10;	//软件强制复位
	}

	DelayCLKCount(80);

	SetPCAToPCA0CPH();
	CR = 1;								// Start PCA counter.
	if (tag1)
	{
		P0MDOUT |= tag1;
		P0  &= ~tag1;
	}
	WaitCCF0();
	for (i = 0; i<8 ;i++)
	{
				RXSHIFT0 = RXSHIFT0 >> 1;				// Shift right 1 bit
				if ((P0 & src) != 0)				// If SW_RX=1, 
					RXSHIFT0 |= 0x80;					// shift '1' into RXSHIFT msb

				if (tag1)
				{
					if (GetChar & 0x80)
						P0  &= ~tag1;				// Output LSB of TDR onto SW_TX pin.
					else
						P0  |= tag1;		
				}
				GetChar <<= 1;							// Shift TDR right 1 bit.
				SetPCA0CPHToPCA0CPH();
	}
			// State 9: 8-bits received, Capture Verify  bit.

	if (tag1)
	{
		if (VerBit0)
			P0  |= tag1;
		else
			P0  &= ~tag1;			
	}

	SetPCA0CPHToPCA0CPH();
			// State 10: 8-bits,Verify bit received, Capture STOP bit.
	if (tag1) 	P0  |= tag1;
	SetPCA0CPHToPCA0CPH();
	CR = 0;									// Stop PCA Counter
	return RXSHIFT0;
}

⌨️ 快捷键说明

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