石头的笔记--石头记 https://bbs.21ic.com/?581795 [收藏] [复制] [RSS]

日志

FM31256驱动程序

已有 1510 次阅读2010-11-1 12:13 |系统分类:存储器| FM31256

铁电存储器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;//端口初始状态
}


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)