348 lines
9.3 KiB
C
348 lines
9.3 KiB
C
/*C*****************************************************************************
|
||
* NAME: at45db.c
|
||
*-------------------------------------------------------------------------------
|
||
* RELEASE:
|
||
* REVISION: 1.0
|
||
*-------------------------------------------------------------------------------
|
||
* PURPOSE:
|
||
* at45Db驱动。
|
||
*******************************************************************************/
|
||
/*_____ I N C L U D E S ______________________________________________________*/
|
||
#include "config.h" //全局声明
|
||
u8 FlashType = 0;
|
||
F_uniGlobal_Typedef F_uniGlobal;
|
||
#define Data_INIT
|
||
const u8 initATDB45_Flag = 0x38;
|
||
const PREXDATA_Type initPREXDATA = {0,0,0,0,0,0,0,0,0};
|
||
const AT45DBDataIndex AT45DBTab[20] =
|
||
{ ///FRAM数据1区(数据操作相对不频烦)
|
||
/// pInitData; upData pData firstAdr; len; Tpye; //(注意,校验增加在数据包尾)
|
||
{(u8*)&initATDB45_Flag, (u8*)(&buf_ATDB45_Flag), (u8*)(&TXHData.ATDB45_Flag), ATDB45_Flag_FADR, ATDB45_Flag_LEN, ATDB45_Flag_Group, CA_ATDB45_Flag},
|
||
{(u8*)&initATDB45_Flag, (u8*)(&buf_Frame), (u8*)(&TXHData.Frame), Frame_FADR, Frame_LEN, Frame_Group, CA_Frame},
|
||
{(u8*)&initPREXDATA, (u8*)(&buf_PREXDATA), (u8*)(&TXHData.PREXDATA), PREXDATA_FADR, PREXDATA_LEN, PREXDATA_Group, CA_PREXDATA},
|
||
{(u8*)&initATDB45_Flag, (u8*)(&buf_DeviceFrame), (u8*)(&TXHData.Frame), DeviceFrame_FADR, DeviceFrame_LEN, DeviceFrame_Group, CA_DeviceFrame},
|
||
};
|
||
|
||
////==============================================================================
|
||
|
||
/**
|
||
* @brief 对指定长度的数据区域进行校验和计算
|
||
*
|
||
* @param pData 指向数据区域的指针
|
||
* @param len 数据区域的长度
|
||
* @return u8 返回校验和结果
|
||
*/
|
||
u8 AT45DBDataCheck(volatile u8* pData, u16 len)
|
||
{
|
||
u8 result; // 校验和变量
|
||
result = *pData; // 初始化为第一个字节的值
|
||
while(len--)
|
||
{
|
||
result += *pData++; // 累加每个字节的值
|
||
}
|
||
return result; // 返回校验和结果
|
||
}
|
||
|
||
/****************************************************
|
||
函数名:AT45DB_SendByte
|
||
功能 :Flash存储部分用到的SPI发送函数
|
||
参数 :dt 要发送的数据
|
||
返回值:无
|
||
****************************************************/
|
||
u8 AT45DB_SendByte(u8 dt)
|
||
{
|
||
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
|
||
SPI_I2S_SendData(SPI1, dt);
|
||
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
|
||
return SPI_I2S_ReceiveData(SPI1);
|
||
}
|
||
|
||
//F*****************************************************************************
|
||
//* NAME: ReadDFStatus
|
||
//*-----------------------------------------------------------------------------
|
||
//* PURPOSE:
|
||
//* 读取45db状态
|
||
//*-----------------------------------------------------------------------------
|
||
//* PARAMS:
|
||
//* return: 如果返回值等0,说明驱动器错误
|
||
//*-----------------------------------------------------------------------------
|
||
//* NOTE:
|
||
//******************************************************************************
|
||
u8 ReadDFStatus (void)
|
||
{
|
||
u8 result;
|
||
CLI();
|
||
AT45DB_CS_EN;
|
||
AT45DB_SendByte(0xd7);
|
||
result = AT45DB_SendByte(0xff);//要读两次,不然要加10ms延时,暂时不知道为什么
|
||
//delay_ms(10);
|
||
AT45DB_CS_DIS;
|
||
SEI();
|
||
return result;
|
||
}
|
||
//F*****************************************************************************
|
||
//* NAME: ReadDriverID
|
||
//*-----------------------------------------------------------------------------
|
||
//* PURPOSE:
|
||
//* 读取45dbID 判断存储器类型
|
||
//*-----------------------------------------------------------------------------
|
||
//* PARAMS:
|
||
//* return: Drive ID(Byte 1)Family Code Density Code
|
||
// 0 0 1((AT45D) 0 0 1 0 0 (4-Mbit)
|
||
// 0 0 1((AT45D) 0 0 1 1 1 (32-Mbit)
|
||
//*-----------------------------------------------------------------------------
|
||
//* NOTE:
|
||
//******************************************************************************
|
||
u16 ii = 0;
|
||
u8 resultF = 0;
|
||
u8 ReadDriverID (void)
|
||
{
|
||
CLI();
|
||
for(ii = 0;ii < 200;ii ++)
|
||
{
|
||
if(ReadDFStatus() & 0x80)
|
||
break;
|
||
delay_ms(1);
|
||
}
|
||
if(ii < 200)
|
||
{
|
||
AT45DB_CS_EN;
|
||
AT45DB_SendByte(0x9F);
|
||
AT45DB_SendByte(0xFF);
|
||
resultF = AT45DB_SendByte(0xFF);
|
||
AT45DB_CS_DIS;
|
||
SEI();
|
||
return resultF;
|
||
}
|
||
SEI();
|
||
return 0;
|
||
}
|
||
u8 AT45DB_SetPageByte (void)
|
||
{
|
||
CLI();
|
||
for(ii = 0;ii < 200;ii ++)
|
||
{
|
||
if(ReadDFStatus() & 0x80)
|
||
break;
|
||
delay_ms(1);
|
||
}
|
||
if(ii < 200)
|
||
{
|
||
AT45DB_CS_EN;
|
||
AT45DB_SendByte(0x3D);
|
||
AT45DB_SendByte(0x2A);
|
||
AT45DB_SendByte(0x80);
|
||
AT45DB_SendByte(0xA7);//A6:512;A7:528
|
||
AT45DB_CS_DIS;
|
||
SEI();
|
||
return 1;
|
||
}
|
||
SEI();
|
||
return 0;
|
||
}
|
||
u8 AT45DB_WriteBuff(u8 *Buff,u16 Len)
|
||
{
|
||
u16 i = 0;
|
||
CLI();
|
||
for(ii = 0;ii < 200;ii ++)
|
||
{
|
||
if(ReadDFStatus() & 0x80)
|
||
break;
|
||
delay_ms(1);
|
||
}
|
||
if(ii < 200)
|
||
{
|
||
AT45DB_CS_EN;
|
||
AT45DB_SendByte(0x84);
|
||
AT45DB_SendByte(0x00);
|
||
AT45DB_SendByte(0x00);
|
||
AT45DB_SendByte(0x00);
|
||
for(i = 0;i < Len;i ++)
|
||
AT45DB_SendByte(*(Buff + i));
|
||
AT45DB_CS_DIS;
|
||
SEI();
|
||
return 1;
|
||
}
|
||
SEI();
|
||
return 0;
|
||
}
|
||
|
||
u8 AT45DB_WritePage(u8 *Buff,u16 Page,u16 Len)//len = 10,79us
|
||
{
|
||
CLI();
|
||
if(AT45DB_WriteBuff(Buff,Len) == 0)
|
||
return 0;
|
||
for(ii = 0;ii < 200;ii ++)
|
||
{
|
||
if(ReadDFStatus() & 0x80)
|
||
break;
|
||
delay_ms(1);
|
||
}
|
||
if(ii < 200)
|
||
{
|
||
AT45DB_CS_EN;
|
||
AT45DB_SendByte(0x83);
|
||
AT45DB_SendByte((u8)(Page >> 6));
|
||
AT45DB_SendByte((u8)(Page << 2));
|
||
AT45DB_SendByte(0x00);
|
||
AT45DB_CS_DIS;
|
||
|
||
SEI();
|
||
return 1;
|
||
}
|
||
SEI();
|
||
return 0;
|
||
}
|
||
|
||
u8 AT45DB_ReadPage(u8 *Buff,u16 Page,u16 Len)//len = 10,75us
|
||
{
|
||
u16 i = 0;
|
||
CLI();
|
||
for(ii = 0;ii < 200;ii ++)
|
||
{
|
||
if(ReadDFStatus() & 0x80)
|
||
break;
|
||
delay_ms(1);
|
||
}
|
||
if(ii < 200)
|
||
{
|
||
AT45DB_CS_EN;
|
||
AT45DB_SendByte(0xE8);
|
||
AT45DB_SendByte((u8)(Page >> 6));
|
||
AT45DB_SendByte((u8)(Page << 2));
|
||
AT45DB_SendByte(0x00);
|
||
for(i = 0;i < 4;i ++)
|
||
AT45DB_SendByte(0x00);
|
||
for(i = 0;i < Len;i ++)
|
||
*(Buff + i) = AT45DB_SendByte(0xff);
|
||
AT45DB_CS_DIS;
|
||
SEI();
|
||
return 1;
|
||
}
|
||
SEI();
|
||
return 0;
|
||
}
|
||
void AT45DB_Data_Init(void)
|
||
{
|
||
volatile u16 i = 0,j = 0,Item = 0;
|
||
u8 Temp_Buff[660];
|
||
u8 Temp = 0;
|
||
for(Item = 0;Item< FramItemEnd;Item ++)
|
||
{
|
||
for(i = 0;i < AT45DBTab[Item].Group;i ++)
|
||
{
|
||
for(j = 0;j < AT45DBTab[Item].len - checkLen_1;j ++)
|
||
Temp_Buff[j] = *(AT45DBTab[Item].upData + j) = *(AT45DBTab[Item].pInitData+j);
|
||
Temp_Buff[AT45DBTab[Item].len - checkLen_1] = AT45DBDataCheck(Temp_Buff,AT45DBTab[Item].len - checkLen_1);
|
||
AT45DB_WritePage(Temp_Buff,AT45DBTab[Item].firstAdr + i,AT45DBTab[Item].len);
|
||
}
|
||
}
|
||
// __set_FAULTMASK(1);
|
||
// NVIC_SystemReset();
|
||
}
|
||
u8 AT45DBItemWrite(AT45DBItem Type, u16 Group)
|
||
{
|
||
u16 i = 0,j = 0,k = 0;
|
||
u8 Temp_Buff[660];
|
||
u8 Temp = 0;
|
||
if(Group >= AT45DBTab[Type].Group)
|
||
return 0;
|
||
for(i = 0;i < AT45DBTab[Type].len - checkLen_1;i ++)
|
||
{
|
||
*(AT45DBTab[Type].upData + i) = *(AT45DBTab[Type].pData + i);
|
||
Temp_Buff[i] = *(AT45DBTab[Type].upData + i);
|
||
}
|
||
Temp_Buff[AT45DBTab[Type].len - checkLen_1] = AT45DBDataCheck(Temp_Buff,AT45DBTab[Type].len - checkLen_1);
|
||
for(j = 0;j < 6;j ++)
|
||
{
|
||
AT45DB_WritePage(Temp_Buff,AT45DBTab[Type].firstAdr + Group,AT45DBTab[Type].len);
|
||
|
||
if(AT45DBItemRead(Type,Group) == 1)
|
||
{
|
||
return 1;
|
||
}
|
||
delay_ms(100);
|
||
}
|
||
// TXHData.ErrState.Flag.e_errFlashParameter = 1;
|
||
return 0;
|
||
}
|
||
u8 CRCTemp = 0;
|
||
u8 AT45DBItemRead(AT45DBItem Type, u16 Group)
|
||
{
|
||
volatile u16 i = 0,j = 0;
|
||
u8 Temp_Buff[660];
|
||
u8 Temp_Buff1[660];
|
||
|
||
u8 CRCTemp1 = 0;
|
||
|
||
if(Group >= AT45DBTab[Type].Group)
|
||
return 0;
|
||
for(j = 0;j < 6;j ++)
|
||
{
|
||
AT45DB_ReadPage(FuniGlobal.Global,AT45DBTab[Type].firstAdr + Group,AT45DBTab[Type].len);
|
||
for(i = 0;i < AT45DBTab[Type].len;i ++)
|
||
*(Temp_Buff+i) = *(AT45DBTab[Type].upData+i);
|
||
CRCTemp = AT45DBDataCheck(Temp_Buff,AT45DBTab[Type].len - checkLen_1);
|
||
if(CRCTemp == Temp_Buff[AT45DBTab[Type].len - checkLen_1])
|
||
{
|
||
for(i = 0;i < AT45DBTab[Type].len - checkLen_1;i ++)
|
||
*(AT45DBTab[Type].pData+i) = *(AT45DBTab[Type].upData+i);
|
||
return 1;
|
||
}
|
||
delay_ms(100);
|
||
}
|
||
// pGun.ErrState.Flag.e_errFlashParameter = 1;
|
||
return 0;
|
||
}
|
||
u8 ExChangeByte(u8 data)
|
||
{
|
||
u8 Temp = 0;
|
||
Temp = data;
|
||
data = (Temp >> 4) | (Temp << 4);
|
||
return data;
|
||
}
|
||
u8 NotByte(u8 data)
|
||
{
|
||
if(data == 0 || data == 0xff)
|
||
return data;
|
||
else
|
||
return ~data;
|
||
}
|
||
|
||
void AT45DB_Init(void)
|
||
{
|
||
volatile u16 Frame = 0;
|
||
u8* pBuff;
|
||
u8 Temp_Buff[660];
|
||
FlashType = ReadDriverID();
|
||
AT45DB_SetPageByte();
|
||
switch(FlashType)
|
||
{
|
||
case 0x24: TXHData.ATDB45Type = At45DB041;break;
|
||
case 0x27: TXHData.ATDB45Type = At45DB321;break;
|
||
case 0x28: TXHData.ATDB45Type = At45DB641;break;
|
||
}
|
||
// if(SWF8 == SWF_ON)
|
||
// {
|
||
// if(TXHData.ATDB45Type >= At45DB321)
|
||
// {
|
||
// for(Frame = 0;Frame < 1024;Frame ++)
|
||
// {
|
||
// ReadFlashNx512Btye(&TXHData.Frame[0],FLASH_APP_ADDR + Frame *512);
|
||
// switch(Frame%8)
|
||
// {
|
||
// case 0:TXHData.Frame[2] = ExChangeByte(TXHData.Frame[2]);
|
||
// TXHData.Frame[54] = NotByte(TXHData.Frame[54]);
|
||
// TXHData.Frame[288] = ExChangeByte(TXHData.Frame[288]);GPIO_SetBits(GPIOE,GPIO_Pin_2);break;
|
||
// case 1:TXHData.Frame[469] = NotByte(TXHData.Frame[469]);break;
|
||
// case 2:TXHData.Frame[104] = ExChangeByte(TXHData.Frame[104]);break;
|
||
// case 3:break;
|
||
// case 4:TXHData.Frame[0] = NotByte(TXHData.Frame[0]);break;
|
||
// case 5:TXHData.Frame[253] = ExChangeByte(TXHData.Frame[253]);GPIO_ResetBits(GPIOE,GPIO_Pin_2);break;
|
||
// }
|
||
// AT45DBItemWrite(CA_Frame,Frame + (TXHData.ROM_UpData.ROM_UpData_State.RomAddrNow * 1024));
|
||
// }
|
||
// }
|
||
// }
|
||
}
|