📄 x5045wdt.c
字号:
//------------------------------------------------------------------
// x5045的应用函数库
//------------------------------------------------------------------
#define WREN_INST 0x06
#define WRDI_INST 0x04
#define WRSR_INST 0x01
#define RDSR_INST 0x05
#define WRITE_INST 0x02
#define READ_INST 0x03
#define MAX_POLL 99
#define WATCHTIME_1400MS 0x00 //pay attention time don't forget add 0x
#define WATCHTIME_600MS 0x10
#define WATCHTIME_200MS 0x20
#define WATCHDOGDISABLE 0x30
#define WATCHTIME WATCHTIME_1400MS
#define X_CS 0x00000040 //P0.6 5045片选输出口
#define X_SO 0x00000020 //P0.5 5045数据输入口
#define X_SI 0x00000080 //P0.7 5045数据输出口
#define X_CLK 0x01000000 //P1.24 5045时钟输出口
#define SET_X_CS IO0SET=X_CS; SomeNOP()
#define CLR_X_CS IO0CLR=X_CS; SomeNOP()
#define SET_X_SI IO0SET=X_SI; SomeNOP()
#define CLR_X_SI IO0CLR=X_SI; SomeNOP()
#define SET_X_CLK IO1SET=X_CLK; SomeNOP()
#define CLR_X_CLK IO1CLR=X_CLK; SomeNOP()
#define CHECKSODATA (IO0PIN & X_SO)
//指令延时
void SomeNOP()
{
unsigned char i;
for(i=0;i<15;i++){}
}
//喂狗
void watchdog(void)
{
SET_X_CS;
CLR_X_CS;
}
unsigned char inbyt(void) //读数据
{
unsigned char i,indata=0,temp=0x80;
for(i=0;i<8;i++)
{
SET_X_CLK;//clk=0
CLR_X_CLK;//clk=1
if(CHECKSODATA){indata|=temp;}
temp>>=1;
}
return indata;
}
//ok
void outbyt(unsigned char outdata) //向串口发数据
{
unsigned char i,temp=0x80;
for(i=0;i<8;i++)
{
CLR_X_CLK;//CLK=0
if( (outdata&temp) ){SET_X_SI;}
else{CLR_X_SI;}
temp>>=1;
SET_X_CLK;//CLK=1
}
CLR_X_SI;
}
//ok
unsigned char ReadState(void) //读状态
{
unsigned char state;
CLR_X_CLK;
CLR_X_CS;
outbyt(RDSR_INST);
state=inbyt();
CLR_X_CLK;
SET_X_CS;
return state;
}
//ok
void SetWriteEnable(void) //写使能
{
CLR_X_CLK;
CLR_X_CS;
outbyt(WREN_INST); //Send WREN instruction
CLR_X_CLK;
SET_X_CS;
}
//ok
void wip_poll(void) //等待空闲
{
unsigned char i,state;
for(i=0;i<MAX_POLL;i++)
{
state=ReadState();
if((state&0x01));
else i=MAX_POLL;
}
}
//ok
void WriteState(unsigned char temp) //写状态
{
CLR_X_CLK;
CLR_X_CS;
outbyt(WRSR_INST);
outbyt(temp);
CLR_X_CLK;
SET_X_CS;
wip_poll();
}
//ok
void write_byte(unsigned int address,unsigned char data_in) //写一位即八个字节
{
unsigned char address_h,address_l;
SetWriteEnable();
CLR_X_CLK;
CLR_X_CS;
address_h=address/0x100;
address_l=address%0x100;
address_h<<=3;
outbyt(address_h|WRITE_INST);
outbyt(address_l);
outbyt(data_in);
CLR_X_CLK;
SET_X_CS;
wip_poll();
}
//ok
signed char read_byte(unsigned int address) //读一位
{
unsigned char address_h,address_l,temp;
CLR_X_CLK;
CLR_X_CS;
address_l=(address%0x100);
address_h=(address/0x100);
address_h<<=3;
outbyt(address_h|READ_INST);
outbyt(address_l);
temp=inbyt();
CLR_X_CLK;
SET_X_CS;
return temp;
}
//ok
void write_16byte(unsigned int d,signed int e) //写两个字节
{
write_byte(d,e/256); //address/256=high address
d++;
write_byte(d,e%256); //address%256=lowaddress
}
//ok
signed int read_16byte(unsigned int d) //读两个字节
{
unsigned char e,f;
signed int k;
e=read_byte(d);
d++;
f=read_byte(d);
k=e*256+f; //e*256 means high byte add low f
return k;
}
//ok
//设置看门狗不允许写
void setwrite_unenable(void)
{
SetWriteEnable();
WriteState(WATCHTIME|0x0C);
}
//设置看门狗写数据使能
void setwatchdog(void) // 设置看门狗定时时间或禁狗要设定WATCHDOGTIME
{
SetWriteEnable();
WriteState(WATCHTIME);
}
//ok
//判断看门狗定时器是否使用 如果没有使用就设置看门狗定时值1。5秒
void judge_watchdog(void)
{
unsigned char temp;
temp=ReadState();//读状态字
if((temp&WATCHDOGDISABLE)==WATCHDOGDISABLE)
{
setwatchdog();
}
temp=ReadState();//读状态字
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -