ShipCentralControl/Anjiehui7_DTU/User/spi_FRam.h

128 lines
3.6 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.

/*
*********************************************************************************************************
* IAR Development Kits
* on the
*
* M451
*
* Filename : spi_fram.h
* Version : V1.00
* Programmer(s) : Qian Xianghong
*********************************************************************************************************
*/
#ifndef USER_SPI_FRAM_PRESENT
#define USER_SPI_FRAM_PRESENT
#include "type.h"
// FRAM存储规划如下
// 0~21: 升级进度记录含标志位、CRC等)
// 22~4117: 最近的升级数据4K缓存还未写入SFlash中
// 4118~4129: SFLASH和FRAM一致性标识记录含标志位、CRC等
// 4130~4141: 保留
// 4142~4153: SLFASH的历史数据记录含标志位、CRC等),因为要频繁擦写,故放在铁电里
// 4154~4165: SLFASH的历史数据上传记录含标志位、CRC等),因为要频繁擦写,故放在铁电里
// 4166~4171: 储罐档案总数含标志位、CRC等
// 4172~12363: 储罐档案共512条因为要频繁擦写故放在铁电里512x16=8K
// 12364~12369: 储罐扩展档案总数含标志位、CRC等
// 12370~24657: 储罐扩展档案共512条因为要频繁擦写故放在铁电里512x24=12K/
// 24658~24679: 最近一次定位的GPS记录含标志位、CRC等
// 24680~32767: 保留共8088字节
// 存储起始地址
#define FRAM_UPGRADE_INFO_BASE 0
#define FRAM_UPGRADE_DATA_BASE 22
#define FRAM_SFLASH_VALID_INFO_BASE 4118
#define FRAM_DATA_INFO_BASE 4142
#define FRAM_TRAN_INFO_BASE 4154
#define FRAM_BOTTLE_INFO_BASE 4166
#define FRAM_BOTTLE_DATA_BASE 4172
#define FRAM_BOX_INFO_BASE 12364
#define FRAM_BOX_DATA_BASE 12370
#define FRAM_GPS_INFO_BASE 24658
#define FRAM_BOTTLE_COUNT 512
#define FRAM_BOX_COUNT 512
// 铁电存储容量: 32K bytes
#define FRAM_SIZE 32768ul
// 初始化引脚
// 打开设备和允许中断
void FRAM_Open();
void FRAM_ReadID();
uint8_t FRAM_WriteEN();
uint16_t FRAM_BufferWrite(uint32_t Addr, uint8_t *buf, uint32_t nbytes);
uint16_t FRAM_BufferRead(uint32_t Addr, uint8_t *buf, uint32_t nbytes);
uint32_t FRAM_BufferVerify(uint32_t Addr, uint8_t *buf, uint32_t nbytes);
void FRAM_Sleep(uint8_t sleep);
// 允许匿名结构
#pragma anon_unions
#pragma pack(push, 1)
typedef struct
{
uint16_t check; // 标志位必须为0x55AA
volatile int32_t rdPtr;
volatile int32_t wtPtr;
uint16_t crc; // 校验位
} loopbuff_info_t;
typedef struct
{
loopbuff_info_t info;
uint16_t itemSize;
int32_t maxItemCount;
uint32_t info_base;
union
{
uint32_t data_base;
uint8_t *data;
};
} loopbuff_t;
// 在FRAM和SFLASH中写入相同记录标识铁电和SFlash的对应关系。
// 一旦检测到两者记录不一致或者任一方的记录非法则SFlash中存储的记录无效。
typedef struct
{
uint16_t check; // 标志位必须为0x55AA
uint32_t relative_time; // 获取到系统时间的相对时间
uint32_t offset_seconds; // 获取到系统时间的时基偏移
uint16_t crc; // 校验位
} fram_sflash_valid_t;
#pragma pack(pop)
// 循环缓冲实现部分
void LoopBuff_Create(loopbuff_t *lpbuf, uint16_t itemSize, int32_t maxItemCount, uint32_t info_base, uint32_t data_base);
void LoopBuff_Clear(loopbuff_t *lpbuf);
uint32_t LoopBuff_GetCount(loopbuff_t *lpbuf);
uint32_t LoopBuff_GetNextPtr(loopbuff_t *lpbuf, uint32_t ptr);
void LoopBuff_PutItem(loopbuff_t *lpbuf, uint8_t *item);
void LoopBuff_RemoveItems(loopbuff_t *lpbuf, uint32_t count);
uint32_t LoopBuff_GetDataPos(loopbuff_t *lpbuf, uint32_t ptr);
uint8_t *LoopBuff_GetDataPtr(loopbuff_t *lpbuf, uint32_t ptr);
// 从FRAM读取记录前面2个字节为标志0x55AA最后两个字节为crc
uint32_t FRAM_LoadInfo(uint32_t Addr, uint8_t *buf, uint32_t nbytes);
// 保存记录到FRAM中前面2个字节为标志0x55AA最后两个字节为crc
uint32_t FRAM_SaveInfo(uint32_t Addr, uint8_t *buf, uint32_t nbytes);
#endif