共2条
1/1 1 跳转至页
向各位大哥请教几个外部存储器的问题,谢谢!
问
//功能:对 SST39VF160 进行全片擦除,然后写两字节数据到芯片 0
//地址,再读出来效验。如效验通过则蜂鸣器响医一声,否则不停的
//报警。
#include "config.h"
#define BEEPCON 0x00000080 /*P0.7 引脚控制 B1,低电平蜂鸣*/
//FLASH 的起始地址(分配为 Bank1)
#define FLASH_ADDR 0x81000000
//转换地址。将要发送给 SST39VF160 的地址值进行转换,以便于
//LPC2210 输出。
//由于 SST39VF160 的 A0 是与 LPC2210 的 A1 相连,所以 ADDR
//要左移 1 位。
#define GetAddr(addr) (volatile unit16 *)(FLASH_ADDR|(addr<<1))
//************************************************
//名称:Wordprogram()
//功能:半字(16位)数据编程
//入口参数:Addr 编程地址(SST39VF160 内部地址)
// Data 编程数据
//出口参数:成功:TRUE ,失败:FALSE
//************************************************
unit8 Wordprogram(uint32 Addr,uint16 Data)
{
volatile uint16 *ip;
uint16 temp1,temp2;
ip=GetAddr(0x5555); //转换地址 0x5555
ip[0]=0xaaaa //第1个写周期,地址 0x5555,数据 0xAA
ip=GetAddr(0x2aaa);
ip[0]=0x5555; //第2个写周期,地址 0x2aaa,数据 0x55
ip=GetAddr(0x5555);
ip[0]=0xa0a0; //第3个写周期,地址 0x5555,数据 0xA0
ip=(volatile uint16 *)(FLASH_ADDR|(Addr&0x1FFFFF);
*ip=Data //第4个写周期,地址 0xAddr,数据 Data
while(1)
{
temp1 = *ip;
temp2 = *ip;
if (temp1 == temp2)
{
if (temp1 != Data)
{
return(FALSE);
}
else
{
return(TRUE);
}
}
}
return(TRUE);
}
请教:
问题1:
为什么要将要发送给 SST39VF160 的地址值进行转换呢?
转变的话,它是按照什么规则进行转变的呢?
问题2:
ip=GetAddr(0x5555); //转换地址 0x5555
ip=GetAddr(0x5555);
得到 ip 应该是:ip=0x8100AAAA 是吗?
问题3:
ip[0]=0xaaaa //第1个写周期,地址 0x5555,数据 0xAA
为什么不是 //第一个写周期,地址 x8100AAAA 数据 0xaaaa ?
这是为什么啊?
在此先谢谢各位大哥了!
答 1: re看来台兄和我一样都是出学者拉~~
帮台兄鼎鼎! 答 2: 各位大侠,快来救命啊!各位大侠:
ip[0]=0xaaaa //第1个写周期,地址 0x5555,数据 0xAA
为什么 数据不是 0xaaaa 啊
半字(16位)数据编程,也可以放的下 0xaaaa 啊?
各位大侠,救救我哦~~
谢谢!
答 3: re各位大侠,快来救命啊!
各位大侠:
ip[0]=0xaaaa //第1个写周期,地址 0x5555,数据 0xAA
为什么 数据不是 0xaaaa 啊
半字(16位)数据编程,也可以放的下 0xaaaa 啊?
各位大侠,救救我哦~~
谢谢!
//地址,再读出来效验。如效验通过则蜂鸣器响医一声,否则不停的
//报警。
#include "config.h"
#define BEEPCON 0x00000080 /*P0.7 引脚控制 B1,低电平蜂鸣*/
//FLASH 的起始地址(分配为 Bank1)
#define FLASH_ADDR 0x81000000
//转换地址。将要发送给 SST39VF160 的地址值进行转换,以便于
//LPC2210 输出。
//由于 SST39VF160 的 A0 是与 LPC2210 的 A1 相连,所以 ADDR
//要左移 1 位。
#define GetAddr(addr) (volatile unit16 *)(FLASH_ADDR|(addr<<1))
//************************************************
//名称:Wordprogram()
//功能:半字(16位)数据编程
//入口参数:Addr 编程地址(SST39VF160 内部地址)
// Data 编程数据
//出口参数:成功:TRUE ,失败:FALSE
//************************************************
unit8 Wordprogram(uint32 Addr,uint16 Data)
{
volatile uint16 *ip;
uint16 temp1,temp2;
ip=GetAddr(0x5555); //转换地址 0x5555
ip[0]=0xaaaa //第1个写周期,地址 0x5555,数据 0xAA
ip=GetAddr(0x2aaa);
ip[0]=0x5555; //第2个写周期,地址 0x2aaa,数据 0x55
ip=GetAddr(0x5555);
ip[0]=0xa0a0; //第3个写周期,地址 0x5555,数据 0xA0
ip=(volatile uint16 *)(FLASH_ADDR|(Addr&0x1FFFFF);
*ip=Data //第4个写周期,地址 0xAddr,数据 Data
while(1)
{
temp1 = *ip;
temp2 = *ip;
if (temp1 == temp2)
{
if (temp1 != Data)
{
return(FALSE);
}
else
{
return(TRUE);
}
}
}
return(TRUE);
}
请教:
问题1:
为什么要将要发送给 SST39VF160 的地址值进行转换呢?
转变的话,它是按照什么规则进行转变的呢?
问题2:
ip=GetAddr(0x5555); //转换地址 0x5555
ip=GetAddr(0x5555);
得到 ip 应该是:ip=0x8100AAAA 是吗?
问题3:
ip[0]=0xaaaa //第1个写周期,地址 0x5555,数据 0xAA
为什么不是 //第一个写周期,地址 x8100AAAA 数据 0xaaaa ?
这是为什么啊?
在此先谢谢各位大哥了!
答 1: re看来台兄和我一样都是出学者拉~~
帮台兄鼎鼎! 答 2: 各位大侠,快来救命啊!各位大侠:
ip[0]=0xaaaa //第1个写周期,地址 0x5555,数据 0xAA
为什么 数据不是 0xaaaa 啊
半字(16位)数据编程,也可以放的下 0xaaaa 啊?
各位大侠,救救我哦~~
谢谢!
答 3: re各位大侠,快来救命啊!
各位大侠:
ip[0]=0xaaaa //第1个写周期,地址 0x5555,数据 0xAA
为什么 数据不是 0xaaaa 啊
半字(16位)数据编程,也可以放的下 0xaaaa 啊?
各位大侠,救救我哦~~
谢谢!
共2条
1/1 1 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| 【S32K3学习整理】使用 LPUART 的loopback 模式实现核间通讯被打赏¥28元 | |
| arduinounoq原生zephyr环境搭建被打赏¥31元 | |
| 树莓派3+Klipper,MPU6050共振补偿被打赏¥41元 | |
| GroveCreatorKit套件+摇杆测评被打赏¥18元 | |
| 设备功耗web监控界面(ESP32C5)被打赏¥28元 | |
| OrangePiZero2W系统被打赏¥33元 | |
| Linux环境下以模拟方式快速实现出入管理功能测试被打赏¥24元 | |
| 树莓派3+Klipper,老3D打印机满血升级被打赏¥33元 | |
| OK1126B-S开发板下串口屏及其应用被打赏¥21元 | |
| 低功耗超声波液位测距仪(ESP32S3)被打赏¥27元 | |
我要赚赏金
