打印
[ZLG-ARM]

不能读出M25P64,寻求帮助

[复制链接]
2014|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
地下水|  楼主 | 2007-10-10 20:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人使用的调试环境为ADS1.2, LPC2132 CPU, 该板上有一片串行Flash 芯片M25P64,
本人使用SPI0的与其通信,但是不能读出数据,请调通过的大侠给与帮助.

  有示波器观察 MOSI, CLK 的波形均正确,但MISO没有任何输出.
一个从机,CS硬件直接接地。。。


void  DelayNS(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--) 
      for(i=0; i<5000; i++);
}


/****************************************************************************
* 名称:MSpiIni()
* 功能:初始化SPI接口,设置为主机。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  MSpiIni(void)
{  S0PCCR = 0x52;                    // 设置SPI时钟分频
   S0PCR = 0x70;                    // 设置SPI接口模式,MSTR=1,CPOL=1,CPHA=1,LSBF=0
}


/****************************************************************************
* 名称:MSendData()
* 功能:向SPI总线发送数据,并接收从机发回的数据。
* 入口参数:data        待发送的数据
* 出口参数:返回值为接收到的数据
****************************************************************************/
uint8  MSendData(uint8 data)
{  
   
   S0PDR = data;
   while( 0==(S0PSR&0x80) );        // 等待SPIF置位,即等待数据发送完毕
   
   return(S0PDR);
}


int  main(void)
{  uint8  i; 
    
   PINSEL0 = 0x00005500;            // 设置SPI0管脚连接?
   PINSEL1 = 0x00000000;

   
   MSpiIni();                // 初始化SPI接口

  MSendData(0x9f);
 MSendData(0xaa);
 MSendData(0xaa);
 MSendData(0xaa);
  DelayNS(10);

   while(1);    

}


相关帖子

沙发
tangsunsun| | 2007-10-11 14:03 | 只看该作者

25p16

我用的是25p16
uint8 RDSR(void)            //读状态寄存器
{
    uint32 i;
    uint8 bak;
    IO1CLR=CSF;
    for(i=0;i<30;i++);
    SSPDR=0x05;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    SSPDR=0xFF;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    IO1SET=CSF;
    return bak;
}
void WREN(void)                //写允许
{
    uint32 i;
    uint8 bak;
    IO1CLR=CSF;
    for(i=0;i<30;i++);
    SSPDR=0x06;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    IO1SET=CSF;
}

void WRDI(void)                //写屏蔽
{
    uint32 i;
    uint8 bak;
    IO1CLR=CSF;
    for(i=0;i<30;i++);
    SSPDR=0x04;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    IO1SET=CSF;
}
void WRSR(uint8 dat)            //写状态寄存器
{
    uint32 i;
    uint8 bak;
    WREN();
    IO1CLR=CSF;
    for(i=0;i<30;i++);
    SSPDR=0x01;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    SSPDR=dat;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    IO1SET=CSF;
    while((RDSR()&0x01)!=0);
}
uint8 READByte(uint32 addr)
{
    uint32 i;
    uint8 bak;
    IO1CLR=CSF;
    for(i=0;i<30;i++);
    SSPDR=0x03;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    bak=(addr>>16)&0xFF;
    SSPDR=bak;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    bak=(addr>>8)&0xFF;
    SSPDR=bak;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    bak=(addr>>0)&0xFF;
    SSPDR=bak;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    SSPDR=0xFF;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;    
    IO1SET=CSF;
    return bak;
}
void READBytes(uint32 addr,uint32 len,uint8 *ptr)
{
    uint32 i;
    uint8 bak;
    while((SSPSR&0x04)!=0)bak=SSPDR;
    
    IO1CLR=CSF;
    for(i=0;i<30;i++);
    SSPDR=0x03;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    bak=(addr>>16)&0xFF;
    SSPDR=bak;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    bak=(addr>>8)&0xFF;
    SSPDR=bak;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    bak=(addr>>0)&0xFF;
    SSPDR=bak;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    for(i=0;i<len;i++)
    {
        SSPDR=0xFF;
        while((SSPSR&0x10)!=0);
        bak=SSPDR;    
        ptr=bak;
    }
    IO1SET=CSF;
}    
void PP(uint32 addr,uint32 len,volatile uint8 *ptr)    //页面编程
{
    uint32 i;
    uint8 bak;
    while((RDSR()&0x01)!=0);            //等待不忙
    WREN();
    while((RDSR()&0x01)!=0);            //等待不忙
    for(i=0;i<100;i++);
    if((RDSR()&0x02)==0)
    {
        WREN();
        for(i=0;i<200;i++);
    }
    IO1CLR=CSF;
    for(i=0;i<30;i++);
    SSPDR=0x02;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    bak=(addr>>16)&0xFF;
    SSPDR=bak;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    bak=(addr>>8)&0xFF;
    SSPDR=bak;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    SSPDR=0;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    if(len>256)len=256;
    for(i=0;i<len;i++)
    {
        SSPDR=ptr;
        while((SSPSR&0x10)!=0);
        bak=SSPDR;    
    }
    IO1SET=CSF;
}
void SE(uint32 addr)        //扇区擦除
{
    uint32 i;    
    uint8 bak;

    while((RDSR()&0x01)!=0);        //等待不忙
    WREN();
    while((RDSR()&0x01)!=0);        //等待不忙
    for(i=0;i<100;i++);
    IO1CLR=CSF;
    for(i=0;i<30;i++);
    SSPDR=0xD8;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    bak=(addr>>16)&0xFF;
    SSPDR=bak;
    while((SSPSR&0x10)!=0);
    SSPDR=0;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    SSPDR=0;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    IO1SET=CSF;
    while((RDSR()&0x01)!=0);        //等待不忙
    for(i=0;i<100;i++);

}
void EnterPownDown(void)            //睡眠
{
    uint8 bak;
    uint32 i;
    IO1CLR=CSF;
    for(i=0;i<30;i++);
    SSPDR=0xB9;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    IO1SET=CSF;
    for(i=0;i<100;i++);
}
void OutPownDown(void)            //唤醒
{
    uint32 i;
    uint8 bak;
    IO1CLR=CSF;
    for(i=0;i<30;i++);
    SSPDR=0xAB;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    IO1SET=CSF;
    for(i=0;i<1000;i++);
}
uint32 RDID(void)
{
    uint32 i;
    uint8 bak;
    IO1CLR=CSF;
    for(i=0;i<30;i++);
    while((SSPSR&0x02)==0);
    SSPDR=0x9F;

    while((SSPSR&0x02)==0);
    SSPDR=0xFF;
    
    while((SSPSR&0x02)==0);
    SSPDR=0xFF;
    
    while((SSPSR&0x02)==0);
    SSPDR=0xFF;

    while((SSPSR&0x04)==0);        
    bak=SSPDR;
    i=bak;
    while((SSPSR&0x04)==0);        
    bak=SSPDR;
    i|=(bak<<8);
    while((SSPSR&0x04)==0);        
    bak=SSPDR;
    i|=(bak<<16);
    while((SSPSR&0x04)==0);        
    bak=SSPDR;
    i|=(bak<<24);
        
    IO1SET=CSF;
    return i;
}
void Program(uint32 addr,volatile uint8 *buf,uint32 len)
{
    OutPownDown();            //唤醒
    PP(addr,256,buf);
    EnterPownDown();            //睡眠
    
}
uint32 BulkErase(void)
{
    uint32 k,i;
    uint8 bak;    
    OutPownDown();        //唤醒
    while((RDSR()&0x01)!=0);    //等待不忙
    WREN();
    IO1CLR=CSF;
    for(i=0;i<30;i++);
    SSPDR=0xC7;
    while((SSPSR&0x10)!=0);
    bak=SSPDR;
    IO1SET=CSF;
    while((RDSR()&0x01)!=0);        //等待不忙
    k= RDID();
    EnterPownDown();            //睡眠
    return k;
}

使用特权

评论回复
板凳
地下水|  楼主 | 2007-10-11 20:35 | 只看该作者

谢谢

非常感谢,调试中,有问题会再提上来

使用特权

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

本版积分规则

5

主题

15

帖子

1

粉丝