?? flash.c
字號:
/*******************************************************************/
/*定義CHIP_6201,聲明采用TMS320C6201 DSP芯片*/
/*程序宏定義,定義AM29LV040映射的首地址FLASH_ADDRS.數(shù)據(jù)存放的地址INT_MEM*/
/*編程字節(jié)的長度LENGTH*/
/*函數(shù)返回值定義 TRUE、FALSE*/
/*******************************************************************/
#define CHIP_6201
#define CE1_ADDRS 0x01400000 //CE1
#define INT_MEM 0x80000000
#define CE1_CNTRL 0x01800004
#define FLASH_ADDRS CE1_ADDRS
#define SRC_ADDRS INT_MEM
#define LENGTH 0x400
#define TRUE 1
#define FALSE 0
/*******************************************************************/
/*包含頭文件csl.h,csl_emif.h*/
/*利用TI Code Composer Studio的芯片支持庫(chip support library)編程*/
/*該子程序中主要用在對EMIF外設(shè)初始化方面*/
/*******************************************************************/
#include <csl.h>
#include <csl_emif.h>
/*******************************************************************/
/*功能:配置EMIF外設(shè)*/
/* AM29LV040映射到系統(tǒng)的CE1空間,16 bits 異步存儲設(shè)備接口*/
/* 存儲器類型: 16-bit 異步存儲設(shè)備*/
/* Read Setup/Strobe/Hold = 1/17/3 */
/* Write Setup/Strobe/Hold = 2/11/3 */
/*******************************************************************/
void emif_config()
{
/* EMIF全局控制寄存器,EMIF_GBLCTL_RMK結(jié)構(gòu)定義見頭文件csl_emif.h */
Uint32 global_ctl = EMIF_GBLCTL_RMK(
EMIF_GBLCTL_NOHOLD_0,
EMIF_GBLCTL_SDCEN_DISABLE,
EMIF_GBLCTL_SSCEN_DISABLE,
EMIF_GBLCTL_CLK1EN_ENABLE,
EMIF_GBLCTL_CLK2EN_DISABLE,
EMIF_GBLCTL_SSCRT_CPUOVR2,
EMIF_GBLCTL_RBTR8_HPRI);
/* EMIF CECTL1控制寄存器,EMIF_GBLCTL_RMK結(jié)構(gòu)定義見頭文件csl_emif.h */
Uint32 ce1_control = EMIF_CECTL_RMK(
EMIF_CECTL_WRSETUP_OF(2),
EMIF_CECTL_WRSTRB_OF(11),
EMIF_CECTL_WRHLD_OF(3),
EMIF_CECTL_RDSETUP_OF(1),
EMIF_CECTL_RDSTRB_OF(17),
EMIF_CECTL_MTYPE_ASYNC32,
EMIF_CECTL_RDHLD_OF(3) );
/*配置EMIF各個寄存器,該宏定義見 csl_emif.h*/
EMIF_configArgs(
EMIF_GBLCTL_OF(global_ctl), /* global control */
EMIF_CECTL_OF(0x00000018), /* CE0 control */
EMIF_CECTL_OF(ce1_control), /* 16-bit async mem */
EMIF_CECTL_OF(0x00000018), /* CE2 control */
EMIF_CECTL_OF(0x00000018), /* CE3 control */
EMIF_SDCTL_OF(0x0388F000), /* SDRAM control */
EMIF_SDTIM_OF(0x00800040) /* SDRAM timing */
);
}
/*******************************************************************/
/*功能:把連續(xù)增加的數(shù)字寫入指定的存儲地址*/
/*輸入:source_ptr 指定緩沖區(qū)的地址*/
/* code_ptr 緩沖區(qū)的長度 */
/*******************************************************************/
void load_source(unsigned char * source_ptr, int length)
{
int i;
for (i = 0; i < length; i ++)
{
* source_ptr++ = i;
}
}
/*******************************************************************/
/*功能:擦除AM29LV040所有存儲空間,擦除后的整個memory空間全是0xFF */
/*輸入:flash_ptr FLASH芯片映射的首地址 */
/*返回: pass 0 擦除失敗 */
/* 1 擦除成功 */
/*******************************************************************/
int erase_flash(int * flash_ptr)
{
/*由于AM29LV040地址線A[17..0]連接到TMS320C6201地址線EA[21..2],*/
/*所以數(shù)據(jù)地址需要左移2位*/
/* unsigned char << 2 == Word */
int * ctrl_addr1 = (int *) ((int)flash_ptr + (0x555 << 2));
int * ctrl_addr2 = (int *) ((int)flash_ptr + (0x2aa << 2));
int pass = TRUE;
/*按照擦除操作流程要求的命令字依次寫入命令字*/
* ctrl_addr1 = 0xaa;
* ctrl_addr2 = 0x55;
* ctrl_addr1 = 0x80;
* ctrl_addr1 = 0xaa;
* ctrl_addr2 = 0x55;
* ctrl_addr1 = 0x10;
/*輪詢檢測擦除操作是否正確*/
pass = poll_data(flash_ptr, (unsigned char) 0xff);
if (!pass)
printf("failed erase\n\n");
return pass;
}
/*******************************************************************/
/*功能:AM29LV040 字節(jié)編程*/
/*輸入:flash_ptr FLASH映射的首地址*/
/* code_ptr 需要編程的字節(jié)數(shù)據(jù)存放首地址*/
/*返回值:pass 0 字節(jié)編程失敗 */
/* 1 字節(jié)編程成功 */
/*******************************************************************/
int program_flash(unsigned char * source_ptr, int * flash_ptr, int length)
{
int i;
unsigned char data;
int pass;
/*由于AM29LV040地址線A[17..0]連接到TMS320C6201地址線EA[21..2],*/
/*所以數(shù)據(jù)地址需要左移2位*/
/* unsigned char << 2 == Word */
int * ctrl_addr1 = (int *) ((int)flash_ptr + (0x555 << 2));
int * ctrl_addr2 = (int *) ((int)flash_ptr + (0x2aa << 2));;
for (i = 0; i < length; i++)
{
/*按照字節(jié)編程操作流程要求的命令字依次寫入命令字*/
* ctrl_addr1 = 0x00aa;
* ctrl_addr2 = 0x0055;
* ctrl_addr1 = 0x00a0;
* flash_ptr++ = data = * source_ptr++;
/*輪詢檢測擦除操作是否正確*/
pass = poll_data(flash_ptr-1, data);
}
if (!pass)
printf("Failed at address %x \n\n", (int) flash_ptr);
return pass;
}
/*******************************************************************/
/*功能: 輪詢檢測編程和擦除算法是否成功。*/
/* 子程序循環(huán),直到操作完全成功或失敗就終止 */
/* 輸入:prog_ptr 編程和擦除操作的地址*/
/* prog_data 寫入FLASH的數(shù)據(jù) */
/* 返回: FALSE 操作失敗 */
/* TRUE 操作成功 */
/*******************************************************************/
int poll_data(int * prog_ptr, unsigned char prog_data)
{
unsigned char data;
int fail = FALSE;
do
{
data = (unsigned char) * prog_ptr;
if (data != prog_data) /* is D7 != Data? */
{
if ((data & 0x20) == 0x20) /*is D5 = 1 ? */
{
data = (unsigned char) * prog_ptr;
if (data != prog_data) /* is D7 = Data? */
fail = TRUE;
else
return TRUE; /* PASS */
}
}
else
return TRUE; /* PASS */
}while (!fail);
return FALSE; /* FAIL */
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -