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