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

📄 flash.c

📁 用LPC213X处理器对AT45DB161的操作程序
💻 C
📖 第 1 页 / 共 2 页
字号:
 *出口:无
 *功能:从Flash中读给定个数的数据入缓冲。
 */
void ShiftOutData(uint8 *Data, uint16 Len)
{
	while(Len--)
	{  
		*Data=SPI_SendData(*Data);
		Data++;
	}	
}


/*
 *函数性质:私有
 *入口:无
 *出口:整合后的地址值
 *功能:整合页地址与页内偏移地址。
 */
uint32 CombPageAndOffect(uint16 PageAddr, uint16 OffectInPage)
{
	uint32 i;
	i = PageAddr;
	i <<= 10;							//页地址左移10位
	i &= 0xfffffc00;
	i |= OffectInPage;				//整合偏移量
	return i;	
}

/*
 *函数性质:私有
 *入口:无
 *出口:无
 *功能:按SPI的时序启动SPI
 */
void StartSPI(void)
{	
    IO0SET = SCK0;
	IO0CLR = SSEL0;

}



/*
 *函数性质:私有
 *入口:无
 *无口:无
 *功能:停止SPI操作。
 */
void StopSPI(void)
{
	IO0SET = SSEL0;
	IO0SET = SCK0;
}




/*
 *函数性质:公共
 *入口:Flash页地址PageAddr,Flash页内的偏移量OffectInPage, 储存读入的数据缓冲Data,需要读入的数据长度Len
 *出口:无
 *功能:从Flash阵列中连续读数据,并将读得的数据存入到Data中。
 */
void ContinueReadFlash(uint16 PageAddr, uint16 OffectInPage, uint8 *Data, uint16 Len)
{
	uint32 i;
	StartSPI();
	i = CombPageAndOffect(PageAddr, OffectInPage);

	SPI_SendData(CON_ARRAY_READ);
	SPI_SendData((uint8)(i>>16));
	SPI_SendData((uint8)(i>>8));
	SPI_SendData((uint8)i);
	ShiftInData(Data, 4);									//移入4个不相关的字节
		
	ShiftOutData(Data,Len);								//读数据。
	StopSPI();												//停止SPI操作。	
}


/*
 *函数性质:公共
 *入口:Flash页地址PageAddr,Flash页内的偏移量OffectInPage, 储存读入的数据缓冲Data,需要读入的数据长度Len
 *出口:无
 *功能:从Flash阵列中以页方式读数据,并将读得的数据存入到Data中。当读到一个页的尾部时,
 *下一次读出的数据为页的起始数据。
 */
void PageReadFlash(uint16 PageAddr, uint16 OffectInPage, uint8 *Data, uint16 Len)
{
	uint32 i;
	StartSPI();   
	i = CombPageAndOffect(PageAddr, OffectInPage);

	SPI_SendData(MEM_PAGE_READ);
	SPI_SendData((uint8)(i>>16));
	SPI_SendData((uint8)(i>>8));
	SPI_SendData((uint8)i);
	ShiftInData(Data, 4);									//移入4个不相关的字节
	ShiftOutData(Data,Len);								//读数据。
	StopSPI();												//停止SPI操作。		
}

/*
 *函数性质:公共
 *入口:Buffer号BufNum,Buffer内的偏移量OffectInPage, 储存读入的数据缓冲Data,需要读入的数据长度Len
 *出口:无
 *功能:从给定的Flash缓冲中读数据,读得的数据存放到Data中。当读到缓冲的尾部时,再次读出将会读到缓冲的头部。
 */
void ReadFlashBuff(uint8 BufNum, uint16 OffectInPage, uint8 *Data, uint16 Len)
{  
	StartSPI();
	SPI_SendData(BufNum);
	SPI_SendData(BufNum);							//移入一个不相关字节
	SPI_SendData((uint8)(OffectInPage>>8));
	SPI_SendData((uint8)OffectInPage);
	SPI_SendData((uint8)OffectInPage);				//移入一个不相关字节
	ShiftOutData(Data,Len);								//读数据。
	StopSPI();												//停止SPI操作。		
}


/*
 *函数性质:公共
 *入口:无
 *出口:状态寄存器的值
 *功能:读Flash的状态寄存器值。
 */
uint8 ReadFlashStuReg(void)
{
	uint8 i;
	StartSPI();
	SPI_SendData(STU_REG_READ);
	ShiftOutData(&i,1);										//读取状态寄存器的值。
	StopSPI();												//停止SPI操作。		
	return i;
}


/*
 *函数性质:公共
 *入口:Buffer号ucBufNum,Buffer内的偏移量OffectInPage, 储存写入的数据缓冲Data,需要写入的数据长度Len
 *出口:无
 *功能:往给定的Flash缓冲写数据,待写入的数据存放在Data中,当写到缓冲的尾部时,再次写入将会写入到缓冲的头部。
 */
void WriteFlashBuff(uint8 BufNum, uint16 OffectInPage, uint8 *Data, uint16 Len)
{
	StartSPI();
	SPI_SendData(BufNum);
	SPI_SendData(BufNum);							//移入一个不相关字节
	SPI_SendData((uint8)(OffectInPage>>8));
	SPI_SendData((uint8)OffectInPage);
	ShiftInData(Data,Len);								//写数据。
	StopSPI();												//停止SPI操作。			
}





/*
 *函数性质:公共
 *入口:Buffer号BufNum,Flash的页地址FlashPageAddr
 *出口:无
 *功能:往给定编号的Buffer数据写入到给定的Flash页,并使用内置擦除器。
 */
