网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> ADI DSP >> Blackfin >> 文章正文
  ADSP-21XX对FLASH编程的例子程序         ★★★ 【字体:
ADSP-21XX对FLASH编程的例子程序
作者:61IC    文章来源:本站原创    点击数:    更新时间:2006-9-29    
 

#include <Def2181.h>
#include "constant.h"

.global FLASH_ByteWrite;
.global FLASH_ByteRead;
.global FLASH_Erase;
.global BDMA_BootLoader;

.GLOBAL BDMA_Addr_Hi;
.GLOBAL BDMA_Addr_Lo;
.GLOBAL BDMA_ControlMask;
.GLOBAL BDMA_ReadControlMask;
.GLOBAL    FLASH_XferWord;
.GLOBAL    BDMA_XferLength;

.section/data seg_data1;
.GLOBAL    BDMA_XferSpace;
.VAR/CIRC BDMA_XferSpace[0x0800];    { 2048 16 bit locations }

.VAR BDMA_Addr_Hi;
.VAR BDMA_Addr_Lo;
.VAR BDMA_ReadControlMask = 0x0001;
.VAR BDMA_ControlMask = 0x0001;    {16 bit DM load from BM run during BDMA}
.VAR FLASH_XferWord;
.VAR BDMA_XferLength;
.VAR BDMA_Ready = 1; {1=transfer complete, 0=transfer incomplete}
.VAR BDMA_TempStorage;



.section/pm seg_code;
FLASH_ByteRead:
    { set the BMWAIT value to 7 }
    AR = 0xFFFF;
    dm(Prog_Flag_Comp_Sel_Ctrl) = AR;

    AR = 0xFFFF;
    DM(0x3FFE) = AR;    { CHANGE WAIT STATE TO MAX WAITS }
    NOP;
    imask = 0x0008;
    ena ints;

    { send 0x00XX to address 0xXXXXXX }
    ar = FLASH_XferWord;
    dm(BDMA_Internal_Address) = ar;
    
    ar = dm(BDMA_Addr_Lo);
    dm(BDMA_External_Address) = ar;

    { mask off the top 8 bits }
    ar = DM(BDMA_Control);
    Ay0 = 0x00FF;
    ar = ar and ay0;
    DM(BDMA_Control) = AR;
    
    ar = dm(BDMA_Addr_Hi);
    /* ay0 = 0x0003; */
    ay0 = dm(BDMA_ReadControlMask);
    SE = 8;
    SR = LSHIFT AR(LO);
    AR = SR0;
    ar = ar or ay0;
    dm(BDMA_Control) = ar;

    ar = 0x0001;
    dm(BDMA_Word_Count) = ar;
    idle;
    
    imask = 0x001;
    ena ints;

rts;

{******************************************************************************
*  FLASH_ByteWrite
*
*  REGISTER USAGE SUMMARY:
*  input  : none
*  update : none
*  output : none
*  destroy:
*  keep   : none
*  memory : none
*  calls  : none
*
******************************************************************************}
.section/pm seg_code;
FLASH_ByteWrite:
    { set the BMWAIT value to 7 }
    AR = 0xFFFF;
    dm(Prog_Flag_Comp_Sel_Ctrl) = AR;

    AR = 0xFFFF;
    DM(0x3FFE) = AR;    { CHANGE WAIT STATE TO MAX WAITS }
    NOP;

    imask = 0x0008;
    ena ints;

    { save the transfer word }
    ax0 = dm(FLASH_XferWord);
    
    { send 0x00AA to address 0x5555}
{    ar = FLASH_00AA;
    dm(FLASH_XferWord) = ar;
    ar = FLASH_XferWord;
    dm(BDMA_Internal_Address) = ar;
    
    ar = FLASH_5555_LO;
    dm(BDMA_External_Address) = ar;
    
    ar = FLASH_5555_HI;
    dm(BDMA_Control) = ar;
    
    ar = 0x0001;
    dm(BDMA_Word_Count) = ar;
    idle; }
    
    {send 0x0055 to address 0x2AAA}
{    ar = FLASH_0055;
    dm(FLASH_XferWord) = ar;
    ar = FLASH_XferWord;
    dm(BDMA_Internal_Address) = ar;
    
    ar = FLASH_2AAA_LO;
    dm(BDMA_External_Address) = ar;
    
    ar = FLASH_2AAA_HI;
    dm(BDMA_Control) = ar;
    
    ar = 0x0001;
    dm(BDMA_Word_Count) = ar;
    idle; }
    
    { send 0x00AA to address 0x5555 }
    { send 0x0055 to addresss 0x2AAA }
    call FLASH_Begin555_AA_2AAA_55;

    {send 0x00A0 to address 0x5555}
    ar = FLASH_00A0;
    dm(FLASH_XferWord) = ar;
    ar = FLASH_XferWord;
    dm(BDMA_Internal_Address) = ar;
    
    ar = FLASH_5555_LO;
    dm(BDMA_External_Address) = ar;
    
    ar = FLASH_5555_HI;
    dm(BDMA_Control) = ar;
    
    ar = 0x0001;
    dm(BDMA_Word_Count) = ar;
    idle;
    
    
    { send 0x00XX to address 0xXXXXXX }
    dm(FLASH_XferWord) = ax0;
    ar = FLASH_XferWord;
    dm(BDMA_Internal_Address) = ar;
    
    ar = dm(BDMA_Addr_Lo);
    dm(BDMA_External_Address) = ar;
    
    ar = dm(BDMA_Addr_Hi);
    ay0 = 0x0007;
    SE = 8;
    SR = LSHIFT AR (LO);
    AR = SR0;
    ar = ar or ay0;
    dm(BDMA_Control) = ar;
    
    ar = 0x0001;
    dm(BDMA_Word_Count) = ar;
    idle;
    
    cntr = 0x00FF;
    do FLASH_CommandWrite0 until ce;
        nop;
        cntr = 0x00FF;
        do FLASH_CommandWrite1 until ce;
            nop;
            nop;
        FLASH_CommandWrite1: nop;
        nop;
    FLASH_CommandWrite0: nop;
    
    imask = 0x001;
    ena ints;
rts;





{******************************************************************************
*  BDMA_Resolve
*
*  REGISTER USAGE SUMMARY:
*  input  : none
*  update : none
*  output : none
*  destroy: AX0, AY0, AR
*  keep   : none
*  memory : none
*  calls  : none
*
******************************************************************************}
.section/pm seg_code;
FLASH_Erase:
    { set the BMWAIT value to 7 }
    AR = 0xFFFF;
    dm(Prog_Flag_Comp_Sel_Ctrl) = AR;

    AR = 0xFFFF;
    DM(0x3FFE) = AR;    { CHANGE WAIT STATE TO MAX WAITS }
    NOP;
    imask = 0x0008;
    ena ints;

    { send 0x00AA to address 0x5555}
{    ar = FLASH_00AA;
    dm(FLASH_XferWord) = ar;
    ar = FLASH_XferWord;
    dm(BDMA_Internal_Address) = ar;
    
    ar = FLASH_5555_LO;
    dm(BDMA_External_Address) = ar;
    
    ar = FLASH_5555_HI;
    dm(BDMA_Control) = ar;
    
    ar = 0x0001;
    dm(BDMA_Word_Count) = ar;
    idle; }
    
    {send 0x0055 to address 0x2AAA}
{    ar = FLASH_0055;
    dm(FLASH_XferWord) = ar;
    ar = FLASH_XferWord;
    dm(BDMA_Internal_Address) = ar;
    
    ar = FLASH_2AAA_LO;
    dm(BDMA_External_Address) = ar;
    
    ar = FLASH_2AAA_HI;
    dm(BDMA_Control) = ar;
    
    ar = 0x0001;
    dm(BDMA_Word_Count) = ar;
    idle;}
    
    { send 0x00AA to address 0x5555 }
    { send 0x0055 to addresss 0x2AAA }
    call FLASH_Begin555_AA_2AAA_55;

    {send 0x0080 to address 0x5555}
    ar = 0x0080;
    dm(FLASH_XferWord) = ar;
    ar = FLASH_XferWord;
    dm(BDMA_Internal_Address) = ar;
    
    ar = FLASH_5555_LO;
    dm(BDMA_External_Address) = ar;
    
    ar = FLASH_5555_HI;
    dm(BDMA_Control) = ar;
    
    ar = 0x0001;
    dm(BDMA_Word_Count) = ar;
    idle;

    
    { send 0x00AA to address 0x5555 }
{    ar = FLASH_00AA;
    dm(FLASH_XferWord) = ar;
    ar = FLASH_XferWord;
    dm(BDMA_Internal_Address) = ar;
    
    ar = FLASH_5555_LO;
    dm(BDMA_External_Address) = ar;
    
    ar = FLASH_5555_HI;
    dm(BDMA_Control) = ar;
    
    ar = 0x0001;
    dm(BDMA_Word_Count) = ar;
    idle; }
    

    {send 0x0055 to address 0x2AAA}
{    ar = FLASH_0055;
    dm(FLASH_XferWord) = ar;
    ar = FLASH_XferWord;
    dm(BDMA_Internal_Address) = ar;
    
    ar = FLASH_2AAA_LO;
    dm(BDMA_External_Address) = ar;
    
    ar = FLASH_2AAA_HI;
    dm(BDMA_Control) = ar;
    
    ar = 0x0001;
    dm(BDMA_Word_Count) = ar;
    idle; }

    { send 0x00AA to address 0x5555 }
    { send 0x0055 to addresss 0x2AAA }
    call FLASH_Begin555_AA_2AAA_55;


    { send 0x0010 to address 0x5555}
    ar = 0x0010;
    dm(FLASH_XferWord) = ar;
    ar = FLASH_XferWord;
    dm(BDMA_Internal_Address) = ar;
    
    ar = FLASH_5555_LO;
    dm(BDMA_External_Address) = ar;
    
    ar = FLASH_5555_HI;
    dm(BDMA_Control) = ar;
    
    ar = 0x0001;
    dm(BDMA_Word_Count) = ar;
    idle;

    { about 10 seconds of delay here }
    cntr = 0x3FFF;
    do FLASH_EraseDelay0 until ce;
        nop;
        cntr = 0x2FFF;
        do FLASH_EraseDelay1 until ce;
            nop;
            nop;
        FLASH_EraseDelay1: nop;
        nop;
    FLASH_EraseDelay0: nop;


    imask = 0x001;
    ena ints;



