📄 fm24c04a_drv.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 + -