void WriteBuffToFlash(uint8 BufNum, uint16 FlashPageAddr)
{
	StartSPI();
	SPI_SendData(BufNum);
	SPI_SendData((uint8)(FlashPageAddr>>6));
	SPI_SendData((uint8)(FlashPageAddr<<2));
	SPI_SendData(BufNum);						//写入一个不相关字节。
	StopSPI();	
}


/*
 *函数性质:公共
 *入口:Buffer号BufNum,Flash的页地址FlashPageAddr
 *出口:无
 *功能:往给定编号的Buffer数据写入到给定的Flash页,不使用内置擦除器。
 */
void WriteBuffToFlashWithNoErase(uint8 BufNum, uint16 FlashPageAddr)
{   
	StartSPI();
	SPI_SendData(BufNum);
	SPI_SendData((uint8)(FlashPageAddr>>6));
	SPI_SendData((uint8)(FlashPageAddr<<2));
	SPI_SendData(BufNum);						//写入一个不相关字节。
	StopSPI();	
}


/*
 *函数性质:公共
 *入口:页地址FlashPageAddr
 *出口:无
 *功能:页擦除Flash
 */
void FlashPageErase(uint16 FlashPageAddr)
{
	StartSPI();
	SPI_SendData(PAGE_ERASE);
	SPI_SendData((uint8)(FlashPageAddr>>6));
	SPI_SendData((uint8)(FlashPageAddr<<2));
	SPI_SendData(PAGE_ERASE);						//写入一个不相关字节。
	StopSPI();		
}

/*
 *函数性质:公共
 *入口:Flash块地址FlashBlockAddr
 *出口:无
 *功能:块擦除Flash
 */
void FlashBlockErase(uint16 FlashBlockAddr)
{
	StartSPI();
	SPI_SendData(BLOCK_ERASE);
	SPI_SendData((uint8)(FlashBlockAddr>>3));
	SPI_SendData((uint8)(FlashBlockAddr<<5));
	SPI_SendData(BLOCK_ERASE);						//写入一个不相关字节。
	StopSPI();	
}

/*
 *函数性质:公共
 *入口:Buffer编号BufNum,Flash页地址PageAddr,Flash页内的偏移量OffectInPage,
 * 待写入的数据缓冲Data,需要写入的数据长度Len
 *出口:无
 *功能:本函数整合写缓冲和缓冲数据写入存储器功能,先将数据写入到给定的缓冲中,写入缓冲的偏移量
 *由uiOffectInPage确定。如果写入的数据超出缓冲的范围,则自动回绕到缓冲的头部。在写缓冲完成后,
 *将芯片的片选置高,则开始缓冲的数据到存储器传送。在整个写入未完成时,状态寄存器中的忙信号有效。
 */
void WriteFlashWithBuff(uint8 BufNum, uint16 PageAddr, uint16 OffectInPage, uint8 *Data, uint16 Len)
{
	uint32 i;
	
	StartSPI();
	i = CombPageAndOffect(PageAddr, OffectInPage);

	SPI_SendData(BufNum);
	SPI_SendData((uint8)(i>>16));
	SPI_SendData((uint8)(i>>8));
	SPI_SendData((uint8)i);
	ShiftInData(Data, Len);								//写入数据
	
	StopSPI();												//停止SPI操作。	
	
}

/*
 *函数性质:公共
 *入口:Buffer编号BufNum,  Flash的页地址FlashPageAddr
 *出口:无
 *功能:从主存储器中给定页地址读数据到给定的缓冲
 */
void ReadFlashToBuff(uint8 BufNum, uint16 FlashPageAddr)
{
	StartSPI();
	SPI_SendData(BufNum);
	SPI_SendData((uint8)(FlashPageAddr>>6));
	SPI_SendData((uint8)(FlashPageAddr<<2));
	SPI_SendData(BufNum);						//写入一个不相关字节。
	StopSPI();	
}

/*
 *函数性质:公共
 *入口:Buffer编号BufNum,  Flash的页地址FlashPageAddr
 *出口:无
 *功能:比较给定的缓冲与存储器中对应页的数据。如果相等,则状态寄存器中相应的位清零,否则置位,
 *在比较过程中,忙标志有效。
 */
void CompFlashAndBuff(uint8 BufNum, uint16 FlashPageAddr)
{   
	StartSPI();
	SPI_SendData(BufNum);
	SPI_SendData((uint8)(FlashPageAddr>>6));
	SPI_SendData((uint8)(FlashPageAddr<<2));
	SPI_SendData(BufNum);						//写入一个不相关字节。
	StopSPI();		
}

/*
 *函数性质:公共
 *入口:Buffer编号BufNum,Flash页地址PageAddr,Flash页内的偏移量OffectInPage,
 * 待写入的数据缓冲Data,需要写入的数据长度Len
 *出口:无
 *功能:自动读出给定页地址的Flash数据到给定的Buffer中,并在修改完缓冲中的数据后,自动重写入到
 *相应的存储器中。在写入过程中,状态寄存器中忙标志有效。
 */
void AutoReWriteFlash(uint8 BufNum, uint16 FlashPageAddr, uint16 OffectInPage, uint8 *Data, uint16 Len)
{   
    StartSPI();
	SPI_SendData(BufNum);
	SPI_SendData((uint8)(FlashPageAddr>>6));
	SPI_SendData((uint8)(FlashPageAddr<<2));
	SPI_SendData(BufNum);						//写入一个不相关字节。	
	WriteFlashBuff(BufNum, OffectInPage, Data, Len);
	StopSPI();
}


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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