📄 c5045.c
字号:
/*5045的底层操作程序*/
#include <stdio.h>
#include <intrins.h>
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define WREN_INST 0x06 /*写使能控制字 Write enable latch instruction (WREN)*/
#define WRDI_INST 0x04 /*写禁能控制字 Write disable latch instruction (WRDI)*/
#define WRSR_INST 0x01 /*写状态寄存器控制字 Write status register instruction (WRSR)*/
#define RDSR_INST 0x05 /*读状态寄存器控制字 Read status register instruction (RDSR)*/
#define WRITE_INST 0x02 /*写存储器控制字 Write memory instruction (WRITE)*/
#define READ_INST 0x03 /*读存储器控制字 Read memory instruction (READ)*/
#define MAX_POLL 0x99 /*最大查询周期控制字 Maximum number of polls*/
#define WDT020 0x20 /*看门狗超时周期200ms*/
#define WDT060 0x10 /*看门狗超时周期600ms*/
#define WDT140 0x00 /*看门狗超时周期1400ms*/
#define WDT000 0x30 /*关闭看门狗*/
#define BP0 0x00 /*没有保护的空间*/
#define BP1 0x40 /*保护0180--01ff*/
#define BP2 0x80 /*保护0100--01ff*/
#define BP3 0xc0 /*保护0000--01ff*/
/******************************************/
/*定义对5045的操作方式*/
/******************************************/
#define CONTROL1 WDT000|BP0 /*实际控制值一(关闭看门狗 没有保护的空间)*/
#define CONTROL2 WDT140|BP3 /*实际控制值二(看门狗超时周期1400ms 保护0000--01ff)*/
#define CONTROL3 WDT140|BP0 /*实际控制值三(看门狗超时周期1400ms 没有保护的空间)*/
/******************************************/
/*定义管脚*/
sbit SCK = P1^2; /*时钟*/
sbit SI = P1^3; /*CPU--->5045*/
sbit SO = P1^1; /*5045-->CPU*/
sbit CS = P1^0; /*片选*/
/*
extern uchar Byte_Read(uint e2_add);
extern void Byte_Write(uint e2_add,uchar a);
extern void Page_Write_FromIdata(uint e2_add,uchar idata *pt);
extern void Sequ_Read_ToIdata(uint e2_add,uchar idata *pt,uint data_amount);
extern void Wrdi_Cmd(void);
extern void Wrsr_Cmd(uchar control_Byte);
static uchar InByte(void);
static void OutByte(uchar ch);
static void Pre_Read(uint c1);
static uchar Rdsr_cmd(void);
static void Pre_Write(uint c1);
static void Wip_Poll(void);
static void Wren_Cmd(void);
*/
/*******************************************/
/*输出一个字节 */
/*入口:一个uchar形变量 */
/*出口:无 */
/******************************************/
static void OutByte(uchar ch)
{
uchar i=8;
do
{
SCK=0;
SI=(bit)(ch&0x80); /*强制取为位变量,输出*/
ch=ch<<1; /*右移一位*/
SCK=1;
}
while(--i);
SI=0;
}
/******************************************/
/*输入一个字节 */
/*入口:没有入口 */
/*出口:一个uchar形变量 */
/******************************************/
static uchar InByte(void)
{
uchar i,a=0;
SO=1;
for (i=8;i>0;i--)
{
SCK=1;
SCK=0;
a<<=1;
if(SO)
a|=0x01;
}
return(a);
}
/*****************************************/
/*读状态寄存器 */
/*入口:无 */
/*出口:寄存器状态 */
/*****************************************/
static uchar Rdsr_cmd(void)
{
uchar a;
SCK=0;
CS=0;
OutByte(RDSR_INST); /*发出读寄存器命令*/
a=InByte(); /*读入*/
SCK=0;
CS=1;
return(a);
}
/*****************************************/
/*测试写周期是否结束,超时后测试不成功也返回 */
/*入口:无 */
/*出口:无 */
/*****************************************/
static void Wip_Poll(void)
{
uchar temp,i=MAX_POLL;
do
{
temp=Rdsr_cmd();
ACC=temp;
if(!(ACC&0x01))
break; /*结束后返回*/
}
while(--i); /*超时也返回*/
}
/*****************************************/
/*设置写使能,在执行写入操作之前要先将写使能控制位置位*/
/*入口:无*/
/*出口:无*/
/******************************************/
static void Wren_Cmd(void)
{
SCK=0;
CS=0;
OutByte(WREN_INST);
SCK=0;
CS=1;
}
/*****************************************/
/*写禁能,在非正常的操作中断后,主程序在初始化时最好执行一次此操作*/
/*入口:无*/
/*出口:无*/
/*****************************************/
extern void Wrdi_Cmd(void)
{
SCK=0;
CS=0;
OutByte(WRDI_INST);
SCK=0;
CS=1;
}
/*****************************************/
/*写状态寄存器*/
/*入口:控制字*/
/*出口:无*/
/*****************************************/
extern void Wrsr_Cmd(uchar control_Byte)
{
Wren_Cmd();
SCK=0;
CS=0;
OutByte(WRSR_INST);
OutByte(control_Byte);
SCK=0;
CS=1;
Wip_Poll();
}
/*****************************************/
/*写入数据之前的预操作*/
/*入口:5045的地址*/
/*出口:无*/
/*****************************************/
static void Pre_Write(uint c1)
{
Wren_Cmd();
SCK=0;
CS=0;
OutByte(WRITE_INST|(0x08&((uchar)(c1/256))<<3)); /*将地址的第9位(D9)传送到命令字中,随命令字一起发出*/
OutByte((uchar)c1); /*发送地址的低8位*/
}
/*****************************************/
/*写入一字节*/
/*入口:5045的地址,待写数据*/
/*出口:无*/
/*****************************************/
extern void Byte_Write(uint e2_add,uchar a)
{
Pre_Write(e2_add); /*预操作*/
OutByte(a); /*发出数据*/
SCK=0;
CS=1;
Wip_Poll(); /*等待写入操作完成*/
}
/*****************************************/
/*写入1页,数据来源:内部的RAM*/
/*入口:5045的地址,指向内部RAM的指针*/
/*出口:无*/
/*****************************************/
//extern void Page_Write_FromIdata(uint e2_add,uchar idata *pt)
//{
// uchar i;
// Pre_Write(e2_add); /*预写*/
// for (i=16;i>0;--i,pt++) /*连续写入16字节(5045一页为16字节)*/
// OutByte(*pt);
// SCK=0;
// CS=1;
// Wip_Poll(); /*等待写入操作完成*/
//}
/*****************************************/
/*写入1页,数据来源:外部的RAM*/
/*入口:5045的地址,指向外部RAM的指针*/
/*出口:无*/
/*****************************************/
/*extern void Page_Write_FromXdata(uint e2_add,uchar xdata *pt)
{
uchar i;
Pre_Write(e2_add); /*预写*/
/* for (i=16;i>0;--i,pt++) /*连续写入16字节(5045一页为16字节)*/
/* OutByte(*pt);
SCK=0;
CS=1;
Wip_Poll(); /*等待写入操作完成*/
/*}
/*****************************************/
/*读数据之前的预操作*/
/*入口:5045的地址*/
/*出口:无*/
/*****************************************/
static void Pre_Read(uint c1)
{
SCK=0;
CS=0;
OutByte(READ_INST|(0x08&((uchar)(c1/256))<<3)); /*将地址的第9位(D9)传送到命令字中,随命令字一起发出*/
OutByte((uchar)c1); /*发送地址的低8位*/
}
/*****************************************/
/*从5045的指定地址读出1字节*/
/*入口:5045的地址*/
/*出口:数据*/
//*****************************************/
extern uchar Byte_Read(uint e2_add)
{
uchar a;
Pre_Read(e2_add); /*预读取*/
a=InByte(); /*读出数据*/
SCK=0;
CS=1;
return(a);
}
/*****************************************/
/*从5045连续读取数据.数据存放:内部的RAM*/
/*入口:5045的地址,指向内部RAM的指针,数据的个数*/
/*出口:无*/
/*****************************************/
//extern void Sequ_Read_ToIdata(uint e2_add,uchar idata *pt,uint data_amount)
//{
// uint i;
// Pre_Read(e2_add); /*预读取*/
// for (i=data_amount;i>0;--i,pt++)
// *pt=InByte(); /*读出数据*/
// SCK=0;
// CS=1;
//}
/*****************************************/
/*从5045连续读取数据.数据存放:外部的RAM*/
/*入口:5045的地址,指向外部RAM的指针,数据的个数*/
/*出口:无*/
/*****************************************/
/*extern void Sequ_Read_ToXdata(uint e2_add,uchar xdata *pt,uchar data_amount)
{
uchar i;
Pre_Read(e2_add);
for (i=data_amount;i>0;--i,pt++)
*pt=InByte();
SCK=0;
CS=1;
}
/*****************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -