您尚未登录。

楼主 #1 2018-11-07 09:02:24

Jin劲
会员
注册时间: 2018-04-06
已发帖子: 217
积分: 217

为啥我只能擦nor的0和fff扇区

我怀疑是地址的问题?
0和fff都是0或1
还是代码问题?肯定不是硬件问题吧?
none_20181106-2001.png

离线

楼主 #2 2018-11-07 09:04:44

Jin劲
会员
注册时间: 2018-04-06
已发帖子: 217
积分: 217

Re: 为啥我只能擦nor的0和fff扇区

spi 51MHz 读id正常

最近编辑记录 Jin劲 (2018-11-07 09:05:05)

离线

#3 2018-11-07 09:07:49

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,245
积分: 9197

Re: 为啥我只能擦nor的0和fff扇区

参考一下这个: https://github.com/qq516333132/camdroid/blob/master/lichee/linux-3.4/drivers/mtd/devices/m25p80.c

/*
 * Erase one sector of flash memory at offset ``offset'' which is any
 * address within the sector which should be erased.
 *
 * Returns 0 if successful, non-zero otherwise.
 */
static int erase_sector(struct m25p *flash, u32 offset)
{
	pr_debug("%s: %s %dKiB at 0x%08x\n", dev_name(&flash->spi->dev),
			__func__, flash->mtd.erasesize / 1024, offset);

	/* Wait until finished previous write command. */
	if (wait_till_ready(flash)) {
		printk("erase_sector fail \n");
		return 1;
	}

	/* Send write enable, then erase commands. */
	write_enable(flash);

	/* Set up command buffer. */
	flash->command[0] = flash->erase_opcode;
	m25p_addr2cmd(flash, offset, flash->command);

	spi_write(flash->spi, flash->command, m25p_cmdsz(flash));

	return 0;
}

地址到命令的计算公式:

static void m25p_addr2cmd(struct m25p *flash, unsigned int addr, u8 *cmd)
{
	/* opcode is in cmd[0] */
	cmd[1] = addr >> (flash->addr_width * 8 -  8);
	cmd[2] = addr >> (flash->addr_width * 8 - 16);
	cmd[3] = addr >> (flash->addr_width * 8 - 24);
	cmd[4] = addr >> (flash->addr_width * 8 - 32);
}

static int m25p_cmdsz(struct m25p *flash)
{
	return 1 + flash->addr_width;
}




离线

楼主 #4 2018-11-07 11:49:30

Jin劲
会员
注册时间: 2018-04-06
已发帖子: 217
积分: 217

Re: 为啥我只能擦nor的0和fff扇区

居然没看出差别[捂脸]

离线

楼主 #5 2018-11-08 08:58:08

Jin劲
会员
注册时间: 2018-04-06
已发帖子: 217
积分: 217

Re: 为啥我只能擦nor的0和fff扇区

搞定了 两个坑 一个还是自己埋的
1.原来SE的addr是sector的首地址 我还以为是 0 1 2 3 4 ... 4095 这样子 sector的序号;
2.正如1一样,我以为是sector的序号,所以我一开始判断addr是否大于max_sector(4096),然后我的错误是直接返回FALSE的(没有错误含义代码,自己坑自己),sector的首地址肯定是4096的倍数(index*4096),所以0号扇区能擦,其他号不能擦就是这样出现的;

离线

#6 2018-11-08 09:27:47

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,245
积分: 9197

Re: 为啥我只能擦nor的0和fff扇区

Jin劲 说:

搞定了 两个坑 一个还是自己埋的
1.原来SE的addr是sector的首地址 我还以为是 0 1 2 3 4 ... 4095 这样子 sector的序号;
2.正如1一样,我以为是sector的序号,所以我一开始判断addr是否大于max_sector(4096),然后我的错误是直接返回FALSE的(没有错误含义代码,自己坑自己),sector的首地址肯定是4096的倍数(index*4096),所以0号扇区能擦,其他号不能擦就是这样出现的;

居然是这个问题[捂脸]





离线

楼主 #7 2018-11-08 10:33:30

Jin劲
会员
注册时间: 2018-04-06
已发帖子: 217
积分: 217

Re: 为啥我只能擦nor的0和fff扇区

还有page program可以一次写256以内个任意数目byte, 但是不能跨sector写,会到sector临界停止。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn