|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
关于k9f6408的读写!! |
作者:btiger2000 栏目:嵌入式系统 |
关于K9F6408的读写!! K9F6408,能读出id,可以擦出,但是读写不对! 对第一块的0页写入全0x55,读出 0页为0x55;但是2,4,6,8,。。14 ,读出都为乱码!可是并未对其他页操作!,不知为何?! 还请做过的大虾执教!! |
2楼: | >>参与讨论 |
作者: BTIGER2000 于 2005/8/25 9:27:00 发布:
没人做过么? |
3楼: | >>参与讨论 |
作者: btiger2000 于 2005/8/26 8:35:00 发布:
没人指点一下!? |
4楼: | >>参与讨论 |
作者: btiger2000 于 2005/8/26 11:27:00 发布:
程序 #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楼: | >>参与讨论 |
作者: 赵崇伟 于 2005/8/28 11:47:00 发布:
太复杂了,玩玩就算了,一般都可以放弃 |
6楼: | >>参与讨论 |
作者: BTIGER2000 于 2005/8/29 10:42:00 发布:
问题我不是在玩啊!不是说放弃就放弃的! |
7楼: | >>参与讨论 |
作者: embestinfo 于 2005/8/30 19:00:00 发布:
可以咨询英蓓特 想解决这个问题,可以咨询英蓓特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 于 2005/8/31 13:53:00 发布:
上面的,你说的是编程器? |
9楼: | >>参与讨论 |
作者: videohome 于 2005/9/1 20:55:00 发布:
这是我自己写的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 于 2005/9/2 16:44:00 发布:
我研究一下!谢了 |
11楼: | >>参与讨论 |
作者: btiger2000 于 2005/9/5 21:05:00 发布:
问题解决!!是硬件问题! 看来还是不能直接接5v得i/o!! |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |