void DF_Resume_from_Deep_Power_Down(void)
{
Enable_DFLASH();
DF_SpiTxByte(Resume_from_Deep_Power_Down);
Disable_DFLASH();
}
//************************************************************
//*配置FLASH页大小为1024bytes
//************************************************************
void DF_Configer_Binary_Page_Size(void)
{
u8 i = 0, j = 0;
u8 Power_of_Two_Page_Size_Command[4]={0x3d,0x2a,0x80,0xa6};
while(j < 5)
{
if(!DF_Check_Page_Size())
{//如果页大小为1056 bytes,则配置为1024 bytes
DF_Check_Busy_State();
Enable_DFLASH();
for(i=0;i<4;i++)
{
DF_SpiTxByte(Power_of_Two_Page_Size_Command[i]);//
}
Disable_DFLASH();
DelayNmsTime(10);
DF_Check_Busy_State();
DelayNmsTime(5);
DF_Deep_Power_Down();
DelayNmsTime(5);
DF_Resume_from_Deep_Power_Down();
DelayNmsTime(1);
}
else
{//已经为1024则不用再配置
break;
}
j ++;
}
}
//************************************************************
//*使能扇区保护
//************************************************************
void DF_Enable_Sector_Protection(void)
{
u8 Enable_Sector_Protection_Command[4]={0x3D,0x2A,0x7F,0xA9}; //使能扇区保护操作码
u8 i;
DF_Check_Busy_State();
Enable_DFLASH();
for(i=0;i<4;i++)
{
DF_SpiTxByte(Enable_Sector_Protection_Command[i]);//写使能扇区保护操作码
}
Disable_DFLASH();
}
//======================================================================
//函数名称:
//输入:
//输出:
//函数功能:禁止扇区保护
//======================================================================
void DF_Disable_Sector_Protection(void)
{
u8 Disable_Sector_Protection_Command[4]={0x3D,0x2A,0x7F,0x9A};//禁止扇区保护操作码
u8 i;
DF_Check_Busy_State();
Enable_DFLASH();
for(i=0;i<4;i++)
{
DF_SpiTxByte(Disable_Sector_Protection_Command[i]);//写禁止扇区保护操作码
}
Disable_DFLASH();
}
//======================================================================
//函数名称:
//输入:各扇区保护字0---unprotected 0xff---protected,32byte refer to 32 sector
//输出:
//函数功能:设置扇区保护 注意:会改变BUFFER1中的内容
//======================================================================
void DF_Program_Sector_Protection_Register(u8 *Sector_Protection_Register)
{
u8 Program_Sector_Protection_Command[4]={0x3D,0x2A,0x7F,0xFC};//设置扇区保护操作码
u8 i;
DF_Check_Busy_State();
Enable_DFLASH();
for(i=0;i<4;i++)
{
DF_SpiTxByte(Program_Sector_Protection_Command[i]);//写设置扇区保护操作码
}
for(i=0;i<32;i++)
{
DF_SpiTxByte(Sector_Protection_Register[i]);//写设置扇区保护数据
}
Disable_DFLASH();
}
//======================================================================
//函数名称:
//输入:
//输出:
//函数功能:读取扇区保护寄存器内容(返回32个字节,对应32个扇区的情况)
//======================================================================
void DF_Read_Sector_Protection_Register(u8 *Sector_Protection_Register)
{
u8 Read_Sector_Protection_Register_Command[4]={0x32,0,0,0};
u8 i;
DF_Check_Busy_State();
Enable_DFLASH();
for(i=0;i<4;i++)//write
{
DF_SpiTxByte(Read_Sector_Protection_Register_Command[i]);
}
for(i=0;i<32;i++)//read
{
Sector_Protection_Register[i] = DF_SpiRxByte();
}
Disable_DFLASH();
}
//************************************************************
//*取消所有扇区保护
//*返回1表示成功取消扇区所以保护
//************************************************************
u8 DF_Cancel_Sector_Protection(void)
{
u8 Sector_Protection_Register_for_Write[32]={0,0,0,0,0,0,0,0};//写入0为去保护
u8 Sector_Protection_Register_for_Read[32]={1,1,1,1,1,1,1,1};//防止默认值为0
u16 i;
u8 j=1;
//使能扇区保护
DF_Enable_Sector_Protection();
//设置扇区保护
DF_Program_Sector_Protection_Register(Sector_Protection_Register_for_Write);
//读取扇区保护寄存器内容
DF_Read_Sector_Protection_Register(Sector_Protection_Register_for_Read);
//判断扇区保护寄存器内容
for(i=0;i<8;i++)
{
if(Sector_Protection_Register_for_Read[i] != 0) j++;
}
//禁止扇区保护
DF_Disable_Sector_Protection();
return j;
}
//=============================================================================
//函数名称:DF_ContinusArrayRead(UIN32 readaddr,u8 *readbuff,u16 len)
//输入:readaddr指定数据在FLASH中的存储地址,指定数据的首地址,指定数据的长度
//输出:readbuf指定数据暂存区的首地址
//函数功能:从FLASH主存readaddr地址处连续读取len字节数据
//=============================================================================
void DF_ContinusArrayRead(u32 readaddr,u8 *readbuff,u16 len)
{
u16 i;
DF_Check_Busy_State();
Enable_DFLASH();
DF_SpiTxByte(Continuous_Array_Read_Command);
DF_SpiTxByte((u8)((readaddr >> 16) & 0xff));
DF_SpiTxByte((u8)((readaddr >> 8) & 0xff));
DF_SpiTxByte((u8)(readaddr & 0xff));
for(i = 0 ; i < 4 ; i ++)
{
DF_SpiTxByte(0x00);
}
for(i = 0 ; i < len ; i ++)
{
readbuff[i] = DF_SpiRxByte();
}
Disable_DFLASH();
}
//=============================================================================
//函数名称:DF_BufferWrite(u8 bufferaddr,u8 *writebuff,u16 len)
//输入:BUFFER中的起始地址, 待存数据的头指针,待存数据的长度1~1024
//输出:
//函数功能:将指定数据写入从某个地址(0~1023)开始的BUFFER1中
//=============================================================================
void DF_BufferWrite(u16 bufferaddr,u8 *writebuff,u16 len)
{
u16 i;
DF_Check_Busy_State();
Enable_DFLASH();
DF_SpiTxByte(Write_Data_to_Buffer1);
DF_SpiTxByte(0x00);
DF_SpiTxByte((u8)((bufferaddr >> 8) & 0x03));
DF_SpiTxByte((u8)(bufferaddr & 0xff));
for(i = 0 ; i < len ; i ++ )
{
DF_SpiTxByte(writebuff[i]);
}
Disable_DFLASH();
}
//=============================================================================
//函数名称:DF_BufferToMainMemoryWithErase(u16 pageaddr,u8 buffaddr,u8 *writebuff,u16 len)
//输入:BUFFER中的起始地址, 待存数据的头指针,待存数据的长度1~1024
//输出:
//函数功能:将指定数据写入从某个地址(0~1023)开始的BUFFER1中:包含2个动作,首先将
//指定数据写入到BUFFER 1中,其中可以指定BUFFER中的起始写入地址,此写入动作不影响
//BUFFER中其它地址中的数据,然后再将BUFFER中的整个数据写入到某指定页中(带预擦除)。
//=============================================================================
void DF_BufferToMainMemoryWithErase(u16 pageaddr,u16 buffaddr,u8 *writebuff,u16 len)
{
DF_BufferWrite(buffaddr,writebuff,len);
DF_Check_Busy_State();
Enable_DFLASH();
DF_SpiTxByte(Write_Buffer1_to_Page_whin_Erase);
DF_SpiTxByte((u8)((pageaddr >> 8) & 0x7f));
DF_SpiTxByte((u8)(pageaddr & 0xfc));
DF_SpiTxByte(0x00);
DelayNmsTime(40);
Disable_DFLASH();
}
//======================================================================
//函数名称:DF_MainMemoryPageProgramThroughBuffer(u32 writeaddr, u8 *writebuff, u16 len)
//输入:riteaddr---待写入地址,writebuff数据指针,len数据长度
//输出:
//函数功能:通过BUF1写主存,包含动作:先将1-1024字节数据写入BUF1,然后进行
//BUF1到主存的带擦除编程
//==================================================================
void DF_MainMemoryPageProgramThroughBuffer(u32 writeaddr, u8 *writebuff, u16 len)
{
u16 i = 0;
DF_Check_Busy_State();
Enable_DFLASH();
DF_SpiTxByte(Main_Memory_Page_Pro_Through_Buff1);
DF_SpiTxByte((u8)((writeaddr >> 16) & 0xff));
DF_SpiTxByte((u8)((writeaddr >> 8) & 0xff));
DF_SpiTxByte((u8)(writeaddr & 0xff));
for(i = 0 ; i < len ; i ++ )
{
DF_SpiTxByte(writebuff[i]);
}
DelayNmsTime(40);
Disable_DFLASH();
}
//========================================================================================
//函数名称:DF_MainMemoryPagetoBufferTransfer(u16 pageaddr)
//输入:pageaddr
//输出:
//函数功能:
//==========================================================================================
void DF_MainMemoryPagetoBufferTransfer(u16 pageaddr)
{
DF_Check_Busy_State();
Enable_DFLASH();
DF_SpiTxByte(Main_MemoryPage_to_Buffer1_Transfer);
DF_SpiTxByte((u8)((pageaddr >> 8) & 0x7f));
DF_SpiTxByte((u8)(pageaddr & 0xfc));
DF_SpiTxByte(0x00);
Disable_DFLASH();
}
//========================================================================================
//函数名称:
//输入:
//输出:
//函数功能:
//==========================================================================================
void DF_AutoPageRewriteThroughBuffer(u16 pageaddr)
{
DF_Check_Busy_State();
Enable_DFLASH();
DF_SpiTxByte(Auto_Page_Rewrite_through_Buffer1);
DF_SpiTxByte((u8)((pageaddr >> 8) & 0x7f));
DF_SpiTxByte((u8)(pageaddr & 0xfc));
DF_SpiTxByte(0x00);
Disable_DFLASH();
DelayNmsTime(18);
}
//=========================================================================================
//函数名称:DF_Chip_Erase(void)
//输入:
//输出:
//函数功能:整片擦除FLASH全部内容
//==========================================================================================
void DF_Chip_Erase(void)
{
u8 Chip_Erase_Command[4] = {0xC7,0x94,0x80,0x9A};//整片擦除操作码
u8 i;
DF_Check_Busy_State();
Enable_DFLASH();
for(i = 0 ; i < 4 ; i ++)
{
DF_SpiTxByte(Chip_Erase_Command[i]);
}
Disable_DFLASH();
}
//=========================================================================================
//函数名称:
//输入:
//输出:
//函数功能:读取制造ID,确认是否有DATAFLASH存在,存在返回1,否则返回0
//==========================================================================================
u8 DF_ReadManufactureIDInformation(void)
{
u8 i = 0;
u8 Idbuff[4] = {0};
DF_Check_Busy_State();
Enable_DFLASH();
DF_SpiTxByte(Device_ID_Opcode);
for(i = 0 ; i < 4 ; i ++)
{
Idbuff[i] = DF_SpiRxByte();
}
Disable_DFLASH();
if((Idbuff[0] == 0x1f) && (Idbuff[1] == 0x28))
{
return 1;
}
else
{
return 0;
}
}
//=========================================================================================
//函数名称:
//输入:
//输出:
//函数功能:初始化DataFlash,检查制造ID,配置为1024字节每page,禁止扇区保护
//========================================================================================== |