Files
TXH1.0/User/AT45DB/at45db.c
T
2026-04-27 16:55:02 +08:00

348 lines
9.3 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*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));
// }
// }
// }
}