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

📄 fm24c04a_drv.bak

📁 TC35i收发短信的源代码
💻 BAK
字号:

#include "ext_var.h"
#include "FM24C04A_drv.h"


/*function define*/
void StartBit( void );
void StopBit( void );
uchar SendAByte(uchar I_data);
uchar ReceiveAByte(void);


uchar FMWriteBytes(uchar *buff,uchar page,uchar inpage,uint bytes);
uchar FMReadBytes(uchar *buff,uchar page,uchar inpage,uint bytes);

/**********************************************************************
* Func Name  : StartBit
* Descript   : start bit
* Parameters : None
* Returns    : None
* Author     : Nakata
* Create Date: 2008/01/30
* Modify Date: 2008/01/30
* *********************************************************************/
void StartBit( void )
{
	P4.0=1; //SCL=1;
	P4.1=1; //SDA=1;
	NOP();
	P4.1=0; //SDA=0;
}

/**********************************************************************
* Func Name  : StopBit
* Descript   : stop bit
* Parameters : None
* Returns    : None
* Author     : Nakata
* Create Date: 2008/01/30
* Modify Date: 2008/01/30
* *********************************************************************/
void StopBit( void )
{
	P4.1=0; //SDA=0;
	NOP();
	P4.0=1; //SCL=1;
	NOP();
	P4.1=1; //SDA=1;
}

/**********************************************************************
* Func Name  : SendAByte
* Descript   : transfer one byte
* Parameters : i_data: data will be send.
* Returns    : None
* Author     : Nakata
* Create Date: 2008/01/30
* Modify Date: 2008/01/30
* *********************************************************************/
uchar SendAByte(uchar I_data)
{
    uchar i,count;
    uchar b;

	//send 8bit data
	for (i=0;i<8;i++)
    {
		P4.0=0; //SCL=0;
		b=(I_data&0x80);
		b>>=7;
		P4.1=b; //SDA=( bit )(I_data&0x80);
		NOP();
		P4.0=1; //SCL=1;
		NOP();
		NOP();
		I_data<<=1;
	}
	P4.0=0; //SCL=0;
	NOP();
	NOP();
	P4.0=1; //SCL=1;

	PM4.1=PM_IN; /*SDA In*/
	NOP();

	
	count=0; /*start to count*/
	
	/*waiting for SDA=1*/
	while(P4.1) //while(SDA==1)
	{
		WDTE = 0xAC; /*clear and start watchdog timer */ 
		
		/*count end*/
		if(count==255) return FALSE;
		
		/*continue counting*/
		count++;
		
	}

	P4.0=0; //SCL=0;

	PM4.1=PM_OUT; /*SDA out*/
	NOP();

	return TRUE; /*OK*/
}


/**********************************************************************
* Func Name  : ReceiveAByte
* Descript   : receive one byte
* Parameters : None
* Returns    : data received
* Author     : Nakata
* Create Date: 2008/01/30
* Modify Date: 2008/01/30
* *********************************************************************/
uchar ReceiveAByte(void)
{
	uchar i;
	uchar ddata;

	PM4.1=PM_IN; /*SDA In*/
	NOP();

	i=8;
	ddata=0;
	while (i--)
	{
		ddata<<=1;
		P4.0=0; //SCL=0;
		NOP();
		NOP();
		P4.0=1; //SCL=1;
		NOP();
		NOP();

		ddata|=P4.1; //SDA
	}
	P4.0=0; //SCL=0;

	PM4.1=PM_OUT; /*SDA OUT*/
	NOP();

	return ddata;
}

/**********************************************************************
* Func Name  : FMWrite
* Descript   : write data to fm. Max write 256bytes per time.
* Parameters : buff: data buffer adress.
			   addr: first address to access.
			   wlen: lenght of data.

* Returns    : TRUE: ok
			   FALSE: fail
* Author     : Nakata
* Create Date: 2008/01/30
* Modify Date: 2008/01/30
* *********************************************************************/
uchar FMWrite(uchar *buff,uint addr,uint wlen)
{
	uchar i;
	uchar n;
	uchar Page;		//page
	uchar InPage;	//inpage
	uint  tmpint;
	uint  len[2];

	//exccee 256bytes
	if(wlen>BYTES256) return FALSE;

	//get the page and inpage
	Page  =(uchar)(addr/BYTES256);
	InPage=(uchar)(addr%BYTES256);

	//need to alter page
	if(InPage+wlen>BYTES256)
	{
		len[0]=BYTES256-InPage;
		len[1]=(InPage+wlen)-BYTES256;
		n=2;
	}
	else
	{
		len[0]=wlen;
		len[1]=0;
		n=1;
	}

	for(i=0;i<n;i++)
	{
		if(!FMWriteBytes(buff+len[0]*i,Page+i,InPage,len[i])) return FALSE;
		NOP();
		InPage=0;
	}

	return TRUE;

}

