我怀疑是地址的问题?
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临界停止。
离线