将周工的SMARTARM2200上的CPU PACK换成LPC2214,BANK0,BANK1分别接了一片SST39VF1601,程序放在LPC2214片内RAM中运行,工程模板使用2100,在应用程序中增加了对总线的配置,但无法读写FLASH,请各位大侠帮个忙!程序如下: /**************************************************************************** * 文 件 名:main.c * 功 能:对SST39VF160进行全片擦除,然后写两字节数据到芯片0地址,再读出来校验, * 若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。 * 说 明:将跳线器JP4短接,JP7断开。 ****************************************************************************/ #include "config.h"
#define BEEPCON 1<<7 // P0.7引脚控制B1,低电平蜂鸣 #define FLASH_ADDR 0x81000000 // FLASH的起始地址(分配为Bank1块)
// 转换地址。将要发送给SST39VF160的地址值进行转换,以便于LPC2210输出。 // 由于SST39VF160的A0是与LPC2210的A1相连,所以addr要左移1位。 #define GetAddr(addr) (volatile uint16 *)(FLASH_ADDR|(addr<<1))
#define BCFG_DEF 0x10000400 #define IDCY (0x00<<0) #define WST1 (0x01<<5) #define WST2 (0x01<<11) #define BCFG3_SET (BCFG_DEF|IDCY|WST1|WST2)
#define IDCFS (0x01<<0) #define WST1FS (0x03<<5) #define WST2FS (0x03<<11) #define BCFG_FS (BCFG_DEF|IDCFS|WST1FS|WST2FS)
/**************************************************************************** * 名 称:DelayNS() * 功 能:长软件延时。 * 入口参数:dly 延时参数,值越大,延时越久 * 出口参数:无 ****************************************************************************/ void DelayNS(uint32 dly) { uint32 i; for(; dly>0; dly--) { for(i=0; i<5000; i++); } }
/**************************************************************************** * 名 称:WordProgram() * 功 能:半字(16位)数据编程。 * 入口参数:Addr 编程地址(SST39VF160内部地址) * Data 编程数据 * 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败 ****************************************************************************/ uint8 WordProgram(uint32 Addr, uint16 Data) { volatile uint16 *ip; uint16 temp1,temp2;
ip = GetAddr(0x5555); // 转换地址0x5555 ip[0] = 0xaaaa; // 第一个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip[0] = 0x5555; // 第二个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip[0] = 0xa0a0; // 第三个写周期,地址0x5555,数据0xA0 ip = (volatile uint16 *)(FLASH_ADDR|(Addr&0x1FFFFF)); *ip = Data; // 第四个写周期,地址Addr,数据Data while (1) // 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变) { temp1 = *ip; temp2 = *ip; if (temp1 == temp2) { if (temp1 != Data) { return(FALSE); } else { return(TRUE); } } } return(TRUE); }
/**************************************************************************** * 名 称:ChipErase() * 功 能:芯片全片擦除。 * 入口参数:无 * 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败 ****************************************************************************/ uint8 ChipErase(void) { volatile uint16 *ip; uint16 temp1,temp2;
ip = GetAddr(0x5555); ip[0] = 0xaaaa; // 第一个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip[0] = 0x5555; // 第二个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip[0] = 0x8080; // 第三个写周期,地址0x5555,数据0x80 ip = GetAddr(0x5555); ip[0] = 0xaaaa; // 第四个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip[0] = 0x5555; // 第五个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip[0] = 0x1010; // 第六个写周期,地址0x5555,数据0x10
while (1) // 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变) { temp1 = *ip; temp2 = *ip; if (temp1 == temp2) { if (temp1 != 0xffff) { return(FALSE); } else { return(TRUE); } } } return(TRUE); }
/**************************************************************************** * 名 称:main() * 功 能:SST39VF160擦除、编程操作。 ****************************************************************************/ int main(void) { uint8 i; uint8 err = 0; volatile uint16 *addr;
PINSEL0 = 0x00000000; // 设置管脚连接GPIO PINSEL2=0x0f814914; //BCFG0=BCFG_FS; BCFG1=BCFG_FS; //BCFG2=BCFG3_SET; IO0DIR = BEEPCON; // 设置I/O为输出
ChipErase(); // FLASH全片擦除 // 校验是否真正擦除。若发现有非0xFFFF的存储单元,设置err=1 addr = (volatile uint16 *)FLASH_ADDR + 0; for(i=0; i<100; i++) { if(0xFFFF != (*addr)) err = 1; addr++; } WordProgram(0x0, 0x55AA);// 向FLASH的0地址写入0x55AA addr = (volatile uint16 *)FLASH_ADDR + 0; if(0x55AA != (*addr)) err = 1;// 读出校验,若数据错误则设置err=1 if(0==err) { IO0CLR = BEEPCON; // BEEPCON = 0 DelayNS(20); IO0SET = BEEPCON; // BEEPCON = 1 DelayNS(20); } else { while(1) { IO0CLR = BEEPCON; // BEEPCON = 0 DelayNS(10); IO0SET = BEEPCON; // BEEPCON = 1 DelayNS(10); } } while(1); return(0); }
麻烦周工及各位大侠帮下忙,谢谢!
|