📄 wl008.c
字号:
********************************************************************************
* Descriptoon: *
* X5054读写演示程序 *
* *
* *
* *
*******************************************************************************/
#include <reg51.h>
#include <intrins.h>
sbit CS = P1^4;
sbit SI = P1^2;
sbit SCK = P1^0;
sbit SO = P1^3;
#define WREN_INST 0x06 // 写入使能指令(WREN)
#define WRDI_INST 0x04 // 写入禁止指令(WRDI)
#define WRSR_INST 0x01 // 写入状态寄存器指令(WRSR)
#define RDSR_INST 0x05 // 读取状态寄存器指令(RDSR)
#define WRITE_INST 0x02 // 写入存储器指令(WRITE)
#define READ_INST 0x03 // 读取存储器指令(READ)
#define BYTE_ADDR 0x55 // 字节模式写入地址
#define BYTE_DATA 0x11 // 字节模式写入数据
#define PAGE_ADDR 0x1F0 // 页写入模式地址
#define PAGE_DATA1 0x22 // 页模式写入第一个数据
#define PAGE_DATA2 0x33 // 页模式写入第二个数据
#define PAGE_DATA3 0x44 // 页模式写入第三个数据
#define STATUS_REG 0x00 // 要写入到状态寄存器的值
#define MAX_POLL 0x99 // 最在查询次数m number of polls
void wren_cmd();
void wrsr_cmd();
void wren_cmd();
void wrdi_cmd();
void byte_write();
unsigned char byte_read();
void page_write();
unsigned char sequ_read();
void rst_wdog();
void outbyt(unsigned char write_data);
unsigned char inbyt();
void wip_poll();
//********************************************************************************************
main()
{
EA = 0; //
SO = 1;
SI = 1;
SCK = 0;
CS = 1;
wren_cmd(); // 使能写入
wrsr_cmd(); // 写入00H到状态寄存器
wren_cmd(); // 使能写入
byte_write(); // 写入11H到地址55H (字节写入)
byte_read(); // 读取地址55H处的数据(字节读取)
wren_cmd(); // 使能写入
page_write(); // 页写入22H/33H/44H到地址1F0/1/2H
sequ_read(); // 连续读取地址1F0/1/2H
rst_wdog(); // 清除看门狗
wrdi_cmd();
CS = 1;
while(1);
}
//********************************************************************************************
//* 写入使能指令
//* 传入参数: 无
//* 返回值: 无
void wren_cmd()
{
SCK = 0;
CS = 0;
outbyt(WREN_INST); // 传送写入使能指令
SCK = 0;
CS = 1;
}
//********************************************************************************************
//* 写入禁止指令
//* 传入参数: 无
//* 返回值: 无
void wrdi_cmd()
{
SCK = 0;
CS = 0;
outbyt(WRDI_INST); // 传送写入禁止指令
SCK = 0;
CS = 1;
}
//********************************************************************************************
//* 写入数据到状态寄存器
//* 传入参数: 无
//* 返回值: 无
void wrsr_cmd()
{
SCK = 0;
CS = 0;
outbyt(WRSR_INST); // 传送状态寄存器写入指令
outbyt(STATUS_REG); // 传送要写入的数据
SCK = 0;
CS = 1;
wip_poll(); // 检测写入进度
}
//********************************************************************************************
//* 读取状态寄存器
//* 传入参数: 无
//* 返回值: 状态寄存器值
unsigned char rdsr_cmd()
{
unsigned char status;
SCK = 0;
CS = 0;
outbyt(RDSR_INST); // 传送状态寄存器读取指令
status = inbyt(); // 读取状态寄存器
SCK = 0;
CS = 1;
return status;
}
//********************************************************************************************
//* 单一字节写入
//* 传入参数: 无
//* 返回值: 无
void byte_write()
{
unsigned int addr;
addr = BYTE_ADDR; // 设置要写入的地址
SCK = 0;
CS = 0;
if(addr & 0x100)
{
outbyt(WRITE_INST | 0x08); //传送写入指令和地址最高位"1"
}
else
{
outbyt(WRITE_INST); // 传送写入指令和地址最高位"0"
}
outbyt((unsigned char)addr); // 传送地址低字节
outbyt(BYTE_DATA); // 传送数据字节
SCK = 0;
CS = 1;
wip_poll(); // 检测写入进度
}
//********************************************************************************************
//* 单一字节读取
//* 传入参数: 无
//* 返回值: 读取的字节
unsigned char byte_read()
{
unsigned int addr;
unsigned char read_data;
addr = BYTE_ADDR; // 设置要读取的地址
SCK = 0;
CS = 0;
if(addr & 0x100)
{
outbyt(READ_INST | 0x08);// 传送读取指令和地址最高位"1"
}
else
{
outbyt(READ_INST); // 传送读取指令和地址最高位"0"
}
outbyt((unsigned char)addr); // 传送地址低字节
read_data = inbyt(); // 读取字节
SCK = 0;
CS = 1;
return read_data;
}
//********************************************************************************************
//* 页写入
//* 传入参数: 无
//* 返回值: 无
void page_write()
{
unsigned int addr;
addr = PAGE_ADDR; // 设置要写入的地址
SCK = 0;
CS = 0;
if(addr & 0x100)
{
outbyt(WRITE_INST | 0x08); //传送写入指令和地址最高位"1"
}
else
{
outbyt(WRITE_INST); // 传送写入指令和地址最高位"0"
}
outbyt((unsigned char)addr); // 传送地址低字节
outbyt(PAGE_DATA1); // 传送第一个字节数据
outbyt(PAGE_DATA2); // 传送第二个字节数据
outbyt(PAGE_DATA3); // 传送第三个字节数据
SCK = 0;
CS = 1;
wip_poll(); // 检测写入进度
}
//********************************************************************************************
//* 连续读取3个字节
//* 传入参数: 无
//* 返回值: 最后一次读取的字节
unsigned char sequ_read()
{
unsigned int addr;
unsigned char read_data;
addr = PAGE_ADDR; // 设置第一个字节的地址
SCK = 0;
CS = 0;
if(addr & 0x100)
{
outbyt(READ_INST | 0x08); //传送读取指令和地址最高位"1"
}
else
{
outbyt(READ_INST); // 传送读取指令和地址最高位"0"
}
outbyt((unsigned char)addr); // 传送地址低字节
inbyt(); // 读取第一个字节
inbyt(); // 读取第二个字节
read_data = inbyt(); // 读取第三个字节
SCK = 0;
CS = 1;
return read_data;
}
//********************************************************************************************
//* 复位看门狗定时器
//* 传入参数: 无
//* 返回值: 无
void rst_wdog()
{
CS = 0;
_nop_();
_nop_();
CS = 1;
}
//********************************************************************************************
//* 写入进度查询
//* 传入参数: 无
//* 返回值: 无
void wip_poll()
{
unsigned char i; // 设置最大的查询次数
//// 如果WIP位为'1'并且未达到最大查询次数, 则继续查询
//// 如果WIP位为'0', 则写入周期完成, 返回
for(i = 0; i < MAX_POLL; i++)
{
if(rdsr_cmd() & 0x01) // 读取状态寄存器
{
continue;
}
return;
}
}
//********************************************************************************************
//* 传送字节数据到EEPROM, 高位在前
//* 传入参数: write_data --- 要传送的字节
//* 返回值: 无
void outbyt(unsigned char write_data)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
SCK = 0;
SI = (bit)(write_data & 0x80); //传送一个位到SI
write_data <<= 1;
SCK = 1;
}
SI = 0;
}
//********************************************************************************************
//* 从EEPROM接收数据, 高位在前
//* 传入参数: 无
//* 返回值: A --- 接收到的字节
unsigned char inbyt()
{
unsigned char i;
unsigned char read_data;
for(i = 0; i < 8; i++)
{
SCK = 0;
read_data <<= 1;
SCK = 1;
read_data |= (unsigned char)SO;
}
return read_data;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -