📄 at45db041.c
字号:
/**********************************************************
调用ReadFalsh(int pageadrres)则SpiBuffer[]得到该page的值
调用WriteFalsh(int pageadrres)则将SpiBuffer[]写入该page
共每页共264byte
**********************************************************/
#define uInt2Hi(uInputVal) ( *((unsigned char *)( &(uInputVal))) )
#define uInt2Lo(uInputVal) ( *(((unsigned char *)(&(uInputVal)))+1) )
sbit SS=P2^0;
sbit SCK=P2^1;
sbit SI=P2^2;
sbit SO=P2^3;
char xdata SpiBuffer[264];
/************************************************************
below is spi and at45db041 code
*************************************************************/
void SPIDataWrite(char Data)
//spi mode 0
{
char i;
SCK=0;
for(i=0 ;i<8; i++)
{
if(Data&0x80)SI=1;
else SI=0;
SCK=1;
_nop_();
_nop_();
SCK=0;
Data<<=1;
}
}
char SPIDataReadFirst(void )
//spi mode 0
{
char i;
char getvalue=0;
SCK=1;//falling edge putout data
SCK=0;
_nop_();
_nop_();
for(i=0 ;i<8; i++)
{
SCK=1;
getvalue<<=1;
if(SO)
getvalue|=0x01;
SCK=0;
_nop_();
_nop_();
}
return getvalue;
}
char SPIDataRead(void )
//spi mode 0
{
char i;
char getvalue=0;
// SCK=1;
// SCK=0;
_nop_();
_nop_();
for(i=0 ;i<8; i++)
{
SCK=1;
getvalue<<=1;
if(SO)
getvalue|=0x01;
SCK=0;
_nop_();
_nop_();
}
return getvalue;
}
void BufferWrite()
{
int i;
SCK=0;
SS=0;
SPIDataWrite(0x84);//operate code
SPIDataWrite(0x00);
SPIDataWrite(0x00);//15 don't care bits
SPIDataWrite(0x00);//9 address bits
for(i=0 ;i<264; i++)
SPIDataWrite(SpiBuffer[i]);
SS=1;
}
bit BufToMemory(int tInputAddress)
{
int tTempTimeOut;
unsigned char tTempLowByte,tTempHighByte;
tInputAddress*=2;
tTempLowByte=uInt2Lo(tInputAddress);
tTempHighByte=uInt2Hi(tInputAddress);
SCK=0;
SS=0;
SPIDataWrite(0x83);//operate code
SPIDataWrite(tTempHighByte);//4 reserved bit
SPIDataWrite(tTempLowByte);//11 page address
SPIDataWrite(0x00);//9 don't care bits
SS=1;
_nop_();
SS=0;
for(tTempTimeOut=0 ;tTempTimeOut<10000; tTempTimeOut++)
{
_nop_();
_nop_();
_nop_();
if(CheckStatus())
{
SS=1;
return 1;//operation success
}
}
SS=1;
return 0;//operation fail
}
bit WriteFlash(int address)
{
BufferWrite();
return BufToMemory(address);
}
void ReadFlash(int tInputAddress)
{
int i;
unsigned char tTempLowByte,tTempHighByte;
tInputAddress*=2;
tTempLowByte=uInt2Lo(tInputAddress);
tTempHighByte=uInt2Hi(tInputAddress);
SCK=0;
SS=0;
SPIDataWrite(0x52);//operate code
SPIDataWrite(tTempHighByte);//4 reserved bits
SPIDataWrite(tTempLowByte); //11 page address bits
SPIDataWrite(0x00); //9 byte address bits
SPIDataWrite(0x68);
SPIDataWrite(0x68);
SPIDataWrite(0x68);
SPIDataWrite(0x68);//32 don't care bits
SpiBuffer[0]=SPIDataReadFirst();
for(i=1 ;i<264; i++)
SpiBuffer[i]=SPIDataRead();
SS=1;
}
bit CheckStatus()
{
char status;
SPIDataWrite(0x57);
status=SPIDataReadFirst();
if(status&0x80)
return 0;//ready
else
return 1;//busy
}
void BufRead(char *p)
{
char i;
SCK=0;
SS=0;
SPIDataWrite(0x54);//operate code
SPIDataWrite(0x00);
SPIDataWrite(0x00);//15 don't care bits
SPIDataWrite(0x00);//9 byte address bits
SPIDataWrite(0x00);//8 don't care bits
p[0]=SPIDataReadFirst();
for(i=1 ;i<7; i++)
p[i]=SPIDataRead();
SS=1;
}
void MemToBuf()
{
int i ;
SS=0;
SPIDataWrite(0x53);//operate code
SPIDataWrite(0x00);//4 reserved bits
SPIDataWrite(0x00);//11 page address bits
SPIDataWrite(0x00);//9 don't care bits
for(i=0 ; i<10000; i++)
{
_nop_();
_nop_();
_nop_();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -