📄 dsp6713.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 + -