1)
#define Writeflash(addr,dat) *((volatile INT16U *)(addr<<1))=(INT16U)dat
#define Readflash(addr) (*((volatile INT16U *)(addr<<1)))
/*addr为读写操作的半字地址,data则为要写入的半字数据。因为ARM处理器是以字节为单位
进行数据处理的,而SST39VF160是16位数据宽度,所以,addr地址必须左移1位。
有了以上这两个宏定义以后,进行读写擦除等操作就方便了*/
以上是厂家给的解释;只不过我感觉解释理解不了??
我的疑问在于为什么要移位;移位解决了什么问题??????、
望高手给与解答
------解决方案--------------------
其实是这样的,你的mcu和flashrom SST39VF160的连接地址线的最低位被直接拉低了,也就是说你传入mcu的地址是你要你需要的地址的高15位。
也就是说addr=1 其实访问的是0x0002,addr=3 访问的是0x0006
至于为什么这么干,是因为 类似0x0003这样的地址是不存在的。
至于为什么不存在 是因为16bit位宽的flashrom可以理解为有很多个小的16bit存储器连接而成,这16bit是不可分割的,这也是内存对齐的由来。。。。