/************************************************************************************************
说明:
AT45DB041B: SPI接口,2048Pages(264Bytes/Page), 2.7V-3.6V, 5V系统中读写可能出错,
要做降压处理,详细做法请参见另一篇文章<<3V和5V系统混合设计技巧>>.
以下程序是我在一个图文显示系统中的读写程序,ATmega32 , SPI接口
************************************************************************************************/
/**********************************************************
函数名称:SPI_ReadFlash
功能描述:直接读FLASH
入口参数:PA,PBA,pHeader,Num
出口参数:NULL
编 者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_ReadFlash(WORD PA,WORD PBA,BYTE *pHeader,WORD Num)
{
WORD i;
while(i <255){if(SPI_CheckBusy()&0x80){break;}} //read status
PA<<=1;
PA|=PBA>>8;
FLASH_CS_L; //chip select
SPI_WriteByte(0xe8); //直接读FLASH
SPI_WriteByte((unsigned char)(PA>>8)); //页地址高位
SPI_WriteByte((unsigned char) PA); //页地址低位
SPI_WriteByte((unsigned char)PBA); //页偏移地址
SPI_WriteByte(0x00);
SPI_WriteByte(0x00);
SPI_WriteByte(0x00);
SPI_WriteByte(0x00);
for(i=0;i<Num;i++)
{
SPI_WriteByte(0xff); //写字节数据,使字节数据从SO移出
pHeader[i]=SPDR;
}
FLASH_CS_H;
}
/**********************************************************
函数名称:SPI_ReadPage
功能描述:直接读页FLASH,仅一页
入口参数:PA,PBA,pHeader,Num
出口参数:NULL
编 者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_ReadPage(WORD PA,WORD PBA,BYTE *pHeader,WORD Num)
{
WORD i;
while(i <255){if(SPI_CheckBusy()&0x80){break;}} //read status
FLASH_CS_L; //chip select
SPI_WriteByte(0xd2); //直接读FLASH
SPI_WriteByte((unsigned char)(PA>>7));
SPI_WriteByte((unsigned char)((PA<<1)|(PBA>>8)));
SPI_WriteByte((unsigned char)PBA);
SPI_WriteByte(0x00);
SPI_WriteByte(0x00);
SPI_WriteByte(0x00);
SPI_WriteByte(0x00);
for(i=0;i<Num;i++)
{
SPI_WriteByte(0xff);
pHeader[i]=SPDR;
}
FLASH_CS_H;
}
/**********************************************************
函数名称:SPI_ReadBuffer
功能描述:读BUFFER
入口参数:BFA:buffer, Num
出口参数:NULL
编 者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_ReadBuffer(BYTE cmd,WORD BFA,BYTE *pHeader,WORD Num)
{
WORD i;
while(i <255){if(SPI_CheckBusy()&0x80){break;}} //read status
FLASH_CS_L;
SPI_WriteByte(cmd); //写BUFFER指令,0X54/D4 BUFFER1,0X56/D6 BUFFER2
SPI_WriteByte(0x00);
SPI_WriteByte((unsigned char)(BFA>>8));
SPI_WriteByte((unsigned char)BFA);
SPI_WriteByte(0x00);
for(i=0;i<Num;i++)
{
SPI_WriteByte(0xff);
pHeader[i]=SPDR;
}
FLASH_CS_H;
}
/**********************************************************
函数名称:SPI_WriteBuffer
功能描述:从数据缓冲区向flash缓冲区buffer1或buffer2
写入指定数量的数据
入口参数: trabuf:数据缓冲区 , num:待写入的字节数
出口参数:NULL
编 者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_WriteBuffer(BYTE cmd,WORD BFA,BYTE *trabuf,WORD Num)
{
WORD i;
while(i <255){if(SPI_CheckBusy()&0x80){break;}} //read status
FLASH_CS_L;
SPI_WriteByte(cmd); //写BUFFER指令,0X84 BUFFER1,0X87 BUFFER2
SPI_WriteByte(0x00); //无关位
SPI_WriteByte((unsigned char)(BFA>>8));
SPI_WriteByte((unsigned char)BFA);
for(i=0;i<Num;i++)
{
SPI_WriteByte(Write_FLASH_Buffer[i]);
SPI_WriteByte(trabuf[Num]);
}
FLASH_CS_H;
}
/**********************************************************
函数名称:SPI_WriteFlash
功能描述:1. 先擦除页,再把BUFFER中数据写到FLASH主存
BUFFER1 0X83, BUFFER2 0X86
2. 不须要擦除页,直接把BUFFRE中数据写到FLASH主存,连续页写不推荐此法
BUFFER1 0X88, BUFFER2 0X89
入口参数:PA:页地址
出口参数:NULL
编 者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_WriteFlashFromBuffer(BYTE cmd,WORD PA)
{
WORD i="0";
while(i <255){if(SPI_CheckBusy()&0x80){break;}} //read status
FLASH_CS_L;
SPI_WriteByte(cmd); //写BUFFER指令
SPI_WriteByte((char)(PA>>7));
SPI_WriteByte((char)(PA<<1));
SPI_WriteByte(0x00);
FLASH_CS_H;
}
/**********************************************************
函数名称:SPI_ErasePage
功能描述:擦除页
入口参数:PA:页地址
出口参数:NULL
编 者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_ErasePage(BYTE cmd,WORD PA)
{
WORD i="0";
while(i <255){if(SPI_CheckBusy()&0x80){break;}} //read status
FLASH_CS_L;
SPI_WriteByte(cmd); //擦页
SPI_WriteByte(0x00);
SPI_WriteByte((char)(PA>>7));
SPI_WriteByte((char)(PA<<1));
SPI_WriteByte(0x00);
FLASH_CS_H;
}
/**********************************************************
函数名称:SPI_EraseBlock
功能描述:擦除页/擦除块
入口参数:PBA:块地址
出口参数:NULL
编 者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_EraseBlock(BYTE cmd,WORD PBA)
{
WORD i="0";
while(i <255){if(SPI_CheckBusy()&0x80){break;}}//read status
FLASH_CS_L;
SPI_WriteByte(cmd); //擦块
SPI_WriteByte(0x00);
SPI_WriteByte((char)(PBA>>4));
SPI_WriteByte((char)(PBA<<4));
SPI_WriteByte(0x00);
FLASH_CS_H;
}
/**********************************************************
函数名称:SPI_WriteFlashDirect
功能描述:直接写FLASH,先写数据写到BUFFER中
入口参数:pagadd:页地址
出口参数:NULL
编 者:zhumy
创建日期:2007/10/6
**********************************************************/
void SPI_WriteFlashDirect(BYTE cmd,WORD PA,WORD BFA,BYTE *trabuf,WORD Num)
{
WORD i="0";
while(i <255){if(SPI_CheckBusy()&0x80){break;}}//read status
FLASH_CS_L; //chip select
SPI_WriteByte(cmd); //直接写FLASH,0x82 buffer1,0x85 buffer2
SPI_WriteByte((unsigned char)(PA>>7));
SPI_WriteByte((unsigned char)((PA<<1)|(BFA>>8)));
SPI_WriteByte((unsigned char)BFA);
for(i=0;i<Num;i++)
{
SPI_WriteByte(trabuf[i]);
}
FLASH_CS_H;
}
/**********************************************************
函数名称:SPI_FlashToBuffer
功能描述:主存传送到BUFFER
入口参数:PA:页地址
出口参数:NULL
编 者:zhumy
创建日期:2007/10/6
**********************************************************/
void SPI_PageToBuffer(BYTE cmd,WORD PA )
{
WORD i="0";
while(i <255){if(SPI_CheckBusy()&0x80){break;}} //read status
FLASH_CS_L;
SPI_WriteByte(cmd);//写BUFFER指令,0X53 BUFFER1,0X55 BUFFER2
SPI_WriteByte((char)(PA>>7));
SPI_WriteByte((char)(PA<<1));
SPI_WriteByte(0x00);
FLASH_CS_H;
}