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

📄 at45db321c.c

📁 使用C8051F040的硬件SPI口控制FLASH芯片AT45DB321,P0的0,1,2配置为3线SPI口,P6的0,1,2,3软件控制AT45DB321的状态引脚
💻 C
字号:
/*
    file AT45DB321C.C
    SOME FUNCTIONS RUNS IN AT45DB321C
//  SPI
*/

#include <C8051F040.H>	// Register definition file.
#include <intrins.h>
#include "C8051F040CPU.H"
#include "YC8051F040.H"
#include "AT45DB321C.h"

#pragma ot (0)

#define  _flashbusy   P17	//0:busy;1:idle
#define  _flashreset  P16
#define  _flashcs     P23	 //P14
#define  _flashwp     P15

#define  SCK          P13

#define	Delay;	for(j=0;j<0xffff;j++){_nop_();}
/*
The SCK pin is an input-only pin and is used to control the flow of data to and from the
DataFlash. Data is always clocked into the device on the rising edge of SCK and clocked out of
the device on the falling edge of SCK.
*/
#define  SI           P21	  //P12
#define  SO           P11
unsigned int j;
xdata unsigned char FlashSend[528];
xdata unsigned char FlashRecieve[528];
unsigned char bdata ucflashBitBuf;
sbit flashBitBuf0 = ucflashBitBuf^0;
sbit flashBitBuf1 = ucflashBitBuf^1;
sbit flashBitBuf2 = ucflashBitBuf^2;
sbit flashBitBuf3 = ucflashBitBuf^3;
sbit flashBitBuf4 = ucflashBitBuf^4;
sbit flashBitBuf5 = ucflashBitBuf^5;
sbit flashBitBuf6 = ucflashBitBuf^6;
sbit flashBitBuf7 = ucflashBitBuf^7;


main()
{
	unsigned int j;
	unsigned char temp;
	WDTCN = 0xDE;                       // disable watchdog
	WDTCN = 0xAD;
	os_init();
	port_init();

	for(j = 0; j < 528; j++)
	{
		if(j<256)
		FlashSend[j] = j;
		if((j>255)&&(j<512))
		FlashSend[j] = j-256;
		if(j>511)
		FlashSend[j] = j-512;
	}
//	P03 = 1;
//	temp = P0;
	
	SI = 0;
	SI = 1;
	SI = 0;
	SI = 1;
/*	
	_flashcs = 0;
	_flashcs = 1;
	_flashcs = 0;
	_flashcs = 1;
	_flashcs = 0;	 */
	temp = FLASHReadStatReg( );

//	FLASHErase(0,500);
//	FLASHRead(0,500,0xab,10,FlashRecieve);
//	FlASHWriteViaBuffer(0,500,0xaa,8,FlashSend);
//	Delay;
//	FLASHRead(0,500,0xaf,10,FlashRecieve);
//	FLASHBufferRead(0,170,20,FlashRecieve);

//	FlASHWriteViaBuffer(0,0,0,10,FlashSend);
//	FlASHBufferWrite(0,0xaa,10,FlashSend);
//	FLASHBufferRead(0,0xaa,10,FlashRecieve);
//	FLASHBufferRead(0,0xab,10,FlashRecieve);
//	FLASHRead(1,0,0,10,FlashRecieve);

	for(j = 0; j < 8192; j++)
	{
		FlASHWriteViaBuffer(0,j,0,528,FlashSend);
		FLASHRead(0,j,0,528,FlashRecieve);
	}
	for(j = 0; j < 8192; j++)	
	FLASHRead(0,j,0,528,FlashRecieve);
	while(1)
	{
		j = 0;
	}
	
							
	
}

