导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→SOS!!![公告][guest]

 *第11477篇: SOS!!![公告]

  
楼 主:guest 2003年5月6日16:41
 SOS!!![公告]
[color=#F08080]
S0S!!谁有X25045看门狗程序?请赐教!!!
   cjy0312@citiz.net  等待你的答复
[/color]
  
2楼:荒原野草 2003年5月6日16:46
 网上down的,能用
#include   <stdio.h>  
#include   <AT89X51.h>  
#include   <intrins.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^0;                //时钟
sbit SI=P1^1;                 //CPU--->  5045
sbit SO=P1^5;                 //5045-->  CPU
sbit CS=P1^4;                 //片选
//******************************************
//***************************************************************************
//5045底层操作程序,外部函数声明
void dog_feed(void);
extern void Wrdi_Cmd(void);                   //写禁能,在非正常的操作中断后,主程序在初始化时最好执行一次此操作
extern void Wrsr_Cmd(uchar control_Byte);     //写状态寄存器
extern void Byte_Write(uint e2_add,uchar a);  //写入一字节
extern void Page_Write_FromIdata(uint e2_add,uchar idata *pt);    //写入1页,数据来源:内部的RAM
extern void Page_Write_FromXdata(uint e2_add,uchar xdata *pt);    //写入1页,数据来源:外部的RAM
extern uchar Byte_Read(uint e2_add);                              //从5045的指定地址读出1字节
extern void Sequ_Read_ToXdata(uint e2_add,uchar xdata *pt,uint data_amount);   //从5045连续读取数据.数据存放:内部的RAM
extern void Sequ_Read_ToIdata(uint e2_add,uchar idata *pt,uchar data_amount);  //从5045连续读取数据.数据存放:外部的RAM
//***************************************************************************

//******************************************
//输出一个字节
//入口:一个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();                //等待写入操作完成
}
//*****************************************

//*****************************************
//读数据之前的预操作
//入口: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);
}
/*****************************************

void dog_feed(void)
{
CS=1;
CS=0;
CS=1;
}
*/

void main(void)
{
 Wrdi_Cmd();                     //复位写使能
 Wrsr_Cmd(CONTROL3);             //设置5045的工作状态
 while(1);
}

  
3楼:cjy0312 2003年5月7日13:51
 荒原野草: 能告诉我是在哪里DOWN的吗?(X5045看门狗)
  
4楼:荒原野草 2003年5月7日13:53
 时间太久,记不清了,当时是用google搜的
  
5楼:cjy0312 2003年5月7日14:24
 谢谢!还有问题。。。。。
荒原野草:
         我在google搜过,没发现。我用你的DOWN的程序直接生成.HEX文件烧片子,看门狗就起作用了吗?你试过吗?
  
6楼:荒原野草 2003年5月7日15:58
 用过
没那么试过,不过里面的函数多数都用过,很好用,没发现什么毛病.
只是有点需要注意,如果用的是25045,在页的问题上与5045有区别.
  
7楼:cjy0312 2003年5月7日16:20
 谢谢!十分感谢!!!很好用,再一次感谢!!!!
  
8楼:bestecliang 2003年5月9日13:44
 sas

>>>>>>对该主题发表你的看法

本主题贴数8,分页: [第1页]


[上一篇主题]:[讨论]请教:关于以太网控制器芯片物理地址的问题?

[下一篇主题]:转贴--提问的智慧 (How To Ask Question