/**********************************************************************
* Func Name  : FMRead
* Descript   : Read data to fm. Max read 256bytes per time.
* Parameters : buff: data buffer adress.
			   addr: first address to access.
			   rlen: lenght of data.

* Returns    : TRUE: ok
			   FALSE: fail
* Author     : Nakata
* Create Date: 2008/01/30
* Modify Date: 2008/01/30
* *********************************************************************/
uchar FMRead(uchar *buff,uint addr,uint rlen)
{
	uchar i;
	uchar n;
	uchar Page;		//page address
	uchar InPage;	//inpage address
	uint  len[2];

	//excceed 256
	if(rlen>BYTES256) return FALSE;

	//get page and inpage
	Page  =(uchar)(addr/BYTES256);
	InPage=(uchar)(addr%BYTES256);

	//need to change page
	if(InPage+rlen>BYTES256)
	{
		len[0]=BYTES256-InPage;
		len[1]=(InPage+rlen)-BYTES256;
		n=2;
	}
	else
	{
		len[0]=rlen;
		len[1]=0;
		n=1;
	}

	for(i=0;i<n;i++)
	{
		if(!FMReadBytes(buff+len[0]*i,Page+i,InPage,len[i])) return FALSE;
		NOP();
		InPage=0;
	}

	return TRUE;  //ok
}

/**********************************************************************
* Func Name  : FMWriteBytes
* Descript   : Write data to the appointed address.
* Parameters : buff: data buffer adress.
			   page: page to access.
			   inpage: address in page.
			   bytes: lenght of data.

* Returns    : TRUE: ok
			   FALSE: fail
* Author     : Nakata
* Create Date: 2008/01/30
* Modify Date: 2008/01/30
* *********************************************************************/
uchar FMWriteBytes(uchar *buff,uchar page,uchar inpage,uint bytes)
{
	uchar p;
	uint  i;

	if(page>FM_PAGE1) return FALSE;

	p=page*2+0xa0;

	PM4.0=PM_OUT; /*SCL out*/
	PM4.1=PM_OUT; /*SDA in */

	NOP();

	StartBit();	//start bit

	if(!SendAByte(p)) return FALSE;	//write page
	
	if(!SendAByte(inpage)) return FALSE;	//write inpage

	//write data
	for(i=0;i<bytes;i++)
	{
		if(!SendAByte(buff[i])) return FALSE;
	}

	StopBit();	//stop bit

	return TRUE;

}

/**********************************************************************
* Func Name  : FMReadBytes
* Descript   : Read data to the appointed address.
* Parameters : buff: data buffer adress.
			   page: page to access.
			   inpage: address in page.
			   bytes: lenght of data.

* Returns    : TRUE: ok
			   FALSE: fail
* Author     : Nakata
* Create Date: 2008/01/30
* Modify Date: 2008/01/30
* *********************************************************************/
uchar FMReadBytes(uchar *buff, uchar page,uchar inpage, uint bytes)
{
	uchar p;
	uint  i;

	PM4.1=PM_OUT; /*SDA out*/
	PM4.0=PM_OUT; /*SCL out*/
	NOP();

	if(page>FM_PAGE1) return FALSE;

	p=page*2+0xa0;

	StartBit();	//start bit

	if(!SendAByte(p)) return FALSE;	//write page

	if(!SendAByte(inpage)) return FALSE;	//write inpage

	StartBit();	//start bit

	if(!SendAByte(p+1)) return FALSE;	//point to page

	//read data
	for(i=0;i<bytes;i++)
	{
		buff[i]=ReceiveAByte();

		if(i==(bytes-1)) P4.1=1; //send acknowledge flag
		else P4.1=0;	//send no acknowledge flag

		NOP();
		NOP();
		P4.0=1;
		NOP();
		NOP();
		P4.0=0;
		P4.1=1;
	}

	//stop bit
	StopBit();

	return TRUE;
}

⌨️ 快捷键说明

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