关于NOR FLASH地址左右移的问题

问题引入:不知道你会不会有这样的疑问:为什么在发送解锁命令时,我们不用右移一位,而发送扇区地址时却要右移一位(nor_cmd函数内部已经左移一位),这里先补充说明一下说明是cpu角度和nor角度:

cpu角度: CPU访问的最小单元是byte ,在它眼里我们的NOR FLASH是2M * 8bit
nor角度: 我们的NOR FLASH是16位宽的,最小单元是2byte,所以它认为它自己是1M * 16bit的

我们通过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的时候就直接把地址发送出去而不用左移一位呢,请看下面的“参考”)

 

参考

ARM与16位宽的NOR FLASH的连接, NOR FLASH地址线 (A0-A19),处理器的地址线要(A1-A20),即错开一位。
当软件要读取地址3上的8位数据时,硬件是这样进行的:
① "Memory Controller"发出0b0011的地址信号,NOR FLASH的A0-A19线上的信号是:0b001
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第2个"最小数据单元"
③ "Memory Controller"读入这个16位数据
④ "Memory Controller"把这个16位数据的高8位返回给CPU,这就是一个8位数据。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在linux下利用ls命令进行模糊查找

如上图,我们当前路径下有三个文件,分别为helloworld.c以及helloworld和1.c,直接输入命令ls则显示所有文件,我们可以利用ls 加*的方向进行模糊查找。 输入ls 目录名 形式的命令行,则是对该目录名下的文件全部进行显示&a…

Makefile常见符号意思

Makefile里有许许多多的符号,对于新手而言如果没有经常使用,就很容易忘记,所以我把常见符号的意义写下,方便日后忘记查询。本文章会持续更新... 1.$:代表目标;$^代表所有依赖,$^代表第一个依赖。…

Linux下串口通信详解

https://blog.csdn.net/u010783226/article/details/73369097

fstat、stat和lstat 区别

nt fstat(int filedes, struct stat *buf); int stat(const char *path, struct stat *buf); int lstat(const char *path, struct stat *buf); 一眼就能看出来fstat的第一个参数是和另外两个不一样的,fstat区别于另外两个系统调用的地方在于,fstat系…

Linux的帧缓冲设备

Linux的帧缓冲设备 帧缓冲(framebuffer)是 Linux 为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的,统一的。用户不必关心物理显存的…

Linux下没有包含头文件(不知是哪个)导致编译无法通过的解决心得

最近写程序的时候编译出错了,提示信息为:invalid use of undefined type fb_var_screeninfo。显示根据英文知道是没有定义 fb_var_screeninfo这个类型,明显是缺少了某个头文件,但是缺少哪个头文件以及有什么又快又好的解决方法呢&…

gcc编译缺少数学库

Linux下编译出现以下提示可以在编译的后面加上-lm,例如,arm-none-linux-gnueabi-gcc -o example1 example1.c -lm,意思就是添加数学库的意思,编译就能通过了 example1.c:(.text0x3e8): undefined reference to cos example1.c:(.…

Linux编译程序时加-I指定头文件位置

Linux下编译出现以下错误,错误的原因是在/usr/local/arm/arm-2009q3/bin/../arm-none-linux-gnueabi/libc/usr/include/freetype/config/下找不到ftheader.h,而我到该目录下看,发现路径是这样的rootubuntu:/usr/local/arm/arm-2009q3/arm-non…

树莓派远程监控的实现

原文:https://blog.csdn.net/ayz123456/article/details/79252923 http://shumeipai.nxez.com/2016/09/01/raspberry-pi-motion-cameras-for-remote-monitoring.html https://blog.csdn.net/wto882dim/article/details/82195001 https://blog.csdn.net/qq_3950082…

公网访问树莓派

公网访问树莓派控制小车 上篇已经介绍了小车在局域网中的控制方法,比较简单,既然是远程遥控那就要能够进行公网访问,使得你的小车可以在任何有网络的地方都能访问到,并且后续还会加上摄像头,进行实时监控,想…

关于对象的引用作为参数,可以直接访问私有成员的问题

#include using namespace std; class CPoint { public:CPoint(int xx, int yy){x xx;y yy;}CPoint(const CPoint &p){x p.x;y p.y;} private:int x, y; };首先,我们来看一个例子,在CPoint这个类中定义了两个构造函数,第一个为普通的…

僵死进程的产生以及解决办法

本文参考自:https://baike.baidu.com/item/%E5%83%B5%E5%B0%B8%E8%BF%9B%E7%A8%8B/1036577?fraladdin 一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据…

树莓派第一次开机自动连接WIFI(不用显示屏方法)

当我们把树莓派系统镜像烧录到SD卡之后,我们在windows看到的TF卡变成了空间很小的名为boot的盘,我们在此目录下新建一个名为wpa_supplicant.conf空白文件,并在其中加入以下代码: countryGB ctrl_interfaceDIR/var/run/wpa_supplicant GROUPn…

树莓派设置静态IP的好处与坏处

网上后很多资源教初学者如何设置静态IP,但我觉得设置静态IP也有不好的地方: 首先,好处就是树莓派的IP不会变,例如你设置了无线连接方式的静态IP为192.168.1.110,那么无论你连接哪个路由器,或者连接同一个路…

关于源文件用不同的编码方式编写,会导致执行结果不一样的现象及解决方法

如果我们编写以下程序,并分别另存为ANSI和UTF-8两种不同的编码方式保存,放到Linux下编译并运行如下图,两端相同的程序以不同的编码方式保存编译后的运行结果不一样,./ansi采用ANSI编码方式,会自动采用GBK方式来保存中文…

引入宽字符error: converting to execution character set: Invalid or incomplete multibyte or wide character

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_26093511/article/details/60593240 交叉编译.c文件,遇到如下问题 arm-linux-gcc -o…

linux交叉编译时报错:file not recognized: File format not recognized

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/u011113596/article/details/80325081 今天交叉编译sqlite3,make的时候报错:…

arm-linux-gcc静态编译和动态编译的区别

很多教程会提到加上-static是静态编译,但对于新手来说没有用例子来说明可能不太好理解,今天我就介绍一下关于这方面知识的一个例子: 最近在做一个关于freetype字体的东西,需要依赖freetype官方提供的库,我已经把电脑这…