📄 main.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**--------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
*********************************************************************************************************/
/********************************************************************************************************
* 文 件 名:main.c
* 功 能:对SST39VF1601进行全片擦除,然后写两字节数据到芯片0地址,再读出来校验,
* 若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。
* 说 明:需将跳线P3.30和BEEP短接。
*********************************************************************************************************/
#include "main.h"
#define BEEPCON 1<<30 /* P3.30引脚控制B1,低电平蜂鸣 */
#define FLASH_ADDR 0x81000000 /* FLASH的起始地址(分配为Bank1块)*/
/********************************************************************************************************
* 转换地址。将要发送给SST39VF1601的地址值进行转换,以便于LPC2210输出。
* 由于SST39VF1601的A0是与LPC2470的A1相连,所以addr要左移1位。
*********************************************************************************************************/
#define GetAddr(addr) (volatile uint16 *)(FLASH_ADDR|(addr<<1))
/********************************************************************************************************
* 名 称:DelayNS()
* 功 能:长软件延时。
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
*********************************************************************************************************/
void DelayNS(uint32 idly)
{
uint32 i;
for(; idly>0; idly--)
{
for(i=0; i<5000; i++);
}
}
/*********************************************************************************************************
* 名 称:WordProgram()
* 功 能:半字(16位)数据编程。
* 入口参数:Addr 编程地址(SST39VF1601内部地址)
* Data 编程数据
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
**********************************************************************************************************/
uint8 WordProgram(uint32 iAddr, uint16 iData)
{
volatile uint16 *ipTmp;
uint16 itemp1,itemp2;
ipTmp = GetAddr(0x5555); /* 转换地址0x5555 */
ipTmp[0] = 0xaaaa; /* 第一个周期,地址0x5555,数据0xAA*/
ipTmp = GetAddr(0x2aaa);
ipTmp[0] = 0x5555; /* 第二个周期,地址0x2aaa,数据0x55*/
ipTmp = GetAddr(0x5555);
ipTmp[0] = 0xa0a0; /* 第三个周期,地址0x5555,数据0xA0*/
ipTmp = (volatile uint16 *)(FLASH_ADDR|(iAddr&0x1FFFFF));
*ipTmp = iData; /* 第四个周期,地址Addr,数据Data */
/*
* 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变)
*/
while (1) {
itemp1 = *ipTmp;
itemp2 = *ipTmp;
if (itemp1 == itemp2) {
if (itemp1 != iData) {
return(FALSE);
}
else {
return(TRUE);
}
}
}
return(TRUE);
}
/*********************************************************************************************************
* 名 称:ChipTmpErase()
* 功 能:芯片全片擦除。
* 入口参数:无
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
**********************************************************************************************************/
uint8 ChipErase(void)
{
volatile uint16 *ipTmp;
uint16 itemp1,itemp2;
ipTmp = GetAddr(0x5555);
ipTmp[0] = 0xaaaa; /* 第一个周期,地址0x5555,数据0xAA*/
ipTmp = GetAddr(0x2aaa);
ipTmp[0] = 0x5555; /* 第二个周期,地址0x2aaa,数据0x55*/
ipTmp = GetAddr(0x5555);
ipTmp[0] = 0x8080; /* 第三个周期,地址0x5555,数据0x80*/
ipTmp = GetAddr(0x5555);
ipTmp[0] = 0xaaaa; /* 第四个周期,地址0x5555,数据0xAA*/
ipTmp = GetAddr(0x2aaa);
ipTmp[0] = 0x5555; /* 第五个周期,地址0x2aaa,数据0x55*/
ipTmp = GetAddr(0x5555);
ipTmp[0] = 0x1010; /* 第六个周期,地址0x5555,数据0x10*/
/*
* 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变)
*/
while (1)
{
itemp1 = *ipTmp;
itemp2 = *ipTmp;
if (itemp1 == itemp2)
{
if (itemp1 != 0xffff)
{
return(FALSE);
}
else
{
return(TRUE);
}
}
}
return(TRUE);
}
/**********************************************************************************************************
** 函数名称 :main()
** 函数功能 :用P3.30控制BEEP,让BEEP鸣叫。
** 调试说明 :需将跳线P3.30和BEEP短接。
**********************************************************************************************************/
int main (void){
uint8 i;
uint8 ierr = 0;
volatile uint16 *ipAddr;
/*
* Edit for LPC2460/70
* 配置外部总线访问SST36VF1601C
* 的速度,其中,将读取速度
* 配置为最快,写速度配置为最快
*/
PINSEL6 = 0x55555555; /* 配置外部总线D0~D15 */
PINSEL8 = 0x55555554; /* 配置外部总线A1~A15 */
PINSEL9 = 0x40050155; /* 配置外部总线A16~A20,OE,WE,CS1*/
EMCControl = 0x01; /* 使能外部EMC,禁止镜像 */
EMCStaticConfig1 = 0x00000081; /* 配置外部总线,16bit宽度 */
EMCStaticWaitRd1 = 4; /* 配置外部总线,读延时5cclk */
EMCStaticWaitOen1 = 0x01; /* 输出使能延时1cclk */
EMCStaticWaitWen1 = 0x00; /* 写使能延时1cclk */
EMCStaticWaitWr1 = 0x02;
PINSEL7 = 0x00000000; /* 设置管脚连接GPIO */
FIO3DIR = BEEPCON; /* 设置I/O为输出 */
FIO3SET = BEEPCON; /* BEEPCON = 0 */
ChipErase(); /* FLASH全片擦除 */
/*
* 校验是否真正擦除。若发现有非0xFFFF的存储单元,设置ierr=1
*/
ipAddr = (volatile uint16 *)FLASH_ADDR + 0;
for(i=0; i<100; i++) {
if(0xFFFF != (*ipAddr)) ierr = 1;
ipAddr++;
}
for(i=0; i<255; i++) {
WordProgram(i, 0x55AA); /* 向FLASH的0地址写入0x55AA */
}
ipAddr = (volatile uint16 *)FLASH_ADDR + 0;
if(0x55AA != (*ipAddr)) ierr = 1; /* 读出校验,若数据错误则设置err=1*/
if(0==ierr) {
FIO3CLR = BEEPCON; /* BEEPCON = 0 */
DelayNS(1000);
FIO3SET = BEEPCON; /* BEEPCON = 1 */
DelayNS(1000);
}
else {
while(1) {
FIO3CLR = BEEPCON; /* BEEPCON = 0 */
DelayNS(500);
FIO3SET = BEEPCON; /* BEEPCON = 1 */
DelayNS(500);
}
}
while(1);
return(0);
while(1);
}
/*********************************************************************************************************
END FILE
**********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -