Nand Flash行地址和列地址的计算
不说废话,直接上图。
从图中可以看出Nand Flash有2048Blocks,每个Block有64页,每一页含有2K的用户可以使用的数据和64B的OOB。对于用户来说这64B的数据时不用操作的,读写的时候也会忽略这部分。也就是说用户在读这一页数据的时候只会发出11位地址,不会发出12位地址(12位地址包含了读写OOB)。
举一个例子:
加入user想读0x60000地址处的数据,那么:
column_address = 0x60000 % 2048
row_address = 0x60000 / 2048;
由于地址和数据都是通过8位引脚发送的,所以:
第一个周期发送的地址是: 0x60000 & 0xff 或column_address & 0xff;
第二个周期发送的地址为:(0x60000 >> 8) & 0x07或(column_address >> 8) & 0x07;
第三个周期发送的地址为:(0x60000 >> 11) & 0xff,这里是右移11位,不是12位,或row_address & 0xff;
第四个周期发送的地址为:(0x60000 >> 19) & 0xff,或(row_address >> 8) & 0xff;
最后一个周期发送的地址为:(0x60000 >> 27) & 0x01,或(row_address >> 16) & 0x01。
注意:个人觉得关于地址的计算,应该用户要读取数据地址的从出发点考虑,用户读数据时是不关心OOB的,只关心正常读取的数据。