📄 at45db081.c
字号:
//--------------文件信息--------------------------------------------------------------------------------
//文 件 名: at45db321.c
//创 建 人: 彭井花
//最后修改日期: 2006年11月24日
//描 述: 包括读写BUFFER,读写FLASH等。at45db321 共有8192页,
// 一页为512+16=528 byte,8 页为一个BLOCK,共1024个BLOCK ,
// 16个SECTOR
//--------------版本信息--------------------------------------------------------------------------------
// 创建人: 彭井花
// 版 本: V1.0
// 日 期: 2006年11月24日
// 描 述: 包括读写BUFFER,读写FLASH等。
//
//------------------------------------------------------------------------------------------------------
// 修改人:
// 版 本:
// 日 期:
// 描 述:
//
//------------------------------------------------------------------------------------------------------
#include "AT45.h"
#include "config.h"
#define SPCR 0x5f
uint8 Data_Buff[255];
/******************************************************************************/
/* 函数名称:void write_to_flash_byte( uint8 ) */
/* 功能描述:向AT45DB321 flas写入一个字节 */
/* 参数说明:cdata为待写入的数据 */
/* 参数返回:无 */
/******************************************************************************/
void Write_To_Flash_Byte( uint8 cdata )
{
uint8 byte;
SPDR = cdata;
while (!(SPSR & 0x80)); //等待写结束
byte = SPDR;
}
/******************************************************************************/
/* 函数名称:uchar check_flash_busy(void) */
/* 功能描述:检查flash是否忙 */
/* 参数说明:无 */
/* 参数返回: 如果忙返回1,不忙返回0 */
/******************************************************************************/
uint8 Check_Flash_Busy( void )
{
uint8 busy_flag;
P0 &= 0xefff; //置cs低选中,即P0.13口
Write_To_Flash_Byte(0xd7);
Write_To_Flash_Byte(0xff); //写字节数据,使字节数据从SO移出
busy_flag = SPDR;
P0 |= 0x1000; //置cs高不选中
if(busy_flag & 0x80)
busy_flag = 0;
else
busy_flag = 1;
return busy_flag;
}
/******************************************************************************/
/* 函数名称:void write_buff(uint8,uint32,uint32) */
/* 功能描述:从datasave_buff数组向flash缓冲区buffer1或buffer2 */
/* 写入指定数量的数据 */
/* 参数说明:Write_com为命令字0x84写buffer1,0x87写buffer2, */
/* buffer_offset为写缓冲区起始地址,byte_count为 */
/* 待写入的字节数 */
/* 参数返回: 无 */
/******************************************************************************/
void Write_Buff( uint8 Write_com, uint32 buffer_offset, uint32 byte_count )
{
uint32 i;
P0 &= 0xefff; //置cs低选中
Write_To_Flash_Byte( Write_com ); //写buffer指令
Write_To_Flash_Byte(0); //写无关位
Write_To_Flash_Byte( (uint8)(buffer_offset>>8) );
Write_To_Flash_Byte( (uint8)buffer_offset );
for (i=0; i<byte_count; i++) //将byte_count个字节写入FLASH Buffer1
Write_To_Flash_Byte( Data_Buff[i] );
P0 |= 0x1000; //置cs高不选中
}
/******************************************************************************/
/* 函数名称:void Erasure_write_flash( uint8, uint32 ) */
/* 功能描述: 从buffer1或buffer2向flash存贮区带擦除或不带擦除写一页 */
/* 或从flash存贮区向buffer1或buffer2写一页 */
/* 参数说明:Write_com为命令字0x83带擦除buffer1到主存,0x86带擦除 */
/* buffer2到主存,0x88不带擦除buffe1到主存,0x89为不带擦 */
/* 除buffer2主存,0x53为主存传送到buffer1,0x55为主存传 */
/* 送到buffer2,page_address为页地址 */
/* 参数返回: 无 */
/******************************************************************************/
void Erasure_Write_Flash( uint8 Write_com, uint32 page_address )
{
P0 &= 0xefff; //置cs低选中
Write_To_Flash_Byte( Write_com );
page_address = page_address << 1;
Write_To_Flash_Byte( (uint8)(page_address>>8) );
Write_To_Flash_Byte( (uint8)page_address );
Write_To_Flash_Byte(0); //写无关位
P0 |= 0x1000; //置cs高不选中
while( Check_Flash_Busy() ); //等待器件写完结束
}
/******************************************************************************/
/* 函数名称:void read_buff(uchar,uint32,uint32) */
/* 功能描述:从buffer1或buffer2向datasave_buff数组读指定数量的数据 */
/* 参数说明:Write_com为命令字0x54读buffer1,0x56读buffer2, */
/* buffer_offset为读缓冲区起始地址,byte_count为 */
/* 欲读取的字节数 */
/* 参数返回: 无 */
/******************************************************************************/
void Read_Buff( uint8 Readcmd, uint32 buffer_offset, uint32 count )
{
uint32 i;
P0 &= 0xefff; //置cs低选中
Write_To_Flash_Byte( Readcmd );
Write_To_Flash_Byte(0);
Write_To_Flash_Byte( (uint8)(buffer_offset>>8) );
Write_To_Flash_Byte( (uint8)buffer_offset );
Write_To_Flash_Byte(0);
for(i=0; i<count; i++)
{
Write_To_Flash_Byte(0xff);
Data_Buff[i]=SPDR;
}
P0 |= 0x1000; //置cs高不选中
}
/******************************************************************************/
/* 函数名称:void read_flash(uint8,uint32,uint32,uint32) */
/* 功能描述:从flash指定页指定页内起始地址读取指定数量的数据字节到 */
/* datasave_buff数组 */
/* 参数说明:Write_com为命令字0x52读命令,page_offset为页内起始地址 */
/* page_address为页地址,count为欲读取的字节数 */
/* 参数返回: 无 */
/******************************************************************************/
void Read_Flash( uint8 Readcmd, uint32 page_offset, uint32 page_address, uint32 count )
{
uint32 pa,i;
uint8 byte;
pa = 0;
page_address<<=2;
pa = page_offset>>8;
page_address |= pa;
P0 &= 0xefff; //置cs低选中
Write_To_Flash_Byte( Readcmd );
Write_To_Flash_Byte( (uint8)(page_address>>8) );
Write_To_Flash_Byte( (uint8)page_address );
Write_To_Flash_Byte( (uint8)page_offset );
for(byte=0; byte<4; byte++)
{
Write_To_Flash_Byte(0);
}
for(i=0; i<count; i++)
{
Write_To_Flash_Byte(0xff); //写字节数据,使字节数据从SO移出
Data_Buff[i] = SPDR;
}
P0 |= 0x1000; //置cs高不选中
}
/******************************************************************************/
/* 函数名称:void Write_flash(uint8,uint32,uint32,uint32) */
/* 功能描述:从datasave_buff数组向flash写入指定数量的数据 */
/* 参数说明:Write_com为命令字0x84写buffer1,0x87写buffer2, */
/* buffer_offset为写缓冲区起始地址,byte_count为 */
/* 待写入的字节数 . */
/* 参数返回: 无 */
/******************************************************************************/
void Write_Flash( uint8 Writecmd, uint32 page_address, uint32 page_offset, uint32 buffer_offset, uint32 byte_count )
{
uint32 pa,i;
uint8 byte;
pa = 0;
page_address<<=1;
pa = page_offset>>8;
page_address |= pa;
P0 &= 0xefff; //置cs低选中
Write_To_Flash_Byte( Readcmd );
Write_To_Flash_Byte(0); //写无关位
Write_To_Flash_Byte( (uint8)(page_address>>8) );
Write_To_Flash_Byte( (uint8)page_address );
Write_To_Flash_Byte( (uint8)page_offset );
Write_To_Flash_Byte( (uint8)(buffer_offset>>8) );
Write_To_Flash_Byte( (uint8)buffer_offset );
for (i=0; i<byte_count; i++) //将byte_count个字节写入FLASH Buffer1
Write_To_Flash_Byte( Data_Buff[i] );
P0 |= 0x1000; //置cs高不选中
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -