韦东山Linux嵌入式课程社区
直播中

李红梅

8年用户 178经验值
私信 关注

为什么韦东山老师第一期nand flash硬件上没有效果?

开发板是s3c2440,nand flash型号是K9F2G08U0C,其中的头文件里面包含所有寄存器的地址
已经用点灯方式测试过每个函数都有运行过,反汇编文件里也显示0x30000000有main函数,
可是硬件上就是没有效果,能帮我的话,可以私信我一下 我把源码发给你
head.o函数:


.text
.global _start
_start:
ldrsp, = 4096
bldisable_watch_dog
blmemsetup
blnand_init


ldr r0,=0x30000000
movr1,#4096
movr2,#1024
blnand_read


ldrsp, =0x34000000
ldrlr, =halt_loop
ldrpc,=main


halt_loop:
bhalt_loop








nand.c函数:


#include "s3c2440.h"


#define BUSY 1


void nand_init();
void nand_read(unsigned char *buf, unsigned long start_addr, int size);


static void s3c2440_nand_reset(void);
static void s3c2440_wait_idle(void);
static void s3c2440_nand_select_chip(void);
static void s3c2440_nand_deselect_chip(void);
static void s3c2440_write_cmd(int cmd);
static void s3c2440_write_addr(unsigned int addr);
static unsigned char s3c2440_read_data(void);


static void s3c2440_nand_reset()
{
s3c2440_nand_select_chip();
s3c2440_write_cmd(0xff);
s3c2440_wait_idle();
s3c2440_nand_deselect_chip();
}


static void s3c2440_wait_idle()
{
int i;
volatile unsigned char *p = (volatile unsigned char *)&NFSTAT;
while (!(*p & BUSY))
for (i = 0; i < 10; i++);
}


static void s3c2440_nand_select_chip(void)
{
int i;
NFCONT &= ~(1 << 1);
for (i = 0; i < 10; i++);
}


static void s3c2440_nand_deselect_chip(void)
{
NFCONT |= (1 << 1);
}


static unsigned char s3c2440_read_data(void)
{
volatile unsigned char *p = (volatile unsigned char *)&NFDATA;
return *p;
}


static void s3c2440_write_cmd(int cmd)
{
volatile unsigned char *p = (volatile unsigned char *)&NFCMD;
*p = cmd;
}


#define NAND_SECTOR_SIZE_LP 4096
#define NAND_BLOCK_MASK_LP (NAND_SECTOR_SIZE_LP - 1)


static void s3c2440_write_addr(unsigned int addr)
{
int i;
volatile unsigned char *p = (volatile unsigned char *)&NFADDR;
int col, page;


col = addr & NAND_BLOCK_MASK_LP;
page = addr / NAND_SECTOR_SIZE_LP;

*p = col & 0xff;/* Column Address A0~A7 */
for(i=0; i<10; i++);
*p = (col >> 8) & 0x0f; /* Column Address A8~A11 */
for(i=0; i<10; i++);
*p = page & 0xff;/* Row Address A12~A19 */
for(i=0; i<10; i++);
*p = (page >> 8) & 0xff;/* Row Address A20~A27 */
for(i=0; i<10; i++);
*p = (page >> 16) & 0x01;/* Row Address A28~A29 */
for(i=0; i<10; i++);
}


void nand_init(void)
{
#define TACLS 0
#define TWRPH0 3
#define TWRPH1 0
/* 设置时序 */
NFCONF = (TACLS << 12) | (TWRPH0 << 8) | (TWRPH1 << 4);
/* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */
NFCONT = (1 << 4) | (1 << 1) | (1 << 0);

s3c2440_nand_reset();
}


#define NAND_SECTOR_SIZE 2048
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
void nand_read(unsigned char *buf, unsigned long start_addr, int size)
{
int i, j;
if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
return; /* 地址或长度不对齐 */
}

/* 选中芯片 */
s3c2440_nand_select_chip();

for (i = start_addr; i < (start_addr + size);) {
/* 发出READ0命令 */

s3c2440_write_cmd(0);


/* Write Address */
s3c2440_write_addr(i);

s3c2440_write_cmd(0x30);

s3c2440_wait_idle();


for (j = 0; j < NAND_SECTOR_SIZE; j++, i++) {
*buf = s3c2440_read_data();
buf++;

}
}
/* 取消片选信号 */
s3c2440_nand_deselect_chip();
return;
}

回帖(5)

h1654155275.5994

2019-8-12 09:09:02
你用是MINI2440,还是QT2440学习板
举报

刘婷婷

2019-8-12 09:16:06
TQ2440。我也有同样的问题。
举报

张涛

2019-8-12 09:32:57
楼主解决了没有   我也是同样的问题
举报

王官君

2019-8-12 09:48:55
没记错的话是这句   *p = (col >> 8) & 0x0f; /* Column Address A8~A11 */   没有A8,A9开始。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分