void    _writeFLASHbyte(  )
{
    SO = 1;
    SCK = 0;  SI = flashBitBuf7;  SCK = 1;//	Delay;
    SCK = 0;  SI = flashBitBuf6;  SCK = 1;//	Delay;
    SCK = 0;  SI = flashBitBuf5;  SCK = 1;//	Delay;
    SCK = 0;  SI = flashBitBuf4;  SCK = 1;//	Delay;
    SCK = 0;  SI = flashBitBuf3;  SCK = 1;//	Delay;
    SCK = 0;  SI = flashBitBuf2;  SCK = 1;//	Delay;
    SCK = 0;  SI = flashBitBuf1;  SCK = 1;//	Delay;
    SCK = 0;  SI = flashBitBuf0;  SCK = 1;//	Delay;
}
/*
Data is always clocked into the device on the rising edge of SCK and clocked out of
the device on the falling edge of SCK.
*/
void   _readFLASHbyte( )
{
    SO = 1;
    SCK = 1;  SCK = 0;  flashBitBuf7  = SO; 
	SO = 1;
    SCK = 1;  SCK = 0;  flashBitBuf6  = SO; 
	SO = 1;
    SCK = 1;  SCK = 0;  flashBitBuf5  = SO; 
	SO = 1;
    SCK = 1;  SCK = 0;  flashBitBuf4  = SO; 
	SO = 1;
    SCK = 1;  SCK = 0;  flashBitBuf3  = SO; 
	SO = 1;
    SCK = 1;  SCK = 0;  flashBitBuf2  = SO; 
	SO = 1;
    SCK = 1;  SCK = 0;  flashBitBuf1  = SO; 
	SO = 1;
    SCK = 1;  SCK = 0;  flashBitBuf0  = SO;
	
}

void FlASHBufferWrite(	bit BufferNumber,					
						unsigned int BufferAddress,//3Byte address comprised of 
					//14 don’t care bit
					// and 10 buffer address bits (BFA9-BFA0
						unsigned int num,
						unsigned char *pBuffer)

{
	unsigned char *pIndex;
    unsigned int unCount;	
	unsigned char BufferAddress0,BufferAddress1,BufferAddress2;
    
	//change the PA&BFA to 3 bytes form
	BufferAddress2 = 0x00;
	BufferAddress1 = 0x0003 & (BufferAddress >> 8);	
	BufferAddress0 = BufferAddress&0x00FF;
    pIndex = pBuffer;
    unCount = 0;
	SO = 1;
	if(BufferNumber)//buffer2
		ucflashBitBuf = 0x87;
	else//buffer1
		ucflashBitBuf = 0x84;//write op code
	
	_flashcs  = 1;
	_flashcs  = 0;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress2;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress1;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress0;
	_writeFLASHbyte(  );			//write buffer address	 
   
    while( unCount < num )
    {								//write data to buffer
//      FLASHWriteEnable( );
        ucflashBitBuf = *pIndex;
		_writeFLASHbyte(  );
//      FLASHWriteDisable( );
//      ucTemp1++;
        pIndex++;
        unCount++;
	}
	_flashcs  = 1;					//pull up /CS pin
	
}

void FlASHWriteViaBuffer(	bit BufferNumber,
							unsigned int PageAddress,
							unsigned int BufferAddress,
							unsigned int num,
							unsigned char *pBuffer)
{
	unsigned char *pIndex;
    unsigned int unCount;	
	unsigned char BufferAddress0,BufferAddress1,BufferAddress2;
	//change the PA&BFA to 3 bytes form
	BufferAddress2 = 0x7F & (PageAddress>>6);
	BufferAddress1 = 0x003F & PageAddress;
	BufferAddress1 = BufferAddress1 << 2;
	BufferAddress1 = ((BufferAddress >> 8)&0x0003)|BufferAddress1;
	BufferAddress0 = BufferAddress&0x00FF;
    pIndex = pBuffer;
    unCount = 0;
	SO = 1;
	if(!BufferNumber)//buffer1
		ucflashBitBuf = 0x82;
	else//buffer2
		ucflashBitBuf = 0x85;//write op code
	
	_flashcs  = 1;
	_flashcs  = 0;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress2;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress1;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress0;
	_writeFLASHbyte(  );			//write buffer address	 
   
    while( unCount < num )
    {								//write data to buffer
//      FLASHWriteEnable( );
        ucflashBitBuf = *pIndex;
		_writeFLASHbyte(  );
//      FLASHWriteDisable( );
//      ucTemp1++;
        pIndex++;
        unCount++;
	}
	_flashcs  = 1;	//start to write Flash via buffer
	while(!_flashbusy)_flashbusy = 1;	//break when op complete
}

