📄 spi_con.c
字号:
IsBusy();
CS_0;
SPI_WriteByte(0xd2);// MEM_PAGE_READ //0x68 我改为了0xD2页读 0XE8
SPI_WriteByte((unsigned char)(page>>6)); //地址最高字节
SPI_WriteByte((unsigned char)((page<<2)|(address>>8)));
SPI_WriteByte((unsigned char)address);//地址低字节
SPI_WriteByte(BYTE_DUMMY);//32 don't care bits
SPI_WriteByte(BYTE_DUMMY);
SPI_WriteByte(BYTE_DUMMY);
SPI_WriteByte(BYTE_DUMMY);
SPI_WriteByte(0xff);
CS_1;
return SPDR;
}
////不改变原来的内容,只改变其中的几个字节.
static void AT45_Memory_PageWrite(unsigned char buffer_choice,unsigned int page,unsigned int address,unsigned int num,unsigned char *string)
{
//memory to buffer.
unsigned int i;
unsigned char tt;
CS_0;
#asm("nop");
#asm("nop");
if(buffer_choice)
{
SPI_WriteByte(0x55); //buffer 2
}
else
{
SPI_WriteByte(0x53); //buffer 1
}
tt=(uchar)(page >>6);
SPI_WriteByte(tt); // 6 to 7
tt=(uchar)(page <<2);
SPI_WriteByte(tt);
SPI_WriteByte(BYTE_DUMMY);
CS_1;
//wait
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
delayMS(50);
IsBusy();
//write buffer
CS_0; //active the device
#asm("nop");
#asm("nop");
if(buffer_choice)
{
SPI_WriteByte(0x87); //buffer 2
}
else
{
SPI_WriteByte(0x84); //buffer 1
}
SPI_WriteByte(BYTE_DUMMY); //xxxx xxxx don’t care bits
tt=(uchar)((address>>8)&0x03);
SPI_WriteByte(tt); //BFA9,BFA8
SPI_WriteByte((uchar)address); //BFA7~BFA0
for(i=0;i<num;i++) /*buffer. More detail in the datasheet.*/
{
SPI_WriteByte(string[i]);
delayUS(30);
}
CS_1; //inactive the device
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
//buffer to memory
CS_0;
#asm("nop");
#asm("nop");
if(buffer_choice)
{
SPI_WriteByte(0x86); //buffer 2
}
else
{
SPI_WriteByte(0x83); //buffer 1
}
tt=(uchar)(page >>6);
SPI_WriteByte(tt); //6 我改为7
tt=(uchar)(page <<2);
SPI_WriteByte(tt);
SPI_WriteByte(BYTE_DUMMY);
CS_1;
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
//wait
IsBusy();
}
/*-------------------------------------------------------------------
AT45_MemoryToBuffer()
Func: transfer of the page of data from the main memory to the buffer
Input: (1) 0: choice buffer 1
1: choice buffer 2
(2) which page of the memory?-------page
Output: No.
Attention: the initial stream of data:
0x53(for buffer 1)
0x55--xxx PA10~PA7--PA6~PA0 x--xxxx xxxx
---------------------------------------------------------------------*/
void AT45_MemoryToBuffer(uchar buffer_choice,uint page) //正确
{
uchar tt;
CS_0;
#asm("nop");
#asm("nop");
if(buffer_choice)
{
SPI_WriteByte(0x55); //buffer 2
}
else
{
SPI_WriteByte(0x53); //buffer 1
}
tt=(uchar)(page >>6);
SPI_WriteByte(tt); // 6 to 7
tt=(uchar)(page <<2);
SPI_WriteByte(tt);
SPI_WriteByte(BYTE_DUMMY);
CS_1;
//wait
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
delayMS(50);
IsBusy();
}
/*----------------------------------------------------------
AT45_BufferToMemory()
Func: BUFFER TO MAIN MEMORY PAGE PROGRAM WITH BUILT-IN ERASE.
Input: (1) 0: choice buffer 1
1: choice buffer 2
(2) which page to store the data from buffer----page
Output: No.
Attention: the initial stream of data:
0x83(for buffer 1)
0x86--xxxx PA10~PA7--PA6~PA0 x--xxxx xxxx
------------------------------------------------------------*/
void AT45_BufferToMemory(uchar buffer_choice,uint page) //带擦除命令0x83,0x86
{
uchar tp;
CS_0;
#asm("nop");
#asm("nop");
if(buffer_choice)
{
SPI_WriteByte(0x86); //buffer 2
}
else
{
SPI_WriteByte(0x83); //buffer 1
}
tp=(uchar)(page >>6);
SPI_WriteByte(tp); //6 我改为7
tp=(uchar)(page <<2);
SPI_WriteByte(tp);
SPI_WriteByte(BYTE_DUMMY);
SPI_WriteByte(0xd7);
CS_1;
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
//wait
IsBusy();
}
//擦除一页
void AT45_ErasePage(uint page) //page(0~8191)
{
uchar temp;
CS_0;
#asm("nop");
#asm("nop");
//send command stream of data
SPI_WriteByte(0X81);// MEM_PAGE_ERASE
temp=(uchar)(page>>6);
SPI_WriteByte(temp); //地址最高字节
temp = (((uchar)page)<<2);
SPI_WriteByte(temp); //地址高字节
SPI_WriteByte(BYTE_DUMMY); //地址低字节
CS_1;
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
delayMS(40); //40MS
IsBusy();
}
//擦除一块,连续的8页。
void AT45_EraseBlock(uint block)//Block(0~1023)
{
uchar temp;
CS_0;
#asm("nop");
#asm("nop");
//send command stream of data
SPI_WriteByte(0x50);// MEM_BLOCK_ERASE
SPI_WriteByte((uchar)(block>>3));//地址最高字节
temp = (((uchar)block)<<5);
SPI_WriteByte(temp); //地址高字节
SPI_WriteByte(BYTE_DUMMY); //地址低字节
CS_1;
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
delayMS(120); //60MS
IsBusy();
}
//复位存储器
static void DataFlashReset(void) //复位存储器
{
CS_0;
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
RESET_0;
delayUS(15);
CS_1;
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
RESET_1;
delayUS(2);
}
//读ID
static void ReadID(void)
{
uchar i;
uchar d[4];
CS_0;
#asm("nop");
#asm("nop");
SPI_WriteByte(0X9F);
for(i=0;i<4;i++)
{
d[i]=SPI_ReadByte();
}
CS_1;
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
}
static void IsBusy(void)
{
while(!(ReadFlashState()&0x80))
{
;
}
}
static unsigned char ReadFlashState(void)
{
unsigned char result=0;
CS_0;
#asm("nop");
#asm("nop");
SPI_WriteByte(0XD7);
result=SPI_ReadByte();
CS_1;
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
return result;
}
static ClearProtect(void)
{
//unsigned char comand=0;
CS_0;
#asm("nop");
#asm("nop");
SPI_WriteByte(0x3D);
SPI_WriteByte(0x2A);
SPI_WriteByte(0x7F);
SPI_WriteByte(0x9A);
CS_1;
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
}
//=================================================================================
void main(void)
{
unsigned int k;
unsigned int i;
unsigned char t_d=0;
PORTA=0X00;
DDRA=0XFF;
PORTC=0X00; //采集器
DDRC=0xFF; //
PORTD=0x00; //01111010
DDRD=0xFF; //01111010
SPI_Init();
DataFlashReset();
for(i=0;i<50;i++)
{
data[i]=0;
}
AT45_MemoryRead(10,0,528,data); //p,a,n,s //读出的全为FF
AT45_EraseBlock(1);
IsBusy();
for(i=0;i<50;i++)
{
data[i]=0;
}
AT45_MemoryRead(10,0,528,data); //p,a,n,s //读出的全为FF
//测试buffer1\2读取
for(i=0;i<50;i++)
{
data[i]=i;
}
AT45_Write_Buffer(0,0,&data[0],50);
for(i=0;i<100;i++)
{
data[i]=0;
}
AT45_Read_Buffer(0,0,50,&data[0]);
//测试读写一个字节
AT45_MemoryByteWrite(45,0,0x33);
t_d=AT45_MemoryByteRead(45,0);
//测试写主存,并读取
for(i=0;i<528;i++)
{
data[i]=i+1;
}
AT45_MemoryPageWrite(1,10,0,528,data); //b,p,a,n,s
//AT45_Memory_PageWrite(0,0,0,528,data); //b,p,a,n,s
for(i=0;i<528;i++)
{
data[i]=0;
}
AT45_MemoryRead(10,0,528,data); //p,a,n,s //读出的全为FF
for(k=0;k<100;k++)
{
#asm("nop");
for(i=0;i<528;i++)
{
data[i]=0;
}
#asm("nop");
AT45_MemoryRead(k,0,500,data); //p,a,n,s //读出的全为FF
#asm("nop");
#asm("nop");
}
//测试buffer到主存
/*for(i=0;i<100;i++)
{
data[i]=40+i;
}
AT45_Write_Buffer(0,0,&data[0],50);
AT45_ErasePage(0);
AT45_BufferToMemory(0,0);
for(i=0;i<100;i++)
{
data[i]=0;
}
AT45_MemoryRead(0,0,50,&data[0]); //p,a,n,s //正确,读出的全为FF
AT45_MemoryToBuffer(1,0);
AT45_EraseBlock(2);
//读ID,及测试忙
ReadID();
ClearProtect();
IsBusy();
AT45_EraseBlock(0);
IsBusy();
AT45_EraseBlock(0);
*/
delay_ms(10);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -