登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

关于k9f6408的读写!!

作者:btiger2000 栏目:嵌入式系统
关于K9F6408的读写!!
关于K9F6408的读写!!

K9F6408,能读出id,可以擦出,但是读写不对!

对第一块的0页写入全0x55,读出 0页为0x55;但是2,4,6,8,。。14 ,读出都为乱码!可是并未对其他页操作!,不知为何?!
还请做过的大虾执教!!

2楼: >>参与讨论
BTIGER2000
没人做过么?
 
3楼: >>参与讨论
btiger2000
没人指点一下!?
 
4楼: >>参与讨论
btiger2000
程序


#include  "\ucos251\include\includes.h"
#include  "\bsp188es\include\bsp.h"
#include  "\proj\include\nand.h"
#include  "\bsp188es\include\pio.h"


#define nand_select() ce(0)
#define nand_deselect() ce(1)

#define CS  INT5
#define CLE CTS0
#define ALE RTS0
#define F_RB TMRIN1
#define WP  TMROUT1

/*
*********************************************************************************************************
*
*********************************************************************************************************
*/
void nand_init(void)
{
    pio_mode(INT5, OUT_DIR);
    pio_mode(CTS0, OUT_DIR);
    pio_mode(RTS0, OUT_DIR);
    pio_mode(TMROUT1, OUT_DIR);
    pio_mode(TMRIN1, IN_W_PULL);
    pio_out(WP,1);
//    flash_reset();
    cle(0);
    ale(0);
    nand_deselect();
}

/*
*********************************************************************************************************
*
*********************************************************************************************************
*/
void ce(INT8U ce)
{
    pio_out(CS, ce);
}

void ale(INT8U h)
{
    pio_out(ALE, h);
}

void cle(INT8U cle)
{
    pio_out(CLE, cle);
}

uchar Flash_RB(void)
{
     return pio_in(F_RB);
}

void flash_reset(void)
{
   uchar d,i;
   nand_select();
    command(0xff);
/*   do{
      command(0x70);
      d = Bsp_Inportb(NAND_ADDR);
      d=d&0x40;
   }while(d!=0x00);       */
   nand_deselect();
   for(i=0;i<255;i++)
       delay();
}
void delay(void)
{
    INT16U i;
   for(i=0;i<25;i++)
         ;
}


/*
*********************************************************************************************************
*
*********************************************************************************************************
*/
/*INT8U nand_get_ready(void)
{
    return  Bsp_Inportw(0xff74) & 0xfff1;
} */

void command(INT8U cmd)
{
    cle(1);
    Bsp_Outportb(NAND_ADDR, cmd);
    cle(0);
}

/*************************************************************************************************/

void address(INT16U row, INT8U column)
{
    ale(1);
    Bsp_Outportb(NAND_ADDR, column);
//    ale(0);
//    delay();
//    ale(1);
    Bsp_Outportb(NAND_ADDR,  row&0xff);
//    ale(0);
//    delay();
//[    ale(1);
    Bsp_Outportb(NAND_ADDR, (row>>8)&0xff);
    ale(0);
}

/***********************************************************************/
INT8U erase_block(INT16U row )
{
    INT8U d;
     nand_select();
    row<<=4;
    command(0x60);
   // address(row,column);
    ale(1);
    Bsp_Outportb(NAND_ADDR,  row&0xff);
    ale(0);
    delay();
    ale(1);
    Bsp_Outportb(NAND_ADDR, (row>>8)&0xff);
    ale(0);
    command(0xd0);
    delay();
    delay();
     command(0x70);
    do{
       d = Bsp_Inportb(NAND_ADDR);
       d=d&0x01;
    }while(d!=0x00);
    nand_deselect();
/*    if(d&0x01)
      return 1;
    else                  */
      return 0;
}

INT8U read_id(void)
{
    INT8U id;

    nand_select();

    command(0x90);
    ale(1);
    Bsp_Outportb(NAND_ADDR, 0x0);
    ale(0);
    id = Bsp_Inportb(NAND_ADDR);
    id = Bsp_Inportb(NAND_ADDR);

    nand_deselect();

    return id;
}

INT8U read_byte(INT16U row, INT8U column)
{
    INT8U d;

    nand_select();

    command(0x50);
    address(row, column);
    OSTimeDly(1);
    d = Bsp_Inportb(NAND_ADDR);

    nand_deselect();

    return d;
}

INT8U write_page(INT16U row,INT8U column,INT8U *addr)
{
    INT16U i;
    INT8U  d;
     nand_select();

//    command(0x00);
    command(0x80);
//    OSTimeDly(1);
    delay();
//    delay();
    address(row,column);
    delay();
//    delay();
    for(i=0;i<480;i++)
    {
       Bsp_Outportb(NAND_ADDR, addr][i]);
     delay();
    }
    delay();
    command(0x10);
//    for(i=0;i<100;i++)
         delay();

    while(!Flash_RB());
     command(0x70);
    do{


       d = Bsp_Inportb(NAND_ADDR);
       d=d&0x01;

    }while(d!=0x00);

    nand_deselect();
/*   if(d&0x01)
      return 1;
    else           */
      return 0;


}



INT8U read_page(INT16U row,INT8U column,INT8U * addr1)
{
    INT16U i;
    INT8U  d;

    nand_select();

    command(0x00);
    address(row,column);
//    OSTimeDly(1);
    delay();
    while(!Flash_RB());

   
5楼: >>参与讨论
赵崇伟
太复杂了,玩玩就算了,一般都可以放弃
 
6楼: >>参与讨论
BTIGER2000
问题我不是在玩啊!不是说放弃就放弃的!
 
7楼: >>参与讨论
embestinfo
可以咨询英蓓特
想解决这个问题,可以咨询英蓓特FLASH.html">FLASH烧写产品FLASH.html">FLASH Programmer.
http://www.embedinfo.com/chinese/product/flashprog.asp

FLASH编程器(Embest Online FLASH.html">FLASH Programmer)
主要特性:
支持所有基于ARM7和ARM9核的处理器
ATMEL公司AT91系列, CIRRUS公司EP73系列,SAMSUNG公司S3C系列。

支持大多数厂家生产的FLASH芯片
如AMD公司AM29系列,INTEL公司28系列,SST公司29\39\49系列。

支持对FLASH进行空白检查、擦除、编程、文件校验、计算校验和、保护、上载

支持指定扇区范围操作,不影响其他扇区内容

支持8位、16位和32位读写访问宽度

支持1片、2片及4片FLASH编程,编程文件无需劈分

支持Windows 98\ME\XP及Windows NT\2000操作系统



   
其他特点:
编程配置数据的保存和载入

编程前的用户电路板测试功能

FLASH各扇区地址及大小指示功能

简单直接的处理器寄存器设置

详尽完善的中、英文手册



8楼: >>参与讨论
btiger2000
上面的,你说的是编程器?
 
9楼: >>参与讨论
videohome
这是我自己写的K9F5608的驱动,已应用到产品了,放心使用!

#include    "K9F5608.hpp"

/************************************
ALE:PF2
CLE:PF1
CS :PF0
NAND FLASH操作说明:
32M NAND FLASH分为2024块,每块为32页,每一页有528字节,
地址A9-A23是选择哪对应的页,而A0-A7是页内偏移
************************************/

#define     NAND_ADDR    0x4C000006    //nGCS1起始地址
//#define    _NAND_DEBUG_

#ifdef    _NAND_DEBUG_
int uart_printf(const CHAR *fmt,...);
void    dumpmem(CHAR* buf,int len);
#endif

static inline void NAND_CS_HI(void)    //GPIO->pfdr|=1
{
    CHAR    pfdr;
    HAL_READ_UINT8(PFDR,pfdr);
    pfdr |= 1;
    HAL_WRITE_UINT8(PFDR,pfdr);
}        
static inline void NAND_CS_LOW(void)//GPIO->pfdr&=~1
{
    CHAR    pfdr;
    HAL_READ_UINT8(PFDR,pfdr);
    pfdr&=~1;
    HAL_WRITE_UINT8(PFDR,pfdr);
}
static inline void NAND_ALE_HI(void)//GPIO->pfdr|=4
{
    CHAR    pfdr;
    HAL_READ_UINT8(PFDR,pfdr);
    pfdr|= 4;
    HAL_WRITE_UINT8(PFDR,pfdr);
}                        
static inline void NAND_ALE_LOW(void)//     GPIO->pfdr&=~4
{
    CHAR    pfdr;                
    HAL_READ_UINT8(PFDR,pfdr);    
    pfdr&=~4;                    
    HAL_WRITE_UINT8(PFDR,pfdr);    
}
static inline void NAND_CLE_HI(void)
{
    CHAR    pfdr;                
    HAL_READ_UINT8(PFDR,pfdr);    
    pfdr|=2;                    
    HAL_WRITE_UINT8(PFDR,pfdr);
}        
                        
static inline void NAND_CLE_LOW(void)
{
    CHAR    pfdr;
    HAL_READ_UINT8(PFDR,pfdr);
    pfdr&=~2;
    HAL_WRITE_UINT8(PFDR,pfdr);
}

static inline void INIT_NAND_IO()
{
    CHAR    pfdr;
    HAL_READ_UINT8(PFDDR,pfdr);
    pfdr|=7;
    HAL_WRITE_UINT8(PFDDR,pfdr);
    
    HAL_READ_UINT8(PFDR,pfdr);
    pfdr|=1;
    HAL_WRITE_UINT8(PFDR,pfdr);
    
    HAL_READ_UINT8(PBDDR,pfdr);
    pfdr&=~0x20;
    HAL_WRITE_UINT8(PBDDR,pfdr);
}                        

#define        NAND_BSY            0
#define        NAND_RDY            0x20

#define        CMD_RD                0
#define        CMD_WRSTART            0x80
#define        CMD_WROVER             0x10

#define     CMD_ERASESTART      0x60
#define     CMD_ERASEOVER       0xD0

#define     CMD_RDSTATUS        0x70
#define     CMD_RDID            0x90

#define        CMD_RESET            0xFF
cyg_mutex_t    nand_mutex;
//RNB        PB5
static inline void    Delay(int    iDly)
{
    while(iDly--);
}
void nand_init(void)
{
    cyg_mutex_init(&nand_mutex);
}
CHAR    nand_readstatus(void)
{
    CHAR    cStatus;
    NAND_CLE_HI();
    HAL_WRITE_UINT8(NAND_ADDR,0x70);
    NAND_CLE_LOW();
    HAL_READ_UINT8(NAND_ADDR,cStatus);
    return    cStatus;
}
void    nand_reset(void)
{
    INIT_NAND_IO();
    NAND_CS_LOW();
    
    NAND_CLE_HI();
    HAL_WRITE_UINT8(NAND_ADDR,CMD_RESET);
    NAND_CLE_LOW();
    while(0 == (nand_readstatus()&0x40));
}
void    nand_readid(CHAR* pID)
{
    INIT_NAND_IO();
    NAND_CS_LOW();
    
    NAND_CLE_HI();
    HAL_WRITE_UINT8(NAND_ADDR,CMD_RDID);
    NAND_CLE_LOW();
  
    NAND_ALE_HI();    
    HAL_WRITE_UINT8(NAND_ADDR,0);
    NAND_ALE_LOW();

    HAL_READ_UINT8(NAND_ADDR,*pID++);
    HAL_READ_UINT8(NAND_ADDR,*pID++);
      NAND_CS_HI();
}
bool    nand_page_read_check(int nAddr,int nLen,CHAR* pData)
{
    int    i;
    CHAR   cPageOffset;
    CHAR    c;
    SHORT  nPageSelect;
    SHORT  nBankSelect;

    INIT_NAND_IO();
    NAND_CS_LOW();
    
    nBankSelect = nAddr/256;
    cPageOffset = nAddr%256;

    nPageSelect = ((nAddr>>9)&0xFFFF);
    
    
    NAND_CLE_HI();
   &nbs
10楼: >>参与讨论
btiger2000
我研究一下!谢了
 
11楼: >>参与讨论
btiger2000
问题解决!!是硬件问题!   看来还是不能直接接5v得i/o!!
 
参与讨论
昵称:
讨论内容:
 
 
相关帖子
如何上载资料呀?
求助MC68HC908SR12的问题
请教:我这三行的程序 debug 时都不能通过?
做STB,LCD TV,MP3消费类电子的嵌入式系统开发的朋友啊?
请教的FPGA的主要生产商有那些,还有FPGA的优势在哪些方面?谢谢
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号