打印

关于AT29C020写操作的问题,请高手指点一二。

[复制链接]
2467|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yazhi68|  楼主 | 2007-9-11 18:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用的是W78E58B,24M晶振。从W78E58B的AUX-RAM写到AT29C020怎么也写不对,有时前两个字节对,后面全是0。有时干脆都不对。换成从程序存储器写到AT29C020,一点问题也没有。弄了一天多,还是不知道问题出在哪儿。
程序如下,请高手帮忙分析分析是什么原因。

#include<reg_w78e58b.h>
#include<absacc.h>

#define uchar unsigned char 
#define uint  unsigned int
#define ulong unsigned long

unsigned char code sct_data[]=
{
0x00,0x08,0x00,0x01,0x75,0xc0,0x02,0xee,0x20,0x02,0xba,0x20,0x00,0x66,0x20,0x40,
0x07,0x0a,0x40,0x05,0x00,0x03,0x9e,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x00,0x01,0x75,0xc0,0x02,0xee,0x20,0x02,0xba,0x20,0x00,0x66,0x20,0x40,
0x07,0x0a,0x40,0x05,0x00,0x03,0x9e,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x00,0x01,0x75,0xc0,0x02,0xee,0x20,0x02,0xba,0x20,0x00,0x66,0x20,0x40,
0x07,0x0a,0x40,0x05,0x00,0x03,0x9e,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x00,0x01,0x75,0xc0,0x02,0xee,0x20,0x02,0xba,0x20,0x00,0x66,0x20,0x40,
0x07,0x0a,0x40,0x05,0x00,0x03,0x9e,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

#define ce_29020  P22
#define oe_29020  P23
#define we_29020  P24

/***  load mmry data to eep  ***/
void cpy_mmry_29c020(uchar data sct_num) 
{
  uint data  tmp;
  uchar data seg;
  uchar data  nu;

  oe_29020=1;

  /* A16 *, A17 在程序外设置 */

  ce_29020=0;
/*  load aa to 0x5555  */  
  P0=0;       
  P27=0; P27=1;       
  P0=0x55;_nop_(); 
  P25=0; P25=1;            
  P0=0x08;_nop_();       
  P27=0; P27=1;       
  P0=0x55;_nop_(); 
  P25=0; P25=1;            
  P0=0xaa;for(nu=0;nu<4;nu++) _nop_();
  we_29020=0; 
  we_29020=1;           

/*  load 55 to 0x2aaa */
  P0=0;       
  P27=0; P27=1;       
  P0=0xaa;_nop_(); 
  P25=0; P25=1;
  P0=0x08;_nop_();       
  P27=0; P27=1;       
  P0=0x2a;_nop_(); 
  P25=0; P25=1;            
  P0=0x55;for(nu=0;nu<4;nu++) _nop_();
  we_29020=0;  
  we_29020=1;         

/*  load aa to 0x5555  */
  P0=0;       
  P27=0; P27=1;       
  P0=0x55;_nop_(); 
  P25=0; P25=1;
  P0=0x08;_nop_();       
  P27=0; P27=1;       
  P0=0x55;_nop_(); 
  P25=0; P25=1;            
  P0=0xa0;for(nu=0;nu<4;nu++) _nop_();
  we_29020=0; 
  we_29020=1;       

  // to lock mid 8 bit addr
  P0=0x08;_nop_();       
  P27=0; P27=1;       
  P0=sct_num;_nop_(); 
  P25=0; P25=1;

 for(tmp=0;tmp<256;tmp++) 
  {
    seg=PBYTE[tmp];  /*  访问W78E58B AUX-RAM */

    /*  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
    /*  此处有问题,如改成下一句,访问程序存储器    */
    /*  则正常。                                    */
    /*  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */

//     seg=sct_data[tmp];

    P25=1;

    P0=0;       
    P27=0; P27=1;       
    P0=tmp;_nop_(); 
    P25=0; P25=1;           // to lock low 8 bit addr / 
    P0=seg;for(nu=0;nu<10;nu++) _nop_();
    we_29020=0;
    we_29020=1;                //  write 29c020  /
  }

  ce_29020=1;

}


void deal32(uchar data ky)
{
  ......

  EA=0;
  cpy_mmry_29c020(rcd_sct_num1);
  EA=1;

  ......
      
}

void t0() interrupt 1
{
   ......
}

void main()
{      
      ......

      CHPENR=0x87;
      CHPENR=0x59;
      CHPCON|=0x10;
      CHPENR=0x00;
    
      TR0=1;
      EA=1; 
               
      ......

      while(1)
      {
          ......    
      }
}

相关帖子

沙发
yazhi68|  楼主 | 2007-9-11 21:25 | 只看该作者

没人理,自己先顶一下

使用特权

评论回复
板凳
古道热肠| | 2007-9-12 11:53 | 只看该作者

我来说说

  没看出你pBYTE何处赋值操作。理论上从Code区取数据与从RAM中取数据是一样的,既然用Code测试写正常,问题不在写操作的时序上,而是数据在RAM中的存取出了问题。
 AT29C020字节间的延时很短,宜将数据传输阶段的for(nu=0;nu<4;nu++) _nop_();延时除掉。
 先用55,AA作测试,正常后再用模拟数据测试。

使用特权

评论回复
地板
yazhi68|  楼主 | 2007-9-13 18:26 | 只看该作者

多谢

    已解决。回头看看简直是弱智,问题出在前面已将RAM的数据破坏。
    原先没加延时,后来用示波器看到P0的上跳沿有点缓才加上的(不知道示波器的接入会影响多少),也是情急之下出的混招。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

156

帖子

0

粉丝