辨析NOR FLASH地址左右移的问题

norflash芯片手册command如下:

在这里插入图片描述

下面是2240对norflash的 一些操作:

擦除:
在这里插入图片描述
烧录:
在这里插入图片描述

读取:
在这里插入图片描述

问1:同样是操作norflash,为什么cpu发出norflash芯片手册中解锁等命令时,传参时addr不需要右移,cpu烧录起始地址或发送要擦除扇区地时就得右移呢

注意:nor_cmd函数里已经左移一位了
在这里插入图片描述

答1:

我们通过NOR FLASH的芯片手册得知,要实现解锁功能:要往地址0X555写入0XAA等等几个操作,因为我们是通过NOR的手册查看到的,那么这里肯定是从NOR角度看到的地址,也就是说我们要往第0X555个16位的地址里写入0XAA,因为地址线是错开的缘故,我们CPU必须把地址左移一位后再发生给NOR,这样才能真正地把0XAA写到NOR的第0X555地址里去。

而发送扇区地址的时候,因为我们人操纵的是CPU,所以我们的角度和CPU是一样的,我们也认为NOR是2M * 8bit,而不是1M * 16bit,比如我们要清除地址为0X001F0000时,0X001F0000代表的是第0X001F0000个8bit的地址,因为地址线是错开的原因,我们直接发送CPU角度的地址出去就好,但又因为nor_cmd函数里已经左移一位了,所以我们要提前右移一位以抵消左移的操作。(为什么把NOR看成是2M * 8bit的时候就直接把地址发送出去而不用左移一位呢,这就和cpu内存控制器有关了)

总结就是角度不同,发送扇区地址的时候,我们是站在cpu内存控制器位筛选后的角度,即此时我们将norflash看做2M * 8bit,而NOR FLASH的芯片手册中的解锁功能是站在norflash自己的角度来要求CPU地址总线发出地址的,它自认为自己是1M * 16bit

问2:(addr >> 1) << 1 可能会丢位

提前右移一位以抵消左移的操作,即(addr >> 1) << 1 ,举个例子:
假如我们想把0x11作为起始烧录地址
addr = 0x11 , 则 ((addr >> 1) << 1) = 0x10
细心点会发现,哎?右移一位导致丢位了啊!!
再看
addr = 0x10 , 则 ((addr >> 1) << 1) = 0x10
也就是说,输入addr=2或3(CPU角度的 norflash 为 2M * 8bit),起始烧录地址都对应 1M * 16bit 的 norflash的1(本来是 1 0 ,但 norflash 的 A0 接了CPU的 A1)
为什么要限制?

答2:(注意:为方便说明,我们将起始内存单元称之为第零个内存单元)

之所以这样,是因为我们操作的norflash 是16bit 宽度的,连接如下,可以发现是错位连接的

在这里插入图片描述
这是一种好的烧录习惯,作此限制可以保证我们的起始烧录地址或起始擦除地址是16bit 对齐的
在这里插入图片描述
在这里插入图片描述

问3:为什么把NOR看成是2M * 8bit进行读取访问的时候就直接把地址发送出去而不用左移一位呢

答3:

针对问题3,**内存控制器**绝对是劳苦功高: 示意图如下:
在这里插入图片描述

addr = 0x11 由于norflash的A1接CPU的A0,所以norflash看到的实际上是它1M *16bit的第1个16bit单元,在数据经内存控制器返回CPU时,内存控制器用A0=1,去挑出nor第一个16bit的低8位(注意:这里的示意图为低位在前,仅为了方便观察;实际也有可能是高位在前,如果是高位在前,则内存控制器用A0=1,去挑出nor第一个16bit的高8位)
我们将16bit位宽的norflash看做2M * 8bit, addr = 0x11 ,我们也的确访问到了norflash第3个8bit单元
同理,假如addr = 0x10,我们也的确访问到了2M * 8bit的norflash的第2个8bit单元
所以,这种错位连接实际上保留了内存控制器选择内存单元的权利,即:内存控制器利用被错开的A0去选择内存单元的高低位。

本文参考了韦东山老师的讲解已及关于NOR FLASH地址左右移的问题,特此感谢
如有问题,欢迎评论区指出批评。

发布了96 篇原创文章 · 获赞 3 · 访问量 1万+

