📄 fm25040.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 + -