最近调试93C86 ,可以正确的读写, 但联想到别的EEPROM支持页写功能,可以通过软件手段对93c86达成页写功能吗?
刚刚开始写代码,请各位多提宝贵意见
void _WaitTime1us(void)
{
// +14cycle
DelayNop(); // +1cycle
DelayNop(); // +1cycle = 16cycle
}
//发送操作码
void Send(UBYTE Command, UBYTE opCode)
{
UBYTE i ,data ;
for(i=0;i<opCode;i++)
{
data=Command&(0x80>>i);
if(data)
SET_DI;
else
CLR_DI;
SET_SK;
CLR_SK;
}
}
/*以8bit形式发送操作码
void Send(UBYTE Command)
{
UBYTE i ,data ;
for(i=0;i<8;i++)
{
data=Command&(0x80>>i);
if(data)
SET_DI;
else
CLR_DI;
SET_SK;
CLR_SK;
}
}
*/
//发送16bit数据
void SendData(UWORD Data)
{
UBYTE i ;
UWORD data ;
for(i=0;i<16;i++)
{
data=Data&(0x8000>>i);
if(data)
SET_DI;
else
CLR_DI;
SET_SK;
CLR_SK;
}
}
//发送地址
void SendAddr(UWORD Addr ,UBYTE mode)
{
UBYTE i, AddrLength =0;
UWORD data ;
if (mode)
AddrLength = 10 ;
else
AddrLength = 9 ;
for(i=0 ;i<=AddrLength;i++)
{
data=Addr&(0x0200>>i) ;
if(data)
SET_DI ;
else
CLR_DI;
SET_SK;
CLR_SK;
}
}
//写允许
void Send_EWenable(void)
{
SET_CS ;
Send(ep_ewenable,ep_ewen_op) ;
// Send(ep_ewenable);
Send(0x00, ep_null_op);
CLR_CS ;
}
//写禁止
void Send_EWdisable(void)
{
SET_CS ;
Send(ep_ewdisable,ep_ewds_op );
Send(0x00, ep_null_op);
CLR_CS ;
}
//全写
void WriteAll(UWORD Data)
{
Send_EWenable();
SET_CS ;
Send( ep_write_all,ep_write_all_op);
Send(0x00, ep_null_op);
SendData(Data);
CLR_CS ;
DelayNop();
DelayNop();
CLR_DI ;
DelayNop();
DelayNop();
SET_CS ;
while(!TST_DO){};
CLR_CS ;
}
//全擦
void EraseAll(void)
{
SET_CS ;
Send(ep_erase_all,ep_erase_all_op);
Send(0x00, ep_null_op);
CLR_CS ;
CLR_DI ;
DelayNop();
DelayNop();
SET_CS ;
while(!TST_DO){};
CLR_CS ;
}
//读取指定地址的数据
UWORD ReadEEP_WORD(UWORD Addr )
{
UWORD EEP_WORD ,i ;
SET_CS ;
// Send(ep_read ,3) ;
Send(ep_read,ep_read_op) ;
SendAddr(Addr , mode16bit ) ;
CLR_DI ;
EEP_WORD =0;
for(i=0;i<16;i++)
{
SET_SK;
CLR_SK;
if(TST_DO)
EEP_WORD|=0x8000>>i ;
}
CLR_CS ;
return(EEP_WORD);
}
/* 连续读数据
void ReadEEP_SEQ_WORD(UWORD *ptr,UWORD Length, UWORD Addr)
{
while(Length>0)
{
*ptr= ReadEEP_WORD( Addr );
Length-- ;
Addr++ ;
ptr++;
}
}
*/
void ReadEEP_SEQ_WORD(UWORD *ptr,UWORD Length, UWORD Addr)
{
UWORD i ;
SET_CS ;
Send(ep_read,ep_read_op) ;
SendAddr(Addr , mode16bit ) ;
CLR_DI ;
while(Length>0)
{
for(i=0;i<16;i++)
{
SET_SK;
CLR_SK;
if(TST_DO)
*ptr|=0x8000>>i ;
}
Length-- ;
ptr++;
}
CLR_CS ;
}
//连续写多个数据
void Write_SEQ_WORD( UWORD Length, UWORD Addr)
{
UWORD Data =200 ;
while(Length>0)
{
WriteEEP_BYTE ( Addr, Data);
Data++ ;
Addr++;
Length--;
}
}
//写一个数据
void WriteEEP_BYTE(UWORD Addr, UWORD Data)
{
Send_EWenable();
SET_CS ;
// Send( ep_write,3) ;
Send( ep_write,ep_write_op ) ;
SendAddr(Addr , mode16bit ) ;
SendData(Data) ;
CLR_CS;
DelayNop();
DelayNop();
CLR_DI ;
DelayNop();
DelayNop();
SET_CS;
while(!TST_DO){};
CLR_CS ;
Send_EWdisable;
} |