我怀疑是地址的问题?
0和fff都是0或1
还是代码问题?肯定不是硬件问题吧?
离线
spi 51MHz 读id正常
最近编辑记录 Jin劲 (2018-11-07 09:05:05)
离线
参考一下这个: 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;
}离线
居然没看出差别[捂脸]
离线
搞定了 两个坑 一个还是自己埋的
1.原来SE的addr是sector的首地址 我还以为是 0 1 2 3 4 ... 4095 这样子 sector的序号;
2.正如1一样,我以为是sector的序号,所以我一开始判断addr是否大于max_sector(4096),然后我的错误是直接返回FALSE的(没有错误含义代码,自己坑自己),sector的首地址肯定是4096的倍数(index*4096),所以0号扇区能擦,其他号不能擦就是这样出现的;
离线
搞定了 两个坑 一个还是自己埋的
1.原来SE的addr是sector的首地址 我还以为是 0 1 2 3 4 ... 4095 这样子 sector的序号;
2.正如1一样,我以为是sector的序号,所以我一开始判断addr是否大于max_sector(4096),然后我的错误是直接返回FALSE的(没有错误含义代码,自己坑自己),sector的首地址肯定是4096的倍数(index*4096),所以0号扇区能擦,其他号不能擦就是这样出现的;
居然是这个问题[捂脸]
离线
还有page program可以一次写256以内个任意数目byte, 但是不能跨sector写,会到sector临界停止。
离线