czhyf
驱动牛犊
驱动牛犊
  • 注册日期2002-12-17
  • 最后登录2005-07-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2074回复:6

求助,不能读取eeprom,大家帮帮手

楼主#
更多 发布于:2003-02-14 16:26
具体的情况是:计算机认出9050,而且应用windriver能够完成硬件的安装,但是不认eeprom的数据,eeprom没有起作用(插上和去掉eeprom所有9050寄存器都是默认值),eeprom的型号是93c46(atm公司),

[编辑 -  2/14/03 by  czhyf]
taowang
驱动牛犊
驱动牛犊
  • 注册日期2003-02-09
  • 最后登录2003-02-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-16 15:33
你是怎么读的?
flying
驱动小牛
驱动小牛
  • 注册日期2002-08-01
  • 最后登录2016-06-19
  • 粉丝0
  • 关注0
  • 积分197分
  • 威望70点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2003-02-16 21:03
eeprom的型号是93c46(atm公司)


我知道PCI9054的DataBook里,PLX有明确说明,不能用93C56,而要用支持连续读的93CS56!如果我没有猜 错,可能是你的SerialEEPROM的问题,换成93CS46就可以了,是“CS“而不是“C”
mustang
驱动小牛
驱动小牛
  • 注册日期2002-05-17
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-17 16:21
你这个问题我遇到过,肯定是你的eeprom的EEDO脚上拉了。这样的话9052不管你的eeprom如何配置,都调用默认的配置。其实你的93C46是不能用的,只是因为你的EEDO脚上拉了,所以掩盖了真相。不信你用示波器看一下,你的eeprom的时钟输入端肯定不是1MHz的。如果我没有记错的话,可能是1KHz吧。
你将上拉断开再试一下,如果真是我说的那样子,要记的给分呀,这可是我曾经花了好几天才解决的。
czhyf
驱动牛犊
驱动牛犊
  • 注册日期2002-12-17
  • 最后登录2005-07-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-20 11:11
问题解决,换了eeprom为st93c46w,能够顺序读,多谢大家!!
yanhuowu
驱动牛犊
驱动牛犊
  • 注册日期2004-04-21
  • 最后登录2004-06-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-05 18:16
我在调试936的读写程序。可是do脚始终是高电平,
怎么办啊?
  请教各位大侠!!!谢谢!!
yanhuowu
驱动牛犊
驱动牛犊
  • 注册日期2004-04-21
  • 最后登录2004-06-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-05-24 12:28
请教:93c46的do脚怎么总是高电平啊?? 程序如下
//ICC-AVR application builder : 2004-4-21 20:26:09
// Target : 8515
// Crystal: 8.0000Mhz

#include <io8515v.h>
#include <macros.h>
#include \"9346.h\"
void sturt(void);
void delay_us(uint time);
//sbit CS=P1^0;


void  port_init(void)
{
//0入
DDRA = 0x00;
DDRB  = 0xFF;
DDRC  = 0xFF;
}

//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
GIMSK = 0x00;
TIMSK = 0x00;
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
void delay_us(uint time)                              
{
    do
time--;
while(time>1);   //1us
}    
void  Ewen(void)//允许写指令
{  
   uchar i,a,InData;
  
   cs0; delay_us(20);
   sk0; delay_us(20);
   cs1;delay_us(20);
  
   InData=0x98; // 10011XXXX
    for(i=0;i<10;i++)
   {     a=InData&0x80;                        // 10
     if(a==0x80)
  {DIB1;delay_us(20);}
  else {DIB0;delay_us(20);}
  sk1;delay_us(20);
        sk0;delay_us(20);
  InData<<=1;
   }
   cs0;delay_us(20);
}
void Ewds(void) //禁止写指令
{
     uchar i,InData;
    
    cs0;delay_us(20);
sk0; delay_us(20);
    cs1;delay_us(20);
    
  InData=0x80; // 10000XXXX
     for(i=0;i<10;i++)
   { // 10
       if((InData&0x80)==0x80)
  {DIB1;delay_us(20);}
  else {DIB0;delay_us(20);}
       sk1;delay_us(20);
       sk0;delay_us(20);
       InData<<=1;
        }
      cs0;
   delay_us(20);
}

void Read(uchar address1)
{
    uchar i,d;
  uint result=0x0000;
  Ewen();
  sk0;delay_us(20);
  DIB1;delay_us(20);
  cs0; delay_us(20);
  cs1;delay_us(20);
  
  sk1;delay_us(20);
  sk0;delay_us(20);
  address1=address1&0x3f|0x80;// 110 A5-A0
  for(i=0;i<8;i++)
  {               // 8
    if((address1&0x80)==0x80)
   {DIB1;delay_us(20);}
  else
  {DIB0;delay_us(20);}
   sk1;delay_us(20);
   sk0;delay_us(20);
   address1<<=1;
  }
          DDRA = 0xff;
    DOA7=0x80;delay_us(20);
    
    for(i=0;i<16;i++)
    {  // 16
    sk1;delay_us(20);
    
    result=(result<<1)|DOA7;
    sk0;delay_us(20);
    }
    cs0;
   Ewds();
    buffer[0]=result;
}

void Write(uchar address,uint InData)
{
   uchar i;
  uint a;
  Ewen();

  sk0; delay_us(20);
  cs0;delay_us(20);
  cs1;delay_us(20);
  DIB1;delay_us(20); // 101 A5-A0
  
  sk1;delay_us(20);
  sk0; delay_us(20);
  address=address&0x3f|0x40;
  for(i=0;i<8;i++)
  { // 8
if((address&0x80)==0x80)
     { DIB1;}
else {DIB0;}
  sk1; delay_us(20);
  sk0; delay_us(20);
  address<<=1;
}
   for(i=0;i<16;i++)
  { // 16
  if((InData&0x8000)==0x8000)
      { DIB1;delay_us(20);}
  else {DIB0;delay_us(20);}
  sk1; delay_us(20);
  sk0;delay_us(20);
  InData<<=1;
  }
  cs0;delay_us(20);
  DDRA=0xff;
  DOA7=0x80;delay_us(20);
  cs1;delay_us(20);
  sk1;delay_us(20);
  DDRA=0x00;
while((a=(DOA7&0x80))==0)
  { // busy test
  delay_us(20);
  sk0; delay_us(20);
  sk1;delay_us(20);
  }
  sk0;delay_us(20);
  cs0;delay_us(20);
  Ewds();
}

  void main()
{
    uint i;
   uchar add=0x02;
   init_devices();
  
   Write(add,0x2003);
  Read(add);
  while(1);
}
////////上面是我用的AVR   C语言的程序  请大家帮忙啊,   do脚一直是高电平。

读不回来数!!

谢谢指教!!!
游客

返回顶部