共2条
1/1 1 跳转至页
am29lv160dt,flash 高手请看一下程序,am29lv160dt flash 擦除
问
am29lv160dt flash 擦除某一sector时怎么全片都擦除了
这是下面的代码,请高手看看有没有写错。
void flash_erase(P_U16 base_addr){
P_U16 Temp;
U32 i=35000000;
/* Issue the Sector Erase command to am29lv160dt */
Temp = (P_U16)((0x0000555<<1)+FLASH_ADDRESS); *Temp = 0xAA;
Temp = (P_U16)((0x00002AA<<1)+FLASH_ADDRESS); *Temp = 0x55;
Temp = (P_U16)((0x0000555<<1)+FLASH_ADDRESS);
*Temp = 0x80;
Temp = (P_U16)((0x0000555<<1)+FLASH_ADDRESS);
*Temp = 0xAA;
Temp = (P_U16)((0x00002AA<<1)+FLASH_ADDRESS);
*Temp = 0x55;
Temp = base_addr;
*Temp = 0x30;
while(i--);//Delay
} 答 1: 我也用160,读写都正常#define FLASH_CODE1 0x00AA00aa
#define FLASH_CODE2 0x00550055
#define ID_IN_CODE 0x00900090
#define ID_OUT_CODE 0x00F000f0
#define CMD_READ_ARRAY 0x00F0
#define CMD_UNLOCK1 0x00AA
#define CMD_UNLOCK2 0x0055
#define CMD_ERASE_SETUP 0x0080
#define CMD_ERASE_CONFIRM 0x0030
#define CMD_PROGRAM 0x00A0
#define CMD_UNLOCK_BYPASS 0x00200020
#define MEM_FLASH_ADDR1 (*(volatile short *)(0x10000000 + (0x0000555<<1)))
#define MEM_FLASH_ADDR2 (*(volatile short *)(0x10000000 + (0x00002AA<<1)))
#define IDENT_FLASH_ADDR1 (*(volatile int *)(0x10000000 + (0x0000555<<2)))
#define IDENT_FLASH_ADDR2 (*(volatile int *)(0x10000000 + (0x0000AAA<<2)))
#define BIT_ERASE_DONE 0x008
/* start erase operation */
MEM_FLASH_ADDR1 = CMD_UNLOCK1;
MEM_FLASH_ADDR2 = CMD_UNLOCK2;
MEM_FLASH_ADDR1 = CMD_ERASE_SETUP;
MEM_FLASH_ADDR1 = CMD_UNLOCK1;
MEM_FLASH_ADDR2 = CMD_UNLOCK2;
addr = (short*)gFlashInfo.sector_base[sector_number]; /* 提供擦除扇区的基地址 */
*addr = CMD_ERASE_CONFIRM;
chip1 = 0;
rt0 = *AT91C_ST_CRTR;
rt0 = *AT91C_ST_CRTR;
do
{
result = *addr;
rt1 = *AT91C_ST_CRTR;
rt1 = *AT91C_ST_CRTR;
if ( rt1 - rt0 > 5 ) // 5秒超时
{
MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
chip1 = -1;
break;
}
if (!chip1 && (result & 0xFFFF) & BIT_ERASE_DONE)
{
chip1 = 1;
}
}
while (!chip1);
MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
不知道对你有帮助没有 答 2: 现在程序可以了,但很怪发现一点点怪问题:
我的CPU是lpc2220的,程序就是在am29lv160dt中运行的,用烧写工具将程序烧到FLASH中是可以真常运行的,关键是我的程序应用过程中要记录一些数据在FLASH中,所以我要擦除FLASH中有某一块然后写数据进去.因此,我将擦除,写,程序copy到SRAM中运行,但就是有一个怪问题就是当用jatg口写完程序用jatg口复位启动系统时,擦除某一sector时却全片都擦除了,但是如果我不用jatg口复位而是直接关电源再上电,则一切正常。怪,不明。
这是下面的代码,请高手看看有没有写错。
void flash_erase(P_U16 base_addr){
P_U16 Temp;
U32 i=35000000;
/* Issue the Sector Erase command to am29lv160dt */
Temp = (P_U16)((0x0000555<<1)+FLASH_ADDRESS); *Temp = 0xAA;
Temp = (P_U16)((0x00002AA<<1)+FLASH_ADDRESS); *Temp = 0x55;
Temp = (P_U16)((0x0000555<<1)+FLASH_ADDRESS);
*Temp = 0x80;
Temp = (P_U16)((0x0000555<<1)+FLASH_ADDRESS);
*Temp = 0xAA;
Temp = (P_U16)((0x00002AA<<1)+FLASH_ADDRESS);
*Temp = 0x55;
Temp = base_addr;
*Temp = 0x30;
while(i--);//Delay
} 答 1: 我也用160,读写都正常#define FLASH_CODE1 0x00AA00aa
#define FLASH_CODE2 0x00550055
#define ID_IN_CODE 0x00900090
#define ID_OUT_CODE 0x00F000f0
#define CMD_READ_ARRAY 0x00F0
#define CMD_UNLOCK1 0x00AA
#define CMD_UNLOCK2 0x0055
#define CMD_ERASE_SETUP 0x0080
#define CMD_ERASE_CONFIRM 0x0030
#define CMD_PROGRAM 0x00A0
#define CMD_UNLOCK_BYPASS 0x00200020
#define MEM_FLASH_ADDR1 (*(volatile short *)(0x10000000 + (0x0000555<<1)))
#define MEM_FLASH_ADDR2 (*(volatile short *)(0x10000000 + (0x00002AA<<1)))
#define IDENT_FLASH_ADDR1 (*(volatile int *)(0x10000000 + (0x0000555<<2)))
#define IDENT_FLASH_ADDR2 (*(volatile int *)(0x10000000 + (0x0000AAA<<2)))
#define BIT_ERASE_DONE 0x008
/* start erase operation */
MEM_FLASH_ADDR1 = CMD_UNLOCK1;
MEM_FLASH_ADDR2 = CMD_UNLOCK2;
MEM_FLASH_ADDR1 = CMD_ERASE_SETUP;
MEM_FLASH_ADDR1 = CMD_UNLOCK1;
MEM_FLASH_ADDR2 = CMD_UNLOCK2;
addr = (short*)gFlashInfo.sector_base[sector_number]; /* 提供擦除扇区的基地址 */
*addr = CMD_ERASE_CONFIRM;
chip1 = 0;
rt0 = *AT91C_ST_CRTR;
rt0 = *AT91C_ST_CRTR;
do
{
result = *addr;
rt1 = *AT91C_ST_CRTR;
rt1 = *AT91C_ST_CRTR;
if ( rt1 - rt0 > 5 ) // 5秒超时
{
MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
chip1 = -1;
break;
}
if (!chip1 && (result & 0xFFFF) & BIT_ERASE_DONE)
{
chip1 = 1;
}
}
while (!chip1);
MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
不知道对你有帮助没有 答 2: 现在程序可以了,但很怪发现一点点怪问题:
我的CPU是lpc2220的,程序就是在am29lv160dt中运行的,用烧写工具将程序烧到FLASH中是可以真常运行的,关键是我的程序应用过程中要记录一些数据在FLASH中,所以我要擦除FLASH中有某一块然后写数据进去.因此,我将擦除,写,程序copy到SRAM中运行,但就是有一个怪问题就是当用jatg口写完程序用jatg口复位启动系统时,擦除某一sector时却全片都擦除了,但是如果我不用jatg口复位而是直接关电源再上电,则一切正常。怪,不明。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |