打印

有人用单片机操作过并行NOR Flash么?

[复制链接]
2344|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lmlaizhou|  楼主 | 2011-2-23 21:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
lmlaizhou|  楼主 | 2011-2-23 21:25 | 只看该作者
parameter block与main block有什么区别

使用特权

评论回复
板凳
xyz555| | 2011-2-24 16:00 | 只看该作者
NOR FLASH种类太多了,每个公司的FLASH操作方法也不一样,不知道LZ说的是哪个公司的?

使用特权

评论回复
地板
QuakeGod| | 2011-2-24 18:40 | 只看该作者
如果不将NOR FLASH 作为BIOS的话,完全可以当做EPROM来操作。

使用特权

评论回复
5
lmlaizhou|  楼主 | 2011-3-1 19:17 | 只看该作者
JS28F256P30型号的NOR flash,就是当成EPROM来用呀,写了个程序,有时候好用有时候不好用,比方说0x210000这个存储单元的数据,未写的时候读数据是0xFF,应该是正确的;擦写的时候就不行了,读出来的都是0x00;大家帮帮忙呀!我是没办法了

使用特权

评论回复
6
lmlaizhou|  楼主 | 2011-3-1 19:22 | 只看该作者
#include  "msp430x26x.h"

void delay(int t)                               //长时间延时子程序
{
        int i,j;
        for(i=0;i<t;i++)
        {
                for(j=0;j<1000;j++)
                {
                  ;
                }
               
        }
}

unsigned short GetOneHalfword()
{
  unsigned short halfword;
  P1SEL=0x00;
  P2SEL=0x00;
  P1DIR=0x02;//P1.0=/WP  P1.1=/WE  P1.7=WAIT
  P2DIR=0x0e;//P2.1=/CE  P2.2=/OE  P2.3=/RST  P2.4=CLK
  P1OUT|=BIT1; //写禁止

  
  P4SEL=0x00;
  P5SEL=0x00;
  
  P4DIR=0x00;
  P5DIR=0x00;
  
  P2OUT&=~BIT1;//片选使能
  

  
  P2OUT&=~BIT2;//输出使能
  

  
  halfword=P5IN;
  halfword<<=8;
  halfword+=P4IN;
  
  P2OUT|=BIT2;//输出禁止
  P2OUT|=BIT1;//片选禁止
   
  return halfword;
  
}

void SendCommand(unsigned long addr,unsigned short data)
{
  P1SEL=0x00;
  P2SEL=0x00;
  
  P1DIR=0x02;//P1.0=/WP  P1.1=/WE  P1.7=WAIT
  P2DIR=0x0e;//P2.1=/CE  P2.2=/OE  P2.3=/RST  P2.4=CLK
  P2OUT|=BIT3;
  
  P4SEL=0x00;
  P5SEL=0x00;
  
  P4DIR=0xff;//P5 高8位数据,P4 低8位数据
  P5DIR=0xff;
  
  P6SEL=0x00;
  P7SEL=0x00;
  P8SEL=0x00;
  
  P6DIR=0xff;//地址
  P7DIR=0xff;
  P8DIR=0xff;
  
  P7OUT=addr;
  P6OUT=addr>>8;
  P8OUT=addr>>16;
  
  P4OUT=data;
  P5OUT=data>>8;
  
  P2OUT|=(BIT1+BIT2);  //P2.1=/CE  P2.2=/OE  P2.3=/RST  P2.4=CLK
  P1OUT|=BIT1;  //P1.0=/WP  P1.1=/WE  P1.7=WAIT
  

  
  P2OUT&=~BIT1;//  /CE

  P1OUT&=~BIT1;//   /WE

  P1OUT|=BIT1; //   /WE
  
  P2OUT|=BIT1; //  /CE
  
}



void Reset()
{
  P2SEL&=~BIT3;
  P2DIR|=BIT3;//P2.1=/CE  P2.2=/OE  P2.3=/RST  P2.4=CLK
  P2OUT&=~BIT3;
  for(int i=0;i<5;i++) ;
  P2OUT|=BIT3;

}

unsigned short ReadOneHalfword(unsigned long addr)
{
  
  unsigned short halfword;
  SendCommand(addr,0xff);
  halfword=GetOneHalfword();
  return halfword;
}

void Unlock(unsigned long addr)
{
  Reset();
  
  SendCommand(addr,0x60);
  
  SendCommand(addr,0xd0);

}

void Erase(unsigned long addr)
{
  Unlock(addr);
  SendCommand(addr,0x20);
  
  SendCommand(addr,0xd0);

  delay(300);
}

void WriteOneHalfword(unsigned long addr,unsigned short data)
{
  SendCommand(addr,0x40);
  
  SendCommand(addr,data);

  
}

void CLearStatusRegister(unsigned long addr)
{
  SendCommand(addr,0x50);
}
void main(void)
{
  char high,low;
  unsigned short halfword;

  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)                                    
  {  
    while(1);                               // If calibration constants erased
                                           // do not load, trap CPU!!
  }  
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
  DCOCTL = CALDCO_1MHZ;
  
  UCA0CTL1 |= UCSWRST;
  P3SEL = 0x30;                             // P3.4,5 = USCI_A0 TXD/RXD
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 8;                              // 1MHz 115200
  UCA0BR1 = 0;                              // 1MHz 115200
  UCA0MCTL = UCBRS2 + UCBRS0;               // Modulation UCBRSx = 5
  UCA0CTL1 &= ~UCSWRST;                // **Initialize USCI state machine**

  
  Erase(0x310000);
  for(int j=0;j<50;j++)
   
  WriteOneHalfword(0x310000+j,j+1);
  

for(int j=0;j<50;j++)
{  
  halfword=ReadOneHalfword(0x310000+j);
  low=halfword;
  high=halfword>>8;
}
  
}

使用特权

评论回复
7
lmlaizhou|  楼主 | 2011-3-1 19:23 | 只看该作者
帮忙给看看上面的程序,晶振是32.768KHz

使用特权

评论回复
8
lmlaizhou|  楼主 | 2011-3-1 19:26 | 只看该作者
QQ:19775938
email:lmlaizhou@qq.com

使用特权

评论回复
9
lmlaizhou|  楼主 | 2011-3-1 19:33 | 只看该作者
JS28F256P30的PDF文档

NOR_flash.pdf

2.12 MB

使用特权

评论回复
10
lmlaizhou|  楼主 | 2011-3-2 13:54 | 只看该作者
擦除数据后,批量写一些数据,比如说50个,会有写得不正确的,而且不正确的数基本上都是0xFFFF(擦除完成后的存储单元的状态)以及0x40(写数据是要发两个命令,一个是往要写的地址处发0x40,另一个是往要写的地址处写的数据)

使用特权

评论回复
11
lmlaizhou|  楼主 | 2011-3-2 13:55 | 只看该作者
真么没人踩呀?沉了?

使用特权

评论回复
12
51arm.net| | 2011-3-3 16:47 | 只看该作者
mark

使用特权

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

本版积分规则

12

主题

47

帖子

0

粉丝