⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsk_flash.c

📁 该代码实现了 两次下载法在dspC6713平台上 烧写flash的操作过程
💻 C
字号:
/*****************************************************************************
* File name :  FLASH.c
* Description: Including Functions Supporting 8-bit Flash (AT29LV010A)
******************************************************************************/
#ifndef MASTER_FILE
#define C6711_GLOBALS
#include "includes.h"
#endif

#define PWD 0x12345678  

void delay_msec(int );
void flash_page_prog( unsigned int src_addr, unsigned int dst_addr, int page_size);

/*-------------------------------------------------------------------------*
* Function:   flash_prog() 
* Description: Any byte that is not loaded during the programming of its 
*              sector will be erased to read FFh.                                                                
*-------------------------------------------------------------------------*/
#pragma DATA_SECTION(host_buffer, "BUFFER")

  unsigned int host_buffer[33];
  unsigned int start_addr, prog_ptr, prog_flag, page_count, checksum, i;
  char *check_ptr;

void flash_prog()
{
  host_buffer[0] = PWD;          /* send flag, indicating dsp is ready  */
  
  while(host_buffer[0] != 0);    /* wait host acknowledge  */
  start_addr = host_buffer[1];   /* save start programming address */
  prog_ptr = start_addr;         /* initialize pointer value   */
  page_count = 0;                /* initialize programmed page counter */
  prog_flag = 1;                 /* set prog_flag */

  while(prog_flag)               /* loop of receiving host data & program flash */
  {
     while (host_buffer[0] == 0); /* wait to receive a host packet data */
	 if (host_buffer[0] == 1)     /* check if last packet */
	 { 
	   flash_page_prog((unsigned int)&host_buffer[1], prog_ptr, FLASH_WRITE_SIZE); /* prog a page of flash */
	   prog_ptr += FLASH_WRITE_SIZE;      /* update programming pointer */
	   page_count++;               /* increment the programmed page counter */
	   host_buffer[0] = 0;         /* send acknowledgement to host */  
	 }
	 else                          /* host_buffer[0] == 2 */
	 {
	   prog_flag = 0;
	   host_buffer[0] = 0;
	 }
  } 
   
  checksum = 0;                  /* initialize checksum */
  check_ptr = (char *)start_addr; 
  for (i = 0; i < page_count*FLASH_WRITE_SIZE; i++)
  {
	  checksum += *check_ptr++;
  }

  while ( host_buffer[0] == 0 );
  host_buffer[1] = checksum;
  host_buffer[0] = PWD;
}

void flash_page_prog( unsigned int src_addr, unsigned int dst_addr, int page_size)
{
  int i;
  char temp,temp1;
  char *flash_ptr = (char *)dst_addr;
  char *src_ptr = (char *)src_addr;

  *(char *)FLASH_ADR1 = FLASH_KEY1;/*FLASH_ADR1=0x90005555,FLASH_KEY1=0xAA*/
  *(char *)FLASH_ADR2 = FLASH_KEY2;/*FLASH_ADR2=0x90002AAA,FLASH_KEY2=0x55*/
  *(char *)FLASH_ADR1 = FLASH_KEY3;/*FLASH_KEY3=0xA0                      */
  for (i=0;i<page_size;i++) 
     *flash_ptr++ = *src_ptr++;
     
  temp = *--flash_ptr;
  temp1 = *--src_ptr;
  while ( temp != temp1)
  {
    temp = *flash_ptr;
  }
}

/*-------------------------------------------------------------------------*
* Function:   flash_erase() 
* Description: erase the whole flash                                                                
*-------------------------------------------------------------------------*/
void flash_erase()
{
  printf("Begin erase the Flash\n");
  *(char *)FLASH_ADR1 = FLASH_KEY1;/*FLASH_ADR1=0x90005555,FLASH_KEY1=0xAA*/
  *(char *)FLASH_ADR2 = FLASH_KEY2;/*FLASH_ADR2=0x90002AAA,FLASH_KEY2=0x55*/
  *(char *)FLASH_ADR1 = 0x80;
  *(char *)FLASH_ADR1 = 0xAA;
  *(char *)FLASH_ADR2 = 0x55;
  *(char *)FLASH_ADR1 = 0x10;
  delay_msec(10000);
}