rts;
    


{******************************************************************************
*  BDMA_BootLoader:
*
*  REGISTER USAGE SUMMARY:
*  input  : none
*  update : none
*  output : none
*  destroy: ALL
*  keep   : none
*  memory : none
*  calls  : none
*
******************************************************************************}
.section/pm seg_code;
BDMA_BootLoader:
    { enter not pressed start BDMA load }
    { by loading 32 words starting from 0x0400 }
    { the begining of the unprotected flash space }
    { if the EZ-KIT is default from the factory...}
    { there will be a monitor program located here }
    { if the user has overwritten it, there will be a }
    { user program located here. }
    
    { disable all interrupts }
    IMASK = 0x0000;
    
    { clear all pending interrupts }
    IFC = 0x00FF;
    
    AR = 0xFFFF;
    DM(0x3FFE) = AR;    { CHANGE WAIT STATE TO MAX WAITS }
    NOP;
    
    { set BWCOUNT to 32 }
    { BDIR, BMPAGE, BEAD, BIAD, BTYPE = 0 }
    { BCR = 1 }
    { BMWAIT = 7 }
    
    ax0 = 0x0000;
    dm(BDMA_Internal_Address)         = ax0;    { load to PM 0x000000 }
    
    ax0 = 0x0000;
    dm(BDMA_External_Address)         = ax0;    { load from 0x01000  holds bits 0 - 13 }
    
    {ax0 = 0x0100;}
    {ax0 = b#0000010001000;}
    
    ax0 = b#0000000100001000;
    dm(BDMA_Control)    = ax0;    { load from 0x04000  upper byte is bits 14 - 21 }
    
    { set the BMWAIT value to 7 }
    ax0 = 0xFFFF;
    dm(Prog_Flag_Comp_Sel_Ctrl) = ax0;

    { load BDMA count which will start the transfer }
    ax0 = 32;
    dm(BDMA_Word_Count)    = ax0;

    {enable BDMA interrupt }
    IMASK = 0x008;
    nop;
    idle;
    nop;            {should never get this far }
                
    jump 0x000000;        {jump and start executing the loader }
rts;

.global BDMA_DoIt;
.section/pm seg_code;
BDMA_DoIt:
    dm(BDMA_Internal_Address)     = ar;
    dm(BDMA_External_Address)     = ax1;
    dm(BDMA_Control)             = ay0;
    dm(BDMA_Word_Count)         = ay1;
    idle;  
rts;

.global FLASH_Begin555_AA_2AAA_55;
.section/pm seg_code;
FLASH_Begin555_AA_2AAA_55:
    { send 0x00AA to address 0x5555}
    ar = FLASH_00AA;
    dm(FLASH_XferWord) = ar;
    ar = FLASH_XferWord;
    ax1 = FLASH_5555_LO;
    ay0 = FLASH_5555_HI;
    ay1 = 0x0001;
    call BDMA_DoIt;

    {send 0x0055 to address 0x2AAA}
    ar = FLASH_0055;
    dm(FLASH_XferWord) = ar;
    ar = FLASH_XferWord;
    ax1 = FLASH_2AAA_LO;
    ay0 = FLASH_2AAA_HI;
    ay1 = 0x0001;
    call BDMA_DoIt;
rts;

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

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    嵌入式C语言开发ADSP21XX系列…
    ADSP-21535 Blackfin的Mem D…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号