基础版本

This commit is contained in:
bathfire
2026-04-27 16:55:02 +08:00
commit 64b3e488da
269 changed files with 383851 additions and 0 deletions
+347
View File
@@ -0,0 +1,347 @@
/*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));
// }
// }
// }
}
+95
View File
@@ -0,0 +1,95 @@
#ifndef _AT45DB_H_
#define _AT45DB_H_
/*H*****************************************************************************
* NAME: at45db.h
*******************************************************************************/
//*****************************************************************************
/*_____ M A C R O S __________________________________________________________*/
//端口定义
#define AT45DB_CS_EN GPIO_ResetBits(GPIOA, GPIO_Pin_4);GPIO_SetBits(GPIOA, GPIO_Pin_3);
#define AT45DB_CS_DIS GPIO_SetBits(GPIOA, GPIO_Pin_4);
//******************************************************************************
//
#define FLASH_APP_ADDR 0x08008000 //第一个应用程序起始地址(存放在FLASH)
#define RomUpDataAddr_Old 0
#define RomUpDataAddr_New 1024
#define FuniGlobal F_uniGlobal.u
//******************************************************************************
// AT45DB_DATA_MAP
#define checkLen_1 1 ///如果数据组带有校验,增加1byte
//存储器完好标致
///全局缓冲中的值
#define buf_ATDB45_Flag FuniGlobal.ATDB45_Flag
///结构体定义
#define ATDB45_Flag_FADR (0)
#define ATDB45_Flag_LEN (sizeof(buf_ATDB45_Flag) + checkLen_1)
#define ATDB45_Flag_Group 1 //组数
///全局缓冲中的值
#define buf_Frame FuniGlobal.Frame
///结构体定义
#define Frame_FADR (ATDB45_Flag_FADR + ATDB45_Flag_Group)
#define Frame_LEN sizeof(buf_Frame) + checkLen_1
#define Frame_Group 2048 //组数
///全局缓冲中的值
#define buf_PREXDATA FuniGlobal.PREXDATA
///结构体定义
#define PREXDATA_FADR (Frame_FADR + Frame_Group)
#define PREXDATA_LEN sizeof(buf_PREXDATA) + checkLen_1
#define PREXDATA_Group 2000 //组数
///全局缓冲中的值
#define buf_DeviceFrame FuniGlobal.Frame
///结构体定义
#define DeviceFrame_FADR (PREXDATA_FADR + PREXDATA_Group)
#define DeviceFrame_LEN sizeof(buf_DeviceFrame) + checkLen_1
#define DeviceFrame_Group 800*5 //组数
typedef struct
{
union
{
u8 Global[530]; //全局最大个数
u8 ATDB45_Flag;
u8 Frame[512];
PREXDATA_Type PREXDATA[5];
}u;
u8 CheckAdd;
}F_uniGlobal_Typedef; //存储器读写缓存共用体
typedef enum
{
CA_ATDB45_Flag,
CA_Frame,
CA_PREXDATA,
CA_DeviceFrame,
AT45DBItemEnd,
}AT45DBItem;
//********************************************************************************
typedef struct
{
u8* pInitData;//初始化指针
u8* upData; //共用体数据缓存区指针
u8* pData; //pGun数据指针
u32 firstAdr; //第一地址
u16 len; //长度
u16 Group;
u8 Tpye; //类型
}AT45DBDataIndex;
u8 AT45DBItemWrite(AT45DBItem Type, u16 Group);
u8 AT45DBItemRead(AT45DBItem Type, u16 Group);
void AT45DB_Data_Init(void);
void AT45DB_Init(void);
#endif