norflash芯片手册command如下:

在这里插入图片描述

下面是2240对norflash的 一些操作:

擦除:
在这里插入图片描述
烧录:
在这里插入图片描述

读取:
在这里插入图片描述

问1:同样是操作norflash,为什么cpu发出norflash芯片手册中解锁等命令时,传参时addr不需要右移,cpu烧录起始地址或发送要擦除扇区地时就得右移呢

注意:nor_cmd函数里已经左移一位了
在这里插入图片描述

答1:

我们通过NOR FLASH的芯片手册得知,要实现解锁功能:要往地址0X555写入0XAA等等几个操作,因为我们是通过NOR的手册查看到的,那么这里肯定是从NOR角度看到的地址,也就是说我们要往第0X555个16位的地址里写入0XAA,因为地址线是错开的缘故,我们CPU必须把地址左移一位后再发生给NOR,这样才能真正地把0XAA写到NOR的第0X555地址里去。

而发送扇区地址的时候,因为我们人操纵的是CPU,所以我们的角度和CPU是一样的,我们也认为NOR是2M * 8bit,而不是1M * 16bit,比如我们要清除地址为0X001F0000时,0X001F0000代表的是第0X001F0000个8bit的地址,因为地址线是错开的原因,我们直接发送CPU角度的地址出去就好,但又因为nor_cmd函数里已经左移一位了,所以我们要提前右移一位以抵消左移的操作。(为什么把NOR看成是2M * 8bit的时候就直接把地址发送出去而不用左移一位呢,这就和cpu内存控制器有关了)

总结就是角度不同,发送扇区地址的时候,我们是站在cpu内存控制器位筛选后的角度,即此时我们将norflash看做2M * 8bit,而NOR FLASH的芯片手册中的解锁功能是站在norflash自己的角度来要求CPU地址总线发出地址的,它自认为自己是1M * 16bit

问2:(addr >> 1) << 1 可能会丢位

提前右移一位以抵消左移的操作,即(addr >> 1) << 1 ,举个例子:
假如我们想把0x11作为起始烧录地址
addr = 0x11 , 则 ((addr >> 1) << 1) = 0x10
细心点会发现,哎?右移一位导致丢位了啊!!
再看
addr = 0x10 , 则 ((addr >> 1) << 1) = 0x10
也就是说,输入addr=2或3(CPU角度的 norflash 为 2M * 8bit),起始烧录地址都对应 1M * 16bit 的 norflash的1(本来是 1 0 ,但 norflash 的 A0 接了CPU的 A1)
为什么要限制?

答2:(注意:为方便说明,我们将起始内存单元称之为第零个内存单元)

之所以这样,是因为我们操作的norflash 是16bit 宽度的,连接如下,可以发现是错位连接的

在这里插入图片描述
这是一种好的烧录习惯,作此限制可以保证我们的起始烧录地址或起始擦除地址是16bit 对齐的
在这里插入图片描述
在这里插入图片描述

问3:为什么把NOR看成是2M * 8bit进行读取访问的时候就直接把地址发送出去而不用左移一位呢

答3:

针对问题3,**内存控制器**绝对是劳苦功高: 示意图如下:
在这里插入图片描述

addr = 0x11 由于norflash的A1接CPU的A0,所以norflash看到的实际上是它1M *16bit的第1个16bit单元,在数据经内存控制器返回CPU时,内存控制器用A0=1,去挑出nor第一个16bit的低8位(注意:这里的示意图为低位在前,仅为了方便观察;实际也有可能是高位在前,如果是高位在前,则内存控制器用A0=1,去挑出nor第一个16bit的高8位)
我们将16bit位宽的norflash看做2M * 8bit, addr = 0x11 ,我们也的确访问到了norflash第3个8bit单元
同理,假如addr = 0x10,我们也的确访问到了2M * 8bit的norflash的第2个8bit单元
所以,这种错位连接实际上保留了内存控制器选择内存单元的权利,即:内存控制器利用被错开的A0去选择内存单元的高低位。

本文参考了韦东山老师的讲解已及关于NOR FLASH地址左右移的问题,特此感谢
如有问题,欢迎评论区指出批评。

猜你喜欢

转载自blog.csdn.net/qq_16933601/article/details/104883177
今日推荐