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