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

📄 flash.c

📁 dsp 5509 通过EMIF口实现从FLASH的二次启动功能。
💻 C
字号:
#include "flash.h"
#include <csl_mcbsp.h>
#include <csl_gpio.h>


Uint16 BlockWr[128];


void SPIclk(Uint16 ClkPhase)
{
	int i;
	if(ClkPhase==0)
    	MCBSP_FSET(PCR0,CLKXP,0);
	else
    	MCBSP_FSET(PCR0,CLKXP,1);
    for(i = 0; i < 100; i++);
}


void SPItx(Uint16 TxPhase)
{
	if(TxPhase==0)
    	MCBSP_FSET(PCR0,DXSTAT,0);
	else
    	MCBSP_FSET(PCR0,DXSTAT,1);
}


Uint16 SPIrx(void)
{
	Uint16 RxTmp;

	RxTmp=MCBSP_FGET(PCR0,DRSTAT);
	return(RxTmp);
}


void SPIcs(Uint16 IO4Phase)
{
	int i;
	if(IO4Phase==0)
    	GPIO_FSET(IODATA,IO4D,0);
	else
    	GPIO_FSET(IODATA,IO4D,1);
	for(i = 0; i < 100; i++);    	
}


Uint16 sRd1Byte(void)
{
	Uint16 i,RdDatTemp, j;
	Uint16 Rdbit;

	RdDatTemp=0x00;
	for(i=0;i<8;i++)
	{
		SPIclk(0);
		SPIclk(1);
		
		Rdbit=SPIrx();
		RdDatTemp<<=1; 
		if(Rdbit==1)
			RdDatTemp|=0x01;
		else
			RdDatTemp&=0xfe;
	}

	return(RdDatTemp);   
}


void sWr1Byte(Uint16 WrDatP)
{
	Uint16 WrDatPTmp,i, j;

	WrDatPTmp=WrDatP;

	for(i=0;i<8;i++)
	{
		WrDatPTmp&=0x80;

		if(WrDatPTmp==0x80)
			SPItx(1);
		else
			SPItx(0);
		
		SPIclk(0);
		SPIclk(1);

		
		WrDatP<<=1;
		WrDatPTmp=WrDatP;
	} 
}


void sWr1Word(Uint16 WrDatP)
{
	Uint16 WrDatPTmp,i, j;
	
	WrDatPTmp = WrDatP;
	
	for(i = 0; i < 16; i++)
	{
		WrDatPTmp &= 0x8000;
		
		if(WrDatPTmp == 0x8000)
			SPItx(1);
        else
			SPItx(0);
		
		SPIclk(0);
		SPIclk(1);
		
		WrDatP<<=1;
		WrDatPTmp=WrDatP;
	} 
}


void FlashWrEn(void)
{
	SPIcs(1);
	SPIcs(0);
	sWr1Byte(0x06);
	SPIcs(1);
}


/* read status register, return value of register */
Uint16 FlashRdReg(void)
{
    Uint16 RdTemp;

	SPIcs(1);
	SPIcs(0);

	sWr1Byte(0x05);
	RdTemp=sRd1Byte();
	SPIcs(1);	 

	return(RdTemp);
}




/* read status register and wait for write ending */
void ChkWIP(void)
{
	while(FlashRdReg() & 0x01 == 0x01);
}


/* read 1 byte according to address RdAddr */
Uint16 FlashRd(Uint32 RdAddr)
{
	Uint16  Tmp;
	Uint16 WrDatTmp;
	Uint16 RdDatTmp;

	SPIcs(1);
	SPIcs(0);

	sWr1Byte(0x03);

	WrDatTmp = (RdAddr >> 16) & 0x00FF;
	sWr1Byte(WrDatTmp);
	WrDatTmp = (RdAddr >> 8) & 0x00FF;
	sWr1Byte(WrDatTmp);			
	WrDatTmp = RdAddr & 0x00FF;
	sWr1Byte(WrDatTmp);			

	RdDatTmp=sRd1Byte();
	SPIcs(1);
	ChkWIP();
	
	return(RdDatTmp);
}       


/* write 1 page (256 bytes) */
void FlashWr(Uint32 WrAddr)
{
	Uint16	WrDatTmp;
	Uint16	i,j;
	
	FlashWrEn();
	SPIcs(1);
	SPIcs(0);
	
	/* write instruction opcode */
	sWr1Byte(0x02);				
	
	/* write page start address(24bit) */
	WrDatTmp = (WrAddr >> 16) & 0x00FF;
	sWr1Byte(WrDatTmp);			
	WrDatTmp = (WrAddr >> 8) & 0x00FF;
	sWr1Byte(WrDatTmp);			
	WrDatTmp = WrAddr & 0x00FF;
	sWr1Byte(WrDatTmp);			

    /* write one page */
	for(i = 0; i < 128;i++)
	{
		WrDatTmp = BlockWr[i]; 
		sWr1Word(WrDatTmp);
	}
	
	SPIcs(1);
	ChkWIP();
} 


void EraseChip()
{
	FlashWrEn();
	SPIcs(1);
	SPIcs(0);
	
	/* write instruction opcode */
	sWr1Byte(0xC7);				

	SPIcs(1);
	ChkWIP();
}

void FlashWrReg(Uint16 RegP)
{
	FlashWrEn();
	SPIcs(1);
	SPIcs(0);

	sWr1Byte(0x01);
	sWr1Byte(RegP);
	SPIcs(1);
}

⌨️ 快捷键说明

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