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

📄 dsp6713.c

📁 c6713的源代码
💻 C
字号:
/* PLL  SDRAM  FLASH测试部分代码 */
#include "IMU_GW.h"

////////////////////////////////////////////////////
//read_flash()
//函数作用:读取flash地址 
//返回unsigned short(无符号短整型数)data
//参数unsigned int(无符号整型数)addr
//具体操作:把传过来的addr左移一位加上事先定义好的FLASH_BASE(0x90000000)
unsigned short read_flash(unsigned int addr)
{
    unsigned short data;
    //将FLASH_BASE+addr左移1位 的地址里面的值 赋给data
	data= *(unsigned short*)(FLASH_BASE+(addr<<1));
	return data;
}

////////////////////////////////////////////////////
//TestFlashID()
//测试Flash
unsigned char TestFlashID()
{
    unsigned short MfgId,DevId;
    unsigned short i;
    
    /* Configure to read manufacturer ID */
    //读厂商ID
    *((volatile unsigned short * ) FLASH_CTL555)= 0xaa;
    *((volatile unsigned short * ) FLASH_CTL2AA)= 0x55;
    *((volatile unsigned short * ) FLASH_CTL555)= 0x90;
    //延时
    for (i = 0; i < 10000; i++);
    
    /* Read IDs */
    MfgId = *((unsigned short *) FLASH_BASE);     
    DevId = *((unsigned short *)(FLASH_BASE + 2)); 

    /* Reset flash */
    //重启FLASH
    *((unsigned short *)FLASH_BASE) = 0xf0;

    /* Check IDs */
	//S29AL016D Device ID,Bottom Boot Block=2249;Top Boot Block=22C4 
    if ((MfgId != 0x01) || (DevId != 0x2249))
	{   
		//错误
    	return (0);
	}
    else
	{
		//否则正确
        return (1);
	}
}

////////////////////////////////////////////////////
//chip_erase()  //erase the whole chip
//清0
unsigned char chip_erase() 
{
	unsigned short data;
	//CE1 SPACE 16bit depth flash whole chip erase to 0xFFFF
	*((volatile unsigned short * ) FLASH_CTL555)= 0xaa;
    *((volatile unsigned short * ) FLASH_CTL2AA)= 0x55;
    *((volatile unsigned short * ) FLASH_CTL555)= 0x80;
    *((volatile unsigned short * ) FLASH_CTL555)= 0xaa;
    *((volatile unsigned short * ) FLASH_CTL2AA)= 0x55;
    *((volatile unsigned short * ) FLASH_CTL555)= 0x10;
    
	while(1)
	{
		data = *(unsigned short*)FLASH_BASE;
		if(data==0xffff)
		{
			return(1);
		}
		else 
		{
			//等价于 data &= 0x20;
			data=data & 0x20;//与0x20的与操作???
			if(data == 0x20)
			{
				data = *(unsigned short*)FLASH_BASE;
				if(data==0xffff)
				{
					return(1);
				}
				else
				{
					return(0);
				}
			}
		}
	}
}

////////////////////////////////////////////////////
//normal_program()  
//
unsigned char normal_program(unsigned short data,unsigned int addr)
{
	unsigned short datum;
    *((volatile unsigned short* ) FLASH_CTL555) = 0xaa;
    *((volatile unsigned short* ) FLASH_CTL2AA) = 0x55;
    *((volatile unsigned short* ) FLASH_CTL555) = 0xa0;
    *((volatile unsigned short* )(FLASH_BASE+(addr<<1))) = data;
          
	while(1)
	{
		datum = *(unsigned short*)(FLASH_BASE+(addr<<1));		
		if(datum==data)
		{
			return(1);
		}
		else 
		{
			datum=datum & 0x20;
			if(datum == 0x20)
			{
				datum = *(unsigned short*)FLASH_BASE;
				if(datum == data)
				{
					return(1);
				}
				else
				{
					return(0);
				}
			}
		}
	}
}

///////////////////////////////////////////////////
// flash_test()
//
void flash_test()
{
	//unsigned short  data;
	//unsigned int    i,j=0;
	
	if(TestFlashID()==1)
	{
		puts("TestFlashID OK!");
	}
	else	
	{
		puts("TestFlashID failed");
	}
	/*
	if(chip_erase()==1)
	{	
		puts("erased good!");
	}
	else	
	{
		puts("erased failed");
		return;
	}
	*/
	
	/*
	for(i=400;i<500;i++)
	{
		if(normal_program(i,i)==1)
		{
			j++;
		}	
		else
		{	
			puts("program failed");
		}
	}  
	
	if(j>=999)
	{
		puts("program test OK!");
	}
	*/
	/*
	for(i=0;i<1000;i++)
	{
		data = read_flash(i);
		if(data!=i)
		{
			 puts("read failed!");
		}
	}
	*/
}

///////////////////////////////////////////////////
// PllDelay()
//延时
void plldelay( int Count )
{
    volatile int i = Count;
    while(i--);
}

///////////////////////////////////////////////////
// pll_set()
void pll_set( )
{
	//PLL_CSR_IMU 的值并上~CSR_PLLEN
    *(volatile unsigned *)PLL_CSR_IMU  &= ~CSR_PLLEN;
    plldelay(20);

    // Reset the pll.  PLL takes 125ns to reset.    
    *(volatile unsigned *)PLL_CSR_IMU  |= CSR_PLLRST;
    plldelay(20);
    // 
    *(volatile unsigned *)PLL_DIV0_IMU  = DIV_ENABLE + 0;  // Div 1
    *(volatile unsigned *)PLL_MULT_IMU  = 8;               // x8=400

    *(volatile unsigned *)PLL_DIV3_IMU  = DIV_ENABLE + 3; // 100MHz EMIF (400/4)
    plldelay(20);

    *(volatile unsigned *)PLL_DIV2_IMU  = DIV_ENABLE + 3; // 100MHz Pheriherals ()
    plldelay(20);

    *(volatile unsigned *)PLL_DIV1_IMU  = DIV_ENABLE + 1; // 200 MHz CPU CLK (400/2)
    plldelay(20);
    
    *(volatile unsigned *)PLL_CSR_IMU  &= ~CSR_PLLRST;
    plldelay( 1500 );

    *(volatile unsigned *)PLL_CSR_IMU |= CSR_PLLEN;
    plldelay(20);
}


///////////////////////////////////////////////////
// sdram_test()
//初始化内存
void sdram_test(void)
{
	unsigned int i=0;
	unsigned short backdata;
	//循环往地址里写值
	for(i=0;i<1000000;i++)
	{
		*(unsigned short*)(SDRAM_ADDR+i*2)=0x1234+i;
		//读
		backdata=*(unsigned short*)(SDRAM_ADDR+i*2);
	}
	if(backdata==0){}
	puts("write to sdram over!!!");
}

⌨️ 快捷键说明

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