疑惑点:为什么在发送解锁命令时,我们不用右移一位,而发送扇区地址时却要右移一位(nor_cmd函数内部已经左移一位)
处理器与NOR flash存储器的错位连接:
对于处理器来说,一个地址对应的是一个字节(8位),也就是说处理器的地址线对应的最小数据单元是字节。
如果处理器最小数据单元是8位,存储器位宽是16位,那在我们写程序时会特意进行16位操作吗?显然不会,我们写代码时,可不管外设到底是多少位。这是如何实现的呢?
原因:有存储控制器(MemoryController)这个中间层。存储控制器根据存储器的位宽,每次总是读/写16位数据。
外设位宽是8时,处理器的A0~AXX与外设的A0~AXX直接相连
外设位宽是16时,处理器的A1~AXX与外设的A0~AYY直接相连,表示不管处理器的A0是0还是1,外设看到的都是同一个地址,对应16位的数据,存储控制器对数据进行选择或组合,再提供给处理器。
外设位宽是32时,处理器的A2~AXX与外设的A0~AZZ直接相连,表示不管处理器的A0A1是00,01,10还是11,外设看到的都是同一个地址,对应32位的数据,“MemoryController”对数据进行选择或组合,再提供给处理器
32位的FLASH,FLASH的A0要接ARM的A2,因为32位地址表示4个字节,每次要跳4个字节的话,那么就是从A2开始才变化,A1 A0不变化
16位的FLASH,FLASH的A0要接ARM的A1,因为16位地址表示2个字节,每次要跳2个字节的话,那么就是从A1开始才变化,A0不变化
8位的FLASH,FLASH的A0要接ARM的A0,因为8位地址表示1个字节,每次要跳1个字节的话,那么就是从A0开始才变化。
对于 16位的FLASH ,我们可以这样认为:16位存储器的设计者将低位A[0]省掉了,我们只要读取一次就可以得到两个字节,读取的这个地址对应于ARM发出的地址的A[21..1],即实际上是存储