网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> 综合代码 >> 文章正文
  DSP操作FALSH 29F016,包括读/写/擦除代码         ★★★ 【字体:
DSP操作FALSH 29F016,包括读/写/擦除代码
作者:小编    文章来源:本站原创    点击数:    更新时间:2007-1-26    

#include "ccblkfn.h"
#include "sysreg.h"

#include <sys\exception.h>
#include <cdefBF533.h>

#define pLight (volatile unsigned char *)0x20200000

#define pData (volatile unsigned short *)0x4000
#define pData_out (volatile unsigned short *) 0x7000


#define pFlashAStartAddress   (volatile unsigned short *)0x20000000
#define pFlashBStartAddress   (volatile unsigned short *)0x20100000

#define pFlashAUnlock1Address   (volatile unsigned short *)(pFlashAStartAddress + 0x555)
#define pFlashAUnlock2Address   (volatile unsigned short *)(pFlashAStartAddress + 0x2aa)
#define pFlashAManufacturerIDAddress  (volatile unsigned short *)(pFlashAStartAddress + 0x00)
#define pFlashADeviceIDAddress   (volatile unsigned short *)(pFlashAStartAddress + 0x01)

#define pFlashBUnlock1Address   (volatile unsigned short *)(pFlashBStartAddress + 0x555)
#define pFlashBUnlock2Address   (volatile unsigned short *)(pFlashBStartAddress + 0x2aa)
#define pFlashBManufacturerIDAddress (volatile unsigned short *)(pFlashBStartAddress + 0x00)
#define pFlashBDeviceIDAddress   (volatile unsigned short *)(pFlashAStartAddress + 0x01)

#define pFlashSection0OffsetAddress  0x00000
#define pFlashSection1OffsetAddress  0x08000
#define pFlashSection2OffsetAddress  0x10000
#define pFlashSection3OffsetAddress  0x18000
#define pFlashSection4OffsetAddress  0x20000
#define pFlashSection5OffsetAddress  0x28000
#define pFlashSection6OffsetAddress  0x30000
#define pFlashSection7OffsetAddress  0x38000
#define pFlashSection8OffsetAddress  0x40000
#define pFlashSection9OffsetAddress  0x48000
#define pFlashSection10OffsetAddress  0x50000
#define pFlashSection11OffsetAddress  0x58000
#define pFlashSection12OffsetAddress  0x60000
#define pFlashSection13OffsetAddress  0x68000
#define pFlashSection14OffsetAddress  0x70000
#define pFlashSection15OffsetAddress  0x78000
#define pFlashSection16OffsetAddress  0x7c000
#define pFlashSection17OffsetAddress  0x7d000
#define pFlashSection18OffsetAddress  0x7e000

#define FlashBankA    0
#define FlashBankB     1
#define DelayLength    1

#define OK       1
#define ERROR       0

unsigned short Length = 7032, Lily1 = 0;
unsigned short Array[8] = {0x1234,0x5678,0xabcd,0xf0ab,0x450e,0x98ca,0x6677,0x8899};
unsigned short Array_out[8] = {0};


void SDRAM_Init(void)
{

 //SDRAM Refresh Rate Control Register
 *pEBIU_SDRRC = 0x00000817; 

 //SDRAM Memory Bank Control Register
 *pEBIU_SDBCTL = 0x00000013;

 //SDRAM Memory Global Control Register 
 *pEBIU_SDGCTL = 0x0091998d; 
}//end Init_SDRAM
 
void delay(unsigned int DelayValue)
{
 int i;
 for(i=0;i<DelayValue;i++)
 {
 ;
 } 
}

void Init_EBIU(void)
{
 *pEBIU_AMBCTL0 = 0x7bb07bb0;
 *pEBIU_AMBCTL1 = 0x7bb0fff0;
 *pEBIU_AMGCTL = 0x000f;
}

void FlashReset(unsigned char FlashBank)
{
 if(FlashBank == FlashBankA)
  {
  *pFlashAStartAddress = 0xf0;
  delay(DelayLength);
  }
 else if(FlashBank == FlashBankB)
  {
  *pFlashBStartAddress = 0xf0;
  delay(DelayLength);
  }
}

unsigned short FlashGetManufacturerID(unsigned char FlashBank)
{
unsigned short FlashValue;

 if(FlashBank == FlashBankA)
  {
  *pFlashAUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashAUnlock2Address = 0x55;
  delay(DelayLength);
  *pFlashAUnlock1Address = 0x90;
  delay(DelayLength);
  FlashValue = *pFlashAManufacturerIDAddress;
  delay(DelayLength);
  }
 else if(FlashBank == FlashBankB)
  {
  *pFlashBUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashBUnlock2Address = 0x55;
  delay(DelayLength);
  *pFlashBUnlock1Address = 0x90;
  delay(DelayLength);
  FlashValue = *pFlashBManufacturerIDAddress;
  delay(DelayLength);
  }
 else
  {
  FlashValue = ERROR;
  }
 return(FlashValue);
}

unsigned short FlashGetDeviceID(unsigned char FlashBank)
{
unsigned short FlashValue;

 if(FlashBank == FlashBankA)
  {
  *pFlashAUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashAUnlock2Address = 0x55;
  delay(DelayLength);
  *pFlashAUnlock1Address = 0x90;
  delay(DelayLength);
  FlashValue = *pFlashADeviceIDAddress;
  delay(DelayLength);
  }
 else if(FlashBank == FlashBankB)
  {
  *pFlashBUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashBUnlock2Address = 0x55;
  delay(DelayLength);
  *pFlashBUnlock1Address = 0x90;
  delay(DelayLength);
  FlashValue = *pFlashBDeviceIDAddress;
  delay(DelayLength);
  }
 else
  {
  FlashValue = ERROR;
  }
 return(FlashValue);
}


void FlashEraserChip(unsigned char FlashBank)
{
 if(FlashBank == FlashBankA)
  {
  *pFlashAUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashAUnlock2Address = 0x55;
  delay(DelayLength);
  *pFlashAUnlock1Address = 0x80;
  delay(DelayLength);
  *pFlashAUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashAUnlock2Address = 0x55;
  delay(DelayLength);
  *pFlashAUnlock1Address = 0x10;
  delay(DelayLength);
  while((*pFlashAStartAddress) != 0xffff)
   {;
   }
  }
 else if(FlashBank == FlashBankB)
  {
  *pFlashBUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashBUnlock2Address = 0x55;
  delay(DelayLength);
  *pFlashBUnlock1Address = 0x80;
  delay(DelayLength);
  *pFlashBUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashBUnlock2Address = 0x55;
  delay(DelayLength);
  *pFlashBUnlock1Address = 0x10;
  delay(DelayLength);
  while((*pFlashBStartAddress) != 0xffff)
   {;
   }
  }
}

void FlashEraseSector(unsigned char FlashBank,unsigned int pFlashSectorOffsetAddress)
{
 if(FlashBank == FlashBankA)
  {
  *pFlashAUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashAUnlock2Address = 0x55;
  delay(DelayLength);
  *pFlashAUnlock1Address = 0x80;
  delay(DelayLength);
  *pFlashAUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashAUnlock2Address = 0x55;
  delay(DelayLength);
  *(pFlashAStartAddress + pFlashSectorOffsetAddress) = 0x30;
  delay(DelayLength);
  while((*(pFlashAStartAddress + pFlashSectorOffsetAddress)) != 0xffff)
   {;
   }
  }
 else if(FlashBank == FlashBankB)
  {
  *pFlashBUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashBUnlock2Address = 0x55;
  delay(DelayLength);
  *pFlashBUnlock1Address = 0x80;
  delay(DelayLength);
  *pFlashBUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashBUnlock2Address = 0x55;
  delay(DelayLength);
  *(pFlashBStartAddress + pFlashSectorOffsetAddress) = 0x30;
  delay(DelayLength);
  while((*(pFlashBStartAddress + pFlashSectorOffsetAddress)) != 0xffff)
   {;
   }
  }
}

void FlashProgarmmeWord(unsigned char FlashBank,unsigned short Value,unsigned int pFlashOffsetAddress)
{
 if(FlashBank == FlashBankA)
  {
  *pFlashAUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashAUnlock2Address = 0x55;
  delay(DelayLength);
  *pFlashAUnlock1Address = 0xa0;
  delay(DelayLength);
  *(pFlashAStartAddress + pFlashOffsetAddress) = Value;
  delay(DelayLength);
  Lily1 = *(pFlashAStartAddress + pFlashOffsetAddress);
  while((*(pFlashAStartAddress + pFlashOffsetAddress)) != Value)
   {;
   }
  }
 else if(FlashBank == FlashBankB)
  {
  *pFlashBUnlock1Address = 0xaa;
  delay(DelayLength);
  *pFlashBUnlock2Address = 0x55;
  delay(DelayLength);
  *pFlashBUnlock1Address = 0xa0;
  delay(DelayLength);
  *(pFlashBStartAddress + pFlashOffsetAddress) = Value;
  delay(DelayLength);
  while((*(pFlashBStartAddress + pFlashOffsetAddress)) != Value)
   {;
   }
  }
}

void main(void)
{    unsigned short readID;
 unsigned short temp, i;
 

 Init_EBIU();
 //SDRAM_Init();

 FlashReset(FlashBankA);
 FlashReset(FlashBankB);

 readID = FlashGetManufacturerID(FlashBankA);//0x0001
 readID = FlashGetDeviceID(FlashBankA);//0x22da

 FlashReset(FlashBankA);
  
 FlashEraserChip(FlashBankA);
 temp = *pFlashAStartAddress;
 
// FlashProgarmmeWord(FlashBankB, 0x1234, 0x0000);
// temp = *pFlashBStartAddress;

/* for ( i=0; i<Length; i++ )
 {
  *(pData_out + i ) = *(pData + i );
 }
*/ 
/***
 for( i=0; i<8; i++ )
 {
  FlashProgarmmeWord(FlashBankA, Array[i], i );
 }
 
 for( i=0; i<8; i++ )
 {
  Array_out[i] = *(pFlashAStartAddress + i);
 }
***/ 

/********** 向Flash中写代码 ***********/
 for( i=0; i<Length; i++ )
 {
  FlashProgarmmeWord(FlashBankA, *(pData + i ), i );
 }
 
/********** 从Flash中读代码 ***********/
/* for( i=0; i<Length; i++ )
 {
  *(pData_out + i) = *(pFlashAStartAddress + i);
 }
 
 temp = *(pFlashBStartAddress + 0);
*/ 
// FlashEraseSector(FlashBankB, pFlashSection0OffsetAddress);
// temp = *pFlashBStartAddress;
 
 *pLight = 0x2a;
 
 while(1)
 {;
 } 
}

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号