打印

lpc2214对K9F2808U0C驱动问题!

[复制链接]
2628|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bethnora9|  楼主 | 2007-2-28 14:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的MCU是LPC2214,外部FLASH为K9F2808U0C,采用IO模拟控制信号对FLASH驱动.没有JTAG调试端口(真失败),数据是串口写入,请问FLASH的读写时序怎么控制.我从给的例子(8051对K9F2808U0C驱动)看到,使用了NOP作为一个机器周期进行时序控制,不知道对ARM7的LPC2214来说.这点该怎么处理.还有的就是地址怎么写入.我的程序是这样写的(以写PAGE为例子): pagenum=blocknum<<5+blockpagenum;(其中pagenum是页在整个NAND FLASH中的位置;blocknum是第几个BLOCK;blockpagenum是所要写入的页在本block中的地址)
接下来;连续写入地址
flash_w_address(0x00);-------行地址写入
flash_w_address(pagenum&0xff);
flash_w_address((pagenum>>8)&0xff);-------列地址写入
但这样写好象没有写进去.我编写了个检测程序,向FLASH的某PAGE中写入0~511,并把它读出来.,结果读出来的数是512个FF;不知道是怎么回事?
请高手指点迷津!谢谢!

相关帖子

沙发
bethnora9|  楼主 | 2007-2-28 14:05 | 只看该作者

需要把我写的相关原程序发上去吗?

使用特权

评论回复
板凳
bethnora9|  楼主 | 2007-2-28 15:41 | 只看该作者

11

把相关的原程序写一下:
最后串口发出的数据为512个FF.
 int main (void)

 PINSEL0|=UART0_TxD|UART0_RxD;            // 设置I/O连接到UART0  ;串口相关
 TIME_DELAY(100);
 UART0_Ini();
 IO_INT();
 FLASH_TEST();
 return 0;
}

/********************************************************************************************************
                                          IO_INT
********************************************************************************************************/
void IO_INT(void)
{
 IO1DIR&=~FLASH_RB;                               //RB--OUT;
 IO1DIR|=FLASH_RE;                                //RE--IN;
 IO2DIR&=~AD0|AD1|AD2|AD3|AD4|AD5|AD6|AD7;        //地址和数据线---OUT;
 IO3DIR|=(FLASH_ALE|FLASH_CE|FLASH_CLE|FLASH_WE); //ALE,CE,CLE,WE--OUT;
}
/********************************************************************************************************
                                          FLASH_W_COMMAND
********************************************************************************************************/
void FLASH_W_COMMAND(unsigned char command)
{
 IO2PIN|=command&0X0FF;
 SET_CLE;                              //cle=1;
 TIME_DELAY(1);
 CLR_WE;                               //we=0;
 TIME_DELAY(1);
 SET_WE;                               //we=1;
 TIME_DELAY(1);
 CLR_CLE;                              //cle=0;
 
}
/********************************************************************************************************
                                          FLASH_W_ADDRESS
********************************************************************************************************/
void FLASH_W_ADDRESS(unsigned char address)
{
 IO2PIN|=address&0X0FF;
 TIME_DELAY(1);
 CLR_WE;
 TIME_DELAY(1);
 SET_WE;
 TIME_DELAY(1);
 CLR_ALE;
 
}
/********************************************************************************************************
                                          FLASH_W_DATA
********************************************************************************************************/
void FLASH_W_DATA(unsigned char data)
{
 IO2PIN|=data&0X0FF;
 TIME_DELAY(1);
 CLR_WE;
 TIME_DELAY(1);
 SET_WE;
 
}
/********************************************************************************************************
                                          FLASH_R_DATA
********************************************************************************************************/
unsigned char FLASH_R_DATA(void)
{
 unsigned int num;
 CLR_RE;
 TIME_DELAY(1);
 num=IO2PIN&0X0FF;
 SET_RE;
 return(num);
 
}
/********************************************************************************************************
                                          FLASH_ERASE_BLOCK
********************************************************************************************************/
unsigned char FLASH_ERASE_BLOCK(unsigned int blocknum)
{
 unsigned char status;
 FLASH_W_COMMAND(0X60);                       //发送擦除命令;
 FLASH_W_ADDRESS((unsigned char)((blocknum<<5)&0XFF));
 FLASH_W_ADDRESS((unsigned char)((blocknum>>3)&0XFF));
 FLASH_W_COMMAND(0XD0);                       //启动擦除;
 TIME_DELAY(100);
 FLASH_W_COMMAND(0X70);                       //启动擦除;
 status=FLASH_R_DATA();                       //读状态;
 if (status&0X01)                             //判断编程是否结束;
 {
  return(0);
 }
 else
 {
  return(1);
 }
}

/********************************************************************************************************
                                          FLASH_R_PAGE
********************************************************************************************************/
void FLASH_R_PAGE(unsigned int blocknum,unsigned int blockpagenum,unsigned char *P,unsigned int data_length)
{
 unsigned int i;
 unsigned int pagenum;
 pagenum=blocknum<<5+blockpagenum;
 FLASH_W_COMMAND(0X00);
 FLASH_W_ADDRESS(0X00);
 FLASH_W_ADDRESS((unsigned char)(pagenum&0XFF));
 FLASH_W_ADDRESS((unsigned char)((pagenum>>8)&0XFF));
 FLASH_W_ADDRESS((unsigned char)((pagenum>>16)&0XFF));
 for(i=0;i<data_length;i++)
 {
  *(P+i)=FLASH_R_DATA();
 }
}
/********************************************************************************************************
                                          FLASH_W_PAGE
********************************************************************************************************/
unsigned char FLASH_W_PAGE(unsigned int blocknum,unsigned int blockpagenum,unsigned char *P,unsigned int data_length)
{
 unsigned int i;
 unsigned char status;
 unsigned int pagenum;
 pagenum=blocknum<<5+blockpagenum;
 FLASH_W_COMMAND(0X00);
 FLASH_W_COMMAND(0X80);
 FLASH_W_ADDRESS(0X00);
 FLASH_W_ADDRESS((unsigned char)(pagenum&0XFF));
 FLASH_W_ADDRESS((unsigned char)((pagenum>>8)&0XFF));
 FLASH_W_ADDRESS((unsigned char)((pagenum>>16)&0XFF));
 for(i=0;i<data_length;i++)
 {
  FLASH_W_COMMAND(*(P+i));
 }
 FLASH_W_COMMAND(0X10);
 TIME_DELAY(100);
 FLASH_W_COMMAND(0X70);
 status=FLASH_R_DATA();
 if (status&0X01)                             //判断编程是否结束;
 {
  return(0);
 }
 else
 {
  return(1);
 }
}
/********************************************************************************************************
                                          TIME_DELAY
********************************************************************************************************/
void TIME_DELAY(unsigned int time)
{
 unsigned int i;
 for (i=0;i<time;i++)
 {
  for (i=0;i<100;i++);      
 }
}
/********************************************************************************************************
                                          FLASH_TEST
********************************************************************************************************/
void FLASH_TEST(void)

  unsigned int i;
  FLASH_ERASE_BLOCK(7);
  for(i=0;i<512;i++)
  {
   TEST1=i;
  }
  FLASH_W_PAGE(7,1,TEST1,512);
  for(i=0;i<512;i++)
  {
   TEST2=0;
  }
  FLASH_R_PAGE(7,1,TEST2,512);
  for(i=0;i<512;i++)
  {
   UART0_SendByte(TEST2);                    //串口发数据;
  }
}
/*********************************************************************************************************
**                            End Of File
**********************************************************************************************************/

使用特权

评论回复
地板
bethnora9|  楼主 | 2007-3-5 16:40 | 只看该作者

没人给我回?我自己搞定了!一切还的靠自己呀.

原来是某个地方没加括号,加上后就行了!HOHO!

使用特权

评论回复
5
ldk060| | 2012-1-17 11:40 | 只看该作者
留个脚印

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