共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 |