看门狗X5045开发档案
作者:张先永 2009、6、30
最近给客户做了一个电机控制板。考虑到产品的稳定性。所有复位电路我们采用了X5045最为复位。当然前期我也下了不少的资料看。可是大多的不全。或者是程序不能用,现在我把我的程序发给大家。希望做X5045的朋友可以用的上,也算是我个人回馈论坛吧。当然我支持程序原创,因为许许多多的
一手资料都不是网上下的。而是写出来的。在此我更希望大家自己动手去写程序。因为只有自己写用的时候你才会有底。
X5045工作在4.5V-5.5V,希望要用在2.7V-5.5V,并且复位电压在3.0V的同志。记得选型的时候选X5045S8I-2.7A我也曾经为此复位电压苦恼了很久,我用的是锂电池3.6V,我当时选的X5045一直在啊复位希望读者,一定要看清除数据手册在选型。
下面是我项目中的 X5045的读写程序,希望可以用的上的可以拿去参考。
X5045接线电路图:
测试程序:
说明:
以下程序包含:底层字节读取函数,复位看门狗,状态寄存器的读写函数,EEPROM的读写函数。
在主函数中有一个 P0=design[b];//读已经定义的花样数据并写花样数据到P0;那个是我在程序测试的时候用的使用可以不易理会,send_char_com(Read_StatusReg()); 是利用串口把状态寄存器中的数发送到PC机上去。这个也是我测试用的。这些函数在另一个 .h文件中我就不发上去了,你们应该是会写的。
我的程序在实际应用中得到了事实的考证,经过实际的检验。单片机做控制外置看门狗电路效果很不错。X5045的功能很强大在实际开发中很有价值。
//=============================================
//程 序:X5045看门狗的使用
//MCU:AT89C2051
//晶振:12M
//署名:张先永
//时间:2009-6-6
//=============================================
#include <AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
/*
#define CS P1_4
#define SO P1_5
#define SI P1_7
#define SCLK P1_6
*/
//实验板测试
#define CS P1_0
#define SO P1_1
#define SI P1_3
#define SCLK P1_2
#define ID_Part_A 0x55
#define ID_Part_D 0x40
//=============================================
//函数名称:1ms延时函数
//=============================================
delay1ms(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++) ;
}
//=============================================
//函数名称: X5045写入数据(NOTE:高位在前)
//=============================================
void Write_X5045(uchar Writer_data)
{
unsigned char i;
for(i=0;i<8;i++)
{
SI=(bit)(Writer_data&0x80);
SCLK=0;
SCLK=1;
Writer_data<<=1;
}
SI=0; //使SI处于确定的状态
}
//=============================================
//函数名称: X5045读取数据(NOTE:高位在前)
//=============================================
uchar Read_X5045(void)
{
unsigned char i,Read_data;
for(i=0;i<8;i++)
{
SCLK=1;
SCLK=0;
Read_data<<=1;
Read_data|=(uchar)(SO);
}
return Read_data;
}
//=============================================
//函数名称:WREN Instruction 允许写 CMD OX06
//=============================================
void WREN_Cmd (void)
{
SCLK=0;
CS=0;
Write_X5045(0x06);
SCLK=0;
CS=1;
}
//=============================================
//函数名称:WRDI Instruction 不允许写 CMD OX04
//=============================================
void WRDI_Cmd (void)
{
SCLK=0;
CS=0;
Write_X5045(0x04);
SCLK=0;
CS=1;
}
//=============================================
//函数名称: 读状态寄存器
//说 明: WIP bit:(Read Only)
// When set to a"1",a nonvolatile
// write opration is in progress.
// WEL Bit:(Read Only)
// the bit is Write Enable Latch
// When WEL=1,the latch is set.
//=============================================
uchar Read_StatusReg(void)
{
uchar Read_data;
SCLK=0;
CS=0;
Write_X5045(0X05); //Read Status Register instuction
Read_data=Read_X5045();
SCLK=1;
CS=1;
return (Read_data);
}
//=============================================
//函数名称: 写状态状态寄存器
//=============================================
void Write_StateReg(uchar Writer_data)
{
delay1ms(10); //等待器件稳定,经验值
WREN_Cmd (); //解锁
SCLK=0;
CS=0;
Write_X5045(0X01);
Write_X5045(Writer_data);
SCLK=0;
CS=1;
WRDI_Cmd (); //上锁
}
//=============================================
//函数名称:重设看门狗
//=============================================
void Rest_WDG(void)
{
CS=0;
CS=1;
}
//=============================================
//函数名称: 写数据到X5045__EEPROM
//=============================================
void Writer_to_X5045(uchar Writer_data, address)
{
WREN_Cmd (); //解锁
SCLK=0;
CS=0;
Write_X5045(0X02);
Write_X5045(address);
Write_X5045(Writer_data);
SCLK=0;
CS=1;
WRDI_Cmd (); //上锁
}
//=============================================
//函数名称:读取数据X5045__EEPROM
//=============================================
uchar Read_form_X5045(uchar address)
{
uchar Read_data;
SCLK=0;
CS=0;
Write_X5045(0X03);
Write_X5045(address);
Read_data=Read_X5045();
SCLK=0;
CS=1;
return Read_data;
}
//=============================================
//函数名称:重置看门狗门限
//=============================================
void Reset_Vtrip(void)
{
CS=0;
delay1ms(50);
SCLK=0;
CS=0;
Write_X5045(0x06);
SCLK=0;
CS=1;
delay1ms(10);
SCLK=0;
CS=0;
Write_X5045(0X02);
Write_X5045(0x00);
Write_X5045(0x03);
Write_X5045(0x00);
SCLK=0;
CS=1;
}
//=============================================
//函数名称:设置看门狗门限
//=============================================
void Set_Vtrip(void)
{
CS=0;
delay1ms(50);
SCLK=0;
CS=0;
Write_X5045(0x06);
SCLK=0;
CS=1;
delay1ms(10);
SCLK=0;
CS=0;
Write_X5045(0X02);
Write_X5045(0x00);
Write_X5045(0x01);
Write_X5045(0x00);
SCLK=0;
CS=1;
}
//=============================================
//函数名称:配置串口
//=============================================
void Init_Com(void)
{
TMOD = 0x20; //定时器工作方式2,初值自动装入
PCON = 0x00; //波特率不增倍
SCON = 0x50; //串行工作方式设定
TH1 = 0xFd; //定时器初值高位
TL1 = 0xFd; //定时器初值低位
TR1 = 1; //启动定时器
}
//=============================================
//函数名称:向串口发送一个字符
//=============================================
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
//定义花样数据
code unsigned char design
[32]={0xFF,0xFE,0xFD,
0xFB,0xF7,0xEF,0xDF ,0xBF,0x7f,
0x7f,0xbf,0xdf,0xef,0xF7,0xFB,0xFD,0xFE,0xFF,
0XFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,
0xE7,0xDB,0xBD,0x7E,0xFF};
//=============================================
//函数名称:MAIN
//=============================================
void main()
{
unsigned char b;//在C51中因内存由限需要尽可能考虑使用变量的类型
// Reset_Vtrip();
// delay1ms(60000);
// CS=0;
Writer_to_X5045(ID_Part_D,ID_Part_A);
Write_StateReg(0X10);
Init_Com();
while(1)
{
for (b=0 ;b<32;b++)
{
// Set_Vtrip();
P0=design[b];//读已经定义的花样数据并写花样数据到P0;
send_char_com(Read_StatusReg());
send_char_com(Read_form_X5045(ID_Part_A));
Rest_WDG();
delay1ms(300);
}
}
}
注:
如需帮助请发送邮件到 [email protected] 我很乐意为你解答。