||
铁电存储器FM31256全部驱动程序。已实际工程应用,如有问题可讨论。
//文件说明:FM31256.h
#ifndef FM31256_H
#define FM31256_H
#include"main.h"
#define SCL P2_4
#define SDA P2_5
extern void Set_Realtime(uint8 *realtime);//时间格式:低字节--高字节 秒,分,时,星期,日,月,年。
extern void Get_Realtime(uint8 *realtime);
extern void WatchDog_Enable(uint8 timer);
extern void WatchDog_Clear(void); //喂狗
extern void WatchDog_Disable(void);
extern void WriteFRAM(uint16 Address,uint8 Wdata);
extern uint8 ReadFRAM(uint16 Address);
extern void Fm31256_init(void);
#endif
//文件说明:FM31256.c
#include"fm31256.h"
#define IIC_WRITE 0xa0 //芯片引脚可选硬件地址均为0
#define IIC_READ 0xa1 //芯片引脚可选硬件地址均为0
#define REG_READ 0Xd1 //register read //芯片引脚可选硬件地址均为0
#define REG_WRITE 0Xd0 //register write//芯片引脚可选硬件地址均为0
static void Start(void)
{
SDA=1;
SCL=1;
SDA=0; //SDA下降沿,SDL=1时开始
}
static void Stop(void)
{
SDA=0;
SCL=1; //高电平
SDA=1; //上升沿
}
static void Ack(void)
{
uint8 i;
SCL = 1;
i= 1000;
SDA=1;
while((i--)&&SDA);
SCL = 0;
}
static void WriteByte(uint8 w_data)
{
uint8 i;
SCL=0;
for(i=0;i<8;i++)
{
if(w_data & (0x80>>i))
{
SDA=1;
SCL=1; //高电平数据有效
SCL=0;
}
else
{
SDA=0;
SCL=1; //高电平数据有效
SCL=0;
}
}
}
static uint8 ReadByte(void)
{
uint8 get_value,i;
get_value=0;
SCL=0;
for(i=0;i<8;i++)
{
SDA=1;
SCL = 1;
get_value <<= 1;//首先接收到的为最高位
if(SDA==1)get_value += 1;
SCL = 0;
}
return get_value;
}
static void WriteReg(uint8 RegAdd,uint8 Wdata)
{
Start();
WriteByte(REG_WRITE);
Ack();
RegAdd = RegAdd & 0x1f;
WriteByte(RegAdd);
Ack();
WriteByte(Wdata);
Ack();
Stop();
}
static uint8 ReadReg(uint8 RegAdd)
{
uint8 RetValue;
Start();
WriteByte(REG_WRITE);
Ack();
WriteByte(RegAdd);
Ack();
Start();
WriteByte(REG_READ);
Ack();
RetValue = ReadByte();
SCL = 1; SDA = 1;SCL = 0;
Stop();
return RetValue;
}
/*******************************************************************************
* Name : ReadFRAM
* Deion : set IWDG
* Input : 地址范围:0-32767共32KB
* Return : 读取的存储器的内容
*******************************************************************************/
uint8 ReadFRAM(uint16 Address)
{
uint8 RetValue;
Start();
WriteByte(IIC_WRITE);
Ack();
WriteByte((uint8)(Address>>8));
Ack();
WriteByte((uint8)(Address));
Ack();
Start();
WriteByte(IIC_READ);
Ack();
RetValue = ReadByte();
SCL = 1;SDA = 1;SCL = 0;
Stop();
return RetValue;
}
/*******************************************************************************
* Name : WriteFRAM
* Deion : 向铁电存储器中写入数据
* Input : Address:地址范围:0-32767共32KB,Wdata:byte
* Return : None.
*******************************************************************************/
void WriteFRAM(uint16 Address,uint8 Wdata)
{
Start();
WriteByte(IIC_WRITE);
Ack();
WriteByte((uint8)(Address>>8));
Ack();
WriteByte((uint8)(Address));
Ack();
WriteByte(Wdata);
Ack();
Stop();
}
/*******************************************************************************
* Name : Set_Realtime
* Deion : 设置处理器伴侣中的实时时间
* Input : realtime.
* Return : None.
*******************************************************************************/
void Set_Realtime(uint8 *realtime)//时间格式:低字节--高字节 秒,分,时,星期,日,月,年。
{
uint8 i;
WriteReg(0x00,0x00); //程序冗余
WriteReg(0x00,0x02); //冻结用户寄存器
for(i=0;i<7;i++)WriteReg(0x02+i,realtime);
WriteReg(0x00,0x00); //向芯片更新时间
}
/*******************************************************************************
* Name : Get_Realtime
* Deion : 获取处理器伴侣中的实时时间
* Input : None.
* Return : realtime.
*******************************************************************************/
void Get_Realtime(uint8 *realtime)//时间格式:低字节--高字节 秒,分,时,星期,日,月,年。
{
uint8 i;
WriteReg(0x00,0x00); //程序冗余
WriteReg(0x00,0x01); //冻结用户寄存器
for(i=0;i<7;i++)realtime=ReadReg(0x02+i);
WriteReg(0x00,0x00); //芯片时间更新至用户寄存器
}
/*******************************************************************************
* Name : WatchDog_Enable
* Deion : 看门狗使能
* Input : timer:看门狗定时值(0-31)step:100ms
* Return : None.
*******************************************************************************/
void WatchDog_Enable(uint8 timer)
{
timer=timer | 0x80; //看门狗使能
WriteReg(0x0A,timer); //重置看门狗计数器的数值
}
/*******************************************************************************
* Name : WatchDog_Clear
* Deion : 喂狗.
* Input : None.
* Return : None.
*******************************************************************************/
void WatchDog_Clear(void)
{
WriteReg(0x09,0x0A); //喂狗
}
/*******************************************************************************
* Name : WatchDog_Disable
* Deion : 关闭开门狗.
* Input : None.
* Return : None.
*******************************************************************************/
void WatchDog_Disable(void)
{
WriteReg(0x0A,0x00);
}
/*******************************************************************************
* Name : Fm31256_init
* Deion : 初始化,可不用.
* Input : None.
* Return : None.
*******************************************************************************/
void Fm31256_init(void)
{
SDA=1;//端口初始状态
SCL=1;//端口初始状态
}