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

📄 at45db041.c

📁 编译器keil c, 功能:对atmel的dataflash读写
💻 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 + -