/*-------------------------------------------------------------------------*
* Function:    flash_product_identify()
* Argument:    sel==0 return manufacture code 
*              sel==1 return device code 
* Description: Read the product identifier
*              Manufacture Code is 1F;Device Code is 35.                                                                
*-------------------------------------------------------------------------*/
int flash_product_identify(char sel)
{ 
 int code;
 printf("Flash manufactue code identify\n");
 /*Enter Product Identification Mode*/
  *(char *)FLASH_ADR1 = FLASH_KEY1;
  *(char *)FLASH_ADR2 = FLASH_KEY2;
  *(char *)FLASH_ADR1 = 0x90;
   delay_msec(20);
/*Read Manufacture Code*/
 if(sel==0)
  code=(*(char *)(FLASH_START));
/*Read Device Code*/ 
 else if(sel==1)
      code=(*(char *)(FLASH_START+0x01));
      else
      code=0;
/*Enter Product Identification Mode*/ 
 *(char *)FLASH_ADR1 = FLASH_KEY1;
 *(char *)FLASH_ADR2 = FLASH_KEY2;
 *(char *)FLASH_ADR1 = 0xF0;
 delay_msec(20);
 
 return code;
}

/*-------------------------------------------------------------------------*
* Function:   flash_bootlock_enable() 
* Description: Boot block lockout feature enable
*              sel==0  enable lower address boot block
*              sel==1  enable higher address boot block                                                               
*-------------------------------------------------------------------------*/
BOOLEAN flash_bootlock_enable(char sel)
{
 *(char *)FLASH_ADR1 = FLASH_KEY1;
 *(char *)FLASH_ADR2 = FLASH_KEY2;
 *(char *)FLASH_ADR1 = 0x80;
 *(char *)FLASH_ADR1 = FLASH_KEY1;
 *(char *)FLASH_ADR2 = FLASH_KEY2;
 *(char *)FLASH_ADR1 = 0x40;
 
 /*Lockout feature set on lower address boot block*/
 if(sel==0)
 {*(char *)(FLASH_START)=0x00; 
   delay_msec(20);
   return TRUE;
 }
 /*Lockout feature set on higher address boot block*/
 else if(sel==1)
      { *(char *)(FLASH_START+0x1FFFF)=0xFF;
        delay_msec(20);
        return TRUE;
      }
      else
       return ERROR; 
 
}

/*-------------------------------------------------------------------------*
* Function:   flash_bootblock_detect() 
* Description: sel==0  lower address boot block detect
*              sel==1  higher address boot block detect                                                                
*-------------------------------------------------------------------------*/
BOOLEAN flash_bootblock_detect(char sel)
{ 
  char block_lockout;
/*Enter Product Identification Mode*/
  *(char *)FLASH_ADR1 = FLASH_KEY1;
  *(char *)FLASH_ADR2 = FLASH_KEY2;
  *(char *)FLASH_ADR1 = 0x90;
  delay_msec(20);
  
/*Lower address boot block lockout detection*/
 if(sel==0)
  block_lockout=(*(char *)(FLASH_START+0x00002));
 /*Higher address boot block lockout detection*/ 
 if(sel==1)
  block_lockout=(*(char *)(FLASH_START+0x1FFF2));
         
/*Enter Product Identification Mode*/ 
 *(char *)FLASH_ADR1 = FLASH_KEY1;
 *(char *)FLASH_ADR2 = FLASH_KEY2;
 *(char *)FLASH_ADR1 = 0xF0;
  delay_msec(20);
 //return block_lockout;
 if(block_lockout==0xfffffffe) 
     return   0;             /*The corresponding block can be programmed  */
  else if(block_lockout==0xffffffff)
        return 1;             /*The corresponding block cannot be programmed*/
       else 
        return 10; 
}


/* END OF FILE */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -