DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 137|回复: 0
打印 上一主题 下一主题

x5045 c程序-x5045读写程序-x5045c驱动程序

[复制链接]
跳转到指定楼层
楼主
发表于 2011-4-30 14:05:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
x5045 c程序
//X5045.H
#ifndef X5045_h
#define X5045_h

#define WDT1_4 0x00;
#define WDT600 0x10;
#define WDT200 0x20;
#define WDTDIS 0x30;
//BIT
sbit B_CS5045=P2^0;
sbit B_SO5045=P2^1;
sbit B_SCLK5045=P2^3;
sbit B_SI5045=P2^2;
extern unsigned char data tcX5045;
void RstWDT(void);
void WrB5045(unsigned char,unsigned char) reentrant; //写入单字节数据
unsigned char RdB5045(unsigned char); //读出单字节数据
void byteout(unsigned char); //向5045输出单字节
void wip_chk(void); //等待5045结束内部写周期
unsigned char rdsr(void); //5045状态寄存器读出程序
unsigned char bytein(void); //从5045读出一字节数据
unsigned char readx(void); //读地址,地址位于100h
void wrsr(unsigned char); //5045状态寄存器写入程序
void wren(void); //写允许
void wrdi(void); //写禁止
#endif

/*
X5045/3 读写驱动
*/
#include
#include "X5045.h"
//复位看门狗
void RstWDT()
{
B_CS5045=0;
B_CS5045=1;
}
//向X5045写入单字节数据
//输入:x,待写数据,address,写入数据的地址
void WrB5045(unsigned char x,unsigned char address) reentrant //数据,地址
{
wren();
B_SCLK5045=0;
B_CS5045=0;
byteout(0x2); //write
byteout(address);
byteout(x);
B_SCLK5045=0;
B_CS5045=1;
wip_chk();
wrdi();
}
//从X5045读入单字节数据
//输入:address,待读数据地址
//返回:读出的数据
unsigned char RdB5045(unsigned char address)
{
unsigned char data x;
B_SCLK5045=0;
B_CS5045=0;
byteout(0x3); //read 000h
byteout(address);
x=bytein();
B_SCLK5045=0;
B_CS5045=1;
return (x);
}
//向X5045输出单字节
void byteout(unsigned char x)
{
unsigned char data i,j;
j=128;
for(i=0;i=5) break;
}
while(dat);
}
//5045状态寄存器读出程序
unsigned char rdsr()
{
unsigned char data dat;
B_SCLK5045=0;
B_CS5045=0;
byteout(5);
dat=bytein();
B_SCLK5045=0;
B_CS5045=1;
return (dat);
}
//从X5045读出一字节数据
unsigned char bytein()
{
unsigned char data i,x;
x=0;
for (i=0;i
//#include
#include
#definebyte unsigned char
#defineN_NOP_nop_();//_nop_();_nop_();_nop_();_nop_();
//////////////////////////////////////////////////////////////////
//x5045
//////////////////////////////////////////////////////////////////
//DEFINE
#defineWRSR_INIT0X01//写状态寄存器指令;
#defineWRITE_INIT0X02//写数据指令;
#defineREAD_INIT0X03//读数据指令;
#defineWRDI_INIT0X04//禁止写操作指令;
#defineRDSR_INIT0X05//读状态寄存器指令;
#defineWREN_INIT0X06//允许写操作指令;
#defineWAIT_TIMES200//等待时间常数;
sbitSO  =P2^4;
sbitSI  =P2^5;
sbitSCK  =P2^6;
sbitCS  =P2^7;
/////////////////////////////////////////////////////////////////
//函数声明ROPERTY
void wren_cmd(void);//允许写操作指令函数;
void write(byte dt);//写一个字节数据函数;
byte read(void);//读一个字节数据函数;
byte read_state(void);//读状态控制字函数;
void write_state(byte dt);//写状态控制字函数;
void read_nbyte(bit bA8,//读n个字节数据函数;
byte adr_L,
byte n,
byte *adr);
void write_nbyte(bit bA8,//写n个字节数据函数;
byte adr_L,
byte n,
byte *adr);
void wait_end(byte run_times);//等待函数;
/////////////////////////////////////////////////////////////////
//函数定义;
//FOUNCTION
//enable before write data to x5045;
void wren_cmd(void)
{//向X5045写入允许写操作指令字;

CS=1;
SCK=0;
CS=0;
write(WREN_INIT);
CS=1;
SCK=0;
}
//make clk for send data
void write(byte dt)
{//向X5045写入一个字节数据
registerbytei;
for(i=0;i<8;i++)
{
SCK=0;
//N_NOP;


SI=(bit)(dt & 0x80);//_|-
SCK=1;
//N_NOP;


dt=dt<<1;
}
SI=0;
}
//make clk for receive data
byte read(void)
{//从X5045读一个字节数据;
registerbytei;
register byte dt=0;
SO=1;
for(i=0;i<8;i++)
{
SCK=1;
//N_NOP;


SCK=0;
//N_NOP;


dt=dt<<1;
if(SO)dt++;
}
return dt;
}
//---------------------------------------
//X5045状态控制字:|
//BIT:76543210
|
// x x WD1 WD0 BL1 BL0 WEL WIP |
//WIP:0---正在写操作;|
// 1---写操作完成;|
//WEL:0---写使能锁存器复位;|
// 1---写使能锁存器置位;|
//BL1 BL0:
|
// 00--不保护;|
// 01--保护:01H--180H--1FFH;|
// 10--保护:100H--1FFH;|
// 11--保护:000H--1FFH;|
//WD1 WD0:
|
// 00--1.4秒;|
// 01--600毫秒;|
// 10--200毫秒;|
// 11--禁止看门狗;|
//---------------------------------------
//read state word from x5045;
byte read_state(void)
{//从X5045读状态控制字;
registerbyte dt;
wren_cmd();
CS=1;
SCK=0;
CS=0;
write(RDSR_INIT);
dt=read();
SCK=0;
CS=1;
return dt;
}
//write state word to x5045 before do somthing;
void write_state(byte dt)
{//向X5045写状态控制字;
wren_cmd();
CS=1;
SCK=0;
CS=0;
write(WRSR_INIT);
write(dt);
SCK=0;
CS=1;
wait_end(WAIT_TIMES);
}
//read n bytes from x5045;
void read_nbyte(bit bA8,//选择EPROM上半部分/下半部分
byte adr_L,//从EPROM中什么地址开始读;
byte n,//要读的字节数;
byte *adr)//所读的数据从什么地址开始存放;
{//从X5045读n个字节数据;
register byte i ;

CS=1;
SCK=0;
CS=0;
write(bA8?READ_INIT | 0x08 : READ_INIT);
write(adr_L);
for(i=0;i<n;i++)
{
*adr=read();
adr++;
}
SCK=0;
CS=1;
}
//write n bytes to x5045;
void write_nbyte(bit bA8,//选择EPROM上半部分/下半部分;
byte adr_L,//从EPROM中什么地址开始写;
byte n,//要写的字节数;
byte *adr)//从什么地址开始取数据写;
{//向X5045写n个字节数据;
register byte i ;
EA=0;
wren_cmd();
CS=1;
SCK=0;
CS=0;
write(bA8?WRITE_INIT | 0x08 : WRITE_INIT);
write(adr_L);
for(i=0;i<n;i++)
{
write(*adr);
adr++;
}
SCK=0;
CS=1;
wait_end(WAIT_TIMES);
EA=1;
}
// wait for be sure to complete
void wait_end(byte run_times)
{////等待向X5045写操作完成;
register byte dt=0;
while(run_times--)
{
dt=read_state();
if(dt&0x01==0)break;
}
}
//////////////////////////////////////////////////////////////////
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-10-27 06:59 , 耗时 0.083368 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表