void FlASHWriteFromBuffer (bit BufferNumber,
					       unsigned int PageAddress)
{//a page data from buffer to flash,
	unsigned char BufferAddress0,BufferAddress1,BufferAddress2;
	//change the PA&BFA to 3 bytes form
	BufferAddress2 = 0x7F & (PageAddress>>6);
	BufferAddress1 = 0x003F & PageAddress;
	BufferAddress1 = BufferAddress1 << 2;	
	BufferAddress0 = 0x00;
	SO = 1;
	if(BufferNumber)//buffer2
		ucflashBitBuf = 0x86;//first erase
	else//buffer1
		ucflashBitBuf = 0x83;//write op code
	
	_flashcs  = 1;
	_flashcs  = 0;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress2;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress1;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress0;
	_writeFLASHbyte(  );			//write buffer address		

	_flashcs  = 1;	//start to write Flash via buffer
	while(!_flashbusy)_flashbusy = 1;	//break when op complete
}

void FLASHRead(bit ReadType,//Array Or Page
               unsigned int PageAddress,	//0~8191;0~0x2000;
			   unsigned int BufferAddress, //0~527;0~0x210;
               unsigned int num,
               unsigned char *pBuffer )
{
	unsigned char *pIndex;
    unsigned int unCount;	
	unsigned char BufferAddress0,BufferAddress1,BufferAddress2;
	//change the PA&BFA to 3 bytes form
	BufferAddress2 = 0x7F & (PageAddress>>6);
	BufferAddress1 = 0x003F & PageAddress;
	BufferAddress1 = BufferAddress1 << 2;
	BufferAddress1 = ((BufferAddress >> 8)&0x0003)|BufferAddress1;
	BufferAddress0 = BufferAddress&0x00FF;
    
	pIndex = pBuffer;
    unCount = 0;
	SO = 1;
	if( !ReadType )//ArrayRead:0;PageRead:1
	ucflashBitBuf = 0xE8;
	else
	ucflashBitBuf = 0xD2;
	
	BufferAddress2  &= 0x7F; 
//It is recommended that “r” be a logical “0” for densities of 32M bits or smaller
	_flashcs  = 1;
	_flashcs  = 0;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress2;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress1;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress0;
	for(unCount = 0; unCount<5; unCount++)
	{
		_writeFLASHbyte(  );
	}//64 clock
	
	unCount = 0;
//	SCK = 0;
	while(unCount < num)
	{
		_readFLASHbyte( );
		*pIndex = ucflashBitBuf;
		pIndex++;
		unCount++;
//		Delay;
	}
	
	_flashcs  = 1;//complete the read operation
}

void FLASHBufferRead(bit BufferNumber,					 
				     unsigned int BufferAddress,                     
                     unsigned int num,
                     unsigned char *pBuffer)
{
	unsigned char *pIndex;
    unsigned int unCount;	
	unsigned char BufferAddress0,BufferAddress1,BufferAddress2;
	
	BufferAddress2 = 0x00;
	BufferAddress1 = 0x0003 & (BufferAddress >> 8);	
	BufferAddress0 = BufferAddress&0x00FF;
    pIndex = pBuffer;
    unCount = 0;
	SO = 1;
	if( !BufferNumber )//buffer 1
	ucflashBitBuf = 0xD4;
	else
	ucflashBitBuf = 0xD6;	//buffer 2
	_flashcs  = 1;
	_flashcs  = 0;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress2;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress1;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress0;
	for(unCount = 0; unCount<2; unCount++)
	{
		_writeFLASHbyte(  );
	}//40 clock
	
	unCount = 0;
//	SCK = 0;
	while(unCount < num)
	{
		_readFLASHbyte( );
		*pIndex = ucflashBitBuf;
		pIndex++;
		unCount++;
	}
	
	_flashcs  = 1;

}

void FLASHErase(bit EraseType,unsigned int PageAddress)
{//EraseType=0:PageErase;EraseType=1:BlockErase
	unsigned char BufferAddress0,BufferAddress1,BufferAddress2;
	if(EraseType)
    {//BlockErase,PageAddress:0~1023
		BufferAddress2 = 0x7F & (PageAddress>>3);
		BufferAddress1 = 0x0007 & PageAddress;
		BufferAddress1 = BufferAddress1 << 5;
		BufferAddress0 = 0x00;		
		ucflashBitBuf = 0x50;	
	}
	else
	{//PageErase,PageAddress:0~8191
		BufferAddress2 = 0x7F & (PageAddress>>6);
		BufferAddress1 = 0x003F & PageAddress;
		BufferAddress1 = BufferAddress1 << 2;
		BufferAddress0 = 0x00;		
		ucflashBitBuf = 0x81;
	}
	_flashcs  = 1;
	_flashcs  = 0;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress2;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress1;
	_writeFLASHbyte(  );
	ucflashBitBuf = BufferAddress0;
	_writeFLASHbyte(  );
	_flashcs  = 1;
	while(!_flashbusy)_flashbusy = 1;	//break when op complete
}

/*
void FLASHWriteEnable( )
{
    SO = 1;
    _flashwp  = 1;
    SCK   = 0;
    _flashcs  = 0;
    ucflashBitBuf = 0x06;
    _writeFLASHbyte(  );
    SCK = 0;
    _flashcs  =  1;
}

void FLASHWriteDisable( )
{
    SO = 1;
    SCK = 0;
    _flashcs  =  0;
    ucflashBitBuf = 0x04;
    _writeFLASHbyte(  );
    SCK   = 0;
    _flashcs  =  1;
    _flashwp  = 0;
}
*/
unsigned char FLASHReadStatReg( )
{
    SO = 1;
    SCK = 0;
    _flashcs  =  0;
    ucflashBitBuf = 0xD7;
    _writeFLASHbyte( );
//	SCK   = 0;
    _readFLASHbyte( );
//    SCK   = 0;
    _flashcs  =  1;
    return ucflashBitBuf;
}

void WaitFLASHWriteEnd( )
{
	while( 1 )
	{
		FLASHReadStatReg( );
		if( flashBitBuf0 == 1 )
			return;
	}
}


//Status Register Format
//  Bit7   Bit6 Bit5 Bit4 Bit3 Bit2  Bit1   Bit0
//RDY/BUSY COMP  1    1    0     1  Protect   X
/*
void FLASHWriteStatReg( unsigned char ucData )
{
    SCK = 0;
    _flashcs  =  0;
    ucflashBitBuf = 0x01;
    _writeFLASHbyte( );
    ucflashBitBuf = ucData;
    _writeFLASHbyte( );
    SCK   = 0;
    _flashcs  =  1;
}

*/

void os_init()
{
    int i = 0;
    SFRPAGE   = CONFIG_PAGE;
    OSCXCN    = 0x67;									//16M
    for (i = 0; i < 3000; i++);                         //???????? 
    while ((OSCXCN & 0x80) == 0);
    CLKSEL    = 0x01;									//???????
}
void port_init()
{
    SFRPAGE = CONFIG_PAGE;
   	P1MDOUT = 0x7d;
	P2MDOUT = 0x0a;
//  XBR0    = 0x06;
    XBR2    = 0x40;

}

⌨️ 快捷键说明

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