⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fm25040.c

📁 FM25040铁电存储器的C51操作函数
💻 C
字号:
/********************************************************/
/* 硬件操作程序						*/
/* MCU 型号: upsd32xx					*/
/* MCU时钟频率:  22.1184MHz				*/
/* 开发环境: Keil C51 V7.09				*/
/* 开发日期: 2004.03.9-					*/
/* 程序编写: jl_mx					*/
/********************************************************/
#include "common.h"
#ifndef _UPSD_H_
	#include <at89x52.h>
#endif
#include "absacc.h"
#include <stdio.h>
#include <intrins.h>

//#define CS25040		XBYTE[0X0303]			//FM25040的片选
#define DLT	5

 #define	CS CS25040
 sbit SO=P4^5;             /*FM25040输出 pin 2*/
 sbit SI=P3^5;             /*FM25040输入 pin 5*/
 sbit SCK=P4^7;            /*FM25040时钟 pin 6*/
 unsigned char code WREN_INST=0X06; /* Write enable latch instruction (WREN)*/
 unsigned char code WRDI_INST=0X04; /* Write disable latch instruction (WRDI)*/
 unsigned char code WRSR_INST=0X01; /* Write status register instruction (WRSR)*/
 unsigned char code RDSR_INST=0X05; /* Read status register instruction (RDSR)*/
 unsigned char code WRITE_INST=0X02; /* Write memory instruction (WRITE)*/
 unsigned int code BYTE_ADDR=0X55; /* Memory address for byte mode operations*/
 unsigned char code BYTE_DATA=0X11; /*Data byte for byte write operation*/
 unsigned int  code PAGE_ADDR=0X1F; /* Memory address for page mode operations*/
									 /*页面写入的其始地址*/
 unsigned char code PAGE_DATA1=0X22; /* 1st data byte for page write operation*/
 unsigned char code PAGE_DATA2=0X33; /* 2nd data byte for page write operation*/
 unsigned char code PAGE_DATA3=0X44; /* 3rd data byte for page write operation*/

 unsigned char code INIT_STATE=0x09; /* Initialization value for control ports*/
 unsigned int code SLIC=0x30; /* Address location of SLIC*/
 void wren_cmd(uchar chipsel);/*写使能子程序*/
 void wrdi_cmd(uchar chipsel);/*写使能复位*/
 void wrsr_cmd(uchar chipsel);/*复位时间位和数据保护位写入状态寄存器*/
 unsigned char rdsr_cmd(uchar chipsel);/*读状态寄存器*/
 void sequ_write(uchar chipsel,char *ptr,uint addr,uint length);
 void sequ_read(uchar chipsel,unsigned char *data_restore_addr,unsigned int read_start_addr,unsigned int read_length);
 void outbyt(unsigned char aa);/*输出一个字节到FM25040中,不包括先导字等*/
 unsigned char inputbyt();/*由FM25040输入一个字节,不包括先导字等额外的东西*/

char dtimer=1;

/*FM25040操作子程序集*/
void delayus(uchar dt)
{
	while(dt)dt--;
}

/*写使能子程序*/
void wren_cmd(uchar chipsel)
{
 unsigned char data aa;
 SCK=0;/* Bring SCK low */
 CS=chipsel;/* Bring /CS low */
 delayus(dtimer);
 aa=WREN_INST;
 outbyt(aa);/* Send WREN instruction */
 SCK=0;/* Bring SCK low */
 CS=0xff;/* Bring /CS high */
}


/*写使能复位子程序*/
void wrdi_cmd(uchar chipsel)
{
 unsigned char aa;
 SCK=0;/* Bring SCK low */
 CS=chipsel;/* Bring /CS low */
 delayus(dtimer);
 aa=WRDI_INST;
 outbyt(aa);/* Send WRDI instruction */
 SCK=0;/* Bring SCK low */
 CS=0xff;/* Bring /CS high */
}

/*写状态寄存器子程序*/
void wrsr_cmd(uchar chipsel)
{
 unsigned char aa;
 wren_cmd(chipsel);
 SCK=0;/* Bring SCK low */
 CS=chipsel;/* Bring /CS low */
 delayus(dtimer);
 aa=WRSR_INST;
 outbyt(aa) ;/* Send WRSR instruction */
 aa=STATUS_REG;
 outbyt(aa);/* Send status register */
 SCK=0;/* Bring SCK low */
 CS=0xff;/* Bring /CS high */
}

/*读状态寄存器,读出的数据放入到aa中*/
unsigned char rdsr_cmd (uchar chipsel)
{
 unsigned char aa;
 SCK=0;
 CS=chipsel;
 delayus(dtimer);
 aa=RDSR_INST;
 outbyt(aa);
 aa=inputbyt();
 SCK=0;
 CS=0xff;
 return aa;
}

/*连续写入,其中
chipsel:片选地址
*ptr:源数据地址
length: 数据长度
addr:	写入的首地址
*/
void sequ_write(uchar chipsel,char *ptr,uint addr,uint length)
{uint i;
 wren_cmd(chipsel);
 SCK=0;
 CS=chipsel;
 delayus(dtimer);
 outbyt(((unsigned char)(addr>>5)&0x8)|WRITE_INST);/* Send WRITE instruction inclu
ding MSB of address */
 /*将高位地址左移3位与写入先导字相或,得到正确的先导字写入FM25040*/
 outbyt((unsigned char)(addr));
 /*写入低位地址到FM25040*/
 for(i=0;i<length;i++){
  outbyt(*ptr++);
 }
 SCK=0;
 CS=0xff;
}

//连续读出
//*data_restore_addr 读出数据的存放首地址
//read_start_addr 读取开始地址
//read_length 要读取得字节长度
void sequ_read(uchar chipsel,unsigned char *data_restore_addr,unsigned int read_start_addr,unsigned int read_length)
{unsigned int data i;
 SCK=0;
 CS=chipsel;
 delayus(dtimer);
  /*将高位地址左移3位与读出先导字相或,得到正确的先导字写入FM25040*/
 outbyt(((unsigned char)(read_start_addr>>5)&0x8)|READ_INST);
  /*输出低位地址到FM25040*/
 outbyt((unsigned char)(read_start_addr));
 for (i=0;i<read_length;i++)
 {
  *data_restore_addr++=inputbyt();
 }
 SCK=0;
 CS=0xff;
}
/*输出一个数据到FM25040,此数据可能为地址,先导字,写入的数据等*/
void outbyt(unsigned char aa)
{
 unsigned char my_flag1,i;
 for (i=0;i<8;i++)
 {
   my_flag1=aa;
   SCK=0;
   SI=((0x80&(my_flag1<<i))==0x80);
   SCK=1;
  }
 SI=0;/*使SI处于确定的状态*/
}

/*得到一个数据,此数据可能为状态寄存器数据,读出的单元数据等*/
unsigned char inputbyt(void)
{
 unsigned char aa,my_flag;
 char i;
 SO=1; aa=0;
 for (i=0;i<8;i++)
 {
   SCK=0;
   my_flag=(unsigned char)(SO);
   SCK=1;
   aa=((aa<<1)|my_flag);
   my_flag=0x00;
 }
 return